뭐 오래전에 quartz를 한번 사용해봤었고.. 나름 편한듯 싶어.. 이번 프로젝트에서도 요넘을 사용하고자 프로토타입을 제작중.. 짜증나는 문제(??) 가 발생함..

Spring + quartz 를 사용하는데.. 요넘들을 같이 사용하면 어플 구동할때 처음에 무조건 실행하게 만드는게 쉽지 않음.. 뭐 다른 방법이 있는데 내가 찾지를 못하는 건지.. 찾다 귀찮아서 그냥 하나 제작함.

뭐.. 다행인건.. Job class 를 구동하는데.. 특별한 parameter가 필요하지 않기 때문에 좀더 쉽게 끝난듯..

MethodInvokingJobDetailFactoryBean.java
package com.quartz;

import java.lang.reflect.Method;

import org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean;

/**
 * 스케쥴러를 돌리고 싶고.. 무조건 어플이 처음 구동할 때.. 한번은 돌아줘야 하고..
 * 뭐 이런 경우가 가끔 생길지도 모른다.
 * 이럴때 도통 방법을 모르것더라.. 그래서 그냥 MethodInvokingJobDetailFactoryBean 이넘 상속받아서 하나 맹갔다.
 * 스프링 설정시 <property name="fisrtStart"><value>true</value></property> 만 넣어주면 됨.
 *
 * @author 배명훈
 *
 */
public class CtmMethodInvokingJobDetailFactoryBean extends MethodInvokingJobDetailFactoryBean {

    public void setFisrtStart(boolean fisrtStart) {
       
        if(fisrtStart) {
       
            try {
                // spring di로 삽입한 job object
                Class dymClass     = getTargetObject().getClass();            
                Method[] methods = dymClass.getMethods();
               
                for(int i = 0;i<methods.length;i++) {
                    String methodName = methods[i].getName();
                   
                    // spring di로 삽입한 target method를 찾자.
                    if(methodName.equals(getTargetMethod())) {
                        methods[i].invoke(getTargetObject(), null);
                    }
                }
            } catch (Exception e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }  
    }
}

Spring 설정파일
<bean id="weatherProcMethodInvokingJobDetail"
        class="com.quartz.CtmMethodInvokingJobDetailFactoryBean">
        <property name="targetObject"><ref bean="weatherProc"/></property>
        <property name="targetMethod"><value>execute</value></property>
        <property name="concurrent"><value>false</value></property>
        <property name="fisrtStart"><value>true</value></property>
</bean>

스프링 설정 파일을 보면 알것지만.. MethodInvokingJobDetailFactoryBean 을 사용하는 것과 차이점은
firstStart 설정하는 것 밖에 없음..

ps.
    java reflection 은 정말 유용한 기술인듯..
Posted by 짱가쟁이
Connection refused(DESCRIPTION=(TMP=)(VSNNUM=169869568)(ERR=12519)(ERROR_STACK=(ERROR=(CODE=12519)(EMFI=4)))

갑자기 위와 같은 오류가 발생되더라.. 뭐 특이한 점을 발견하지 못했었는데.. 커넥션을 사용하지 못한다고 하는거 보니께.. 아마 커넥션을 무쟈게 열고 닫고 하다가 일시적으로 못가져온듯 싶더라.

자.. 그러면 어떻게 해결하느냐?? maxIdle 보다 maxActive가더 크니께.. 풀에서 계속 커넥션을 생성하고 닫고 하는 문제가 발생된듯 싶음..

ora.maxActive=10
ora.maxIdle = 10

위와 같은 동일한 개수를 맞춰주니께.. 같은 문제는 발생되지 않음.

'framework > ibatis' 카테고리의 다른 글

[Mybtis] - log interceptor  (0) 2014.10.24
[ibatis] - resultMap 초기화 문제  (1) 2010.06.25
Posted by 짱가쟁이
select floor(실수) from table

Posted by 짱가쟁이
2010. 7. 6. 00:05
Eample
select * from table where REPLACE(tel,'-','') = '029022352'

select REPLACE(tel,'-','') from table where tel = '02-902-2352'

전화번호 데이터가 '-' 구분자를 사용하는데... 클라이언트는 '-' 구분자 없이 검색을 하고 싶다고 하네.. 이때 사용하면 유용하다.

다른 좋은 방법이 있으면 누가 좀 알려주면 좋으련만.. 쩌ㅃ~
Posted by 짱가쟁이
2010. 7. 5. 14:25
흠. 가끔 Object를 파라미터로 넘길 때 각 필드값에 Null 이 들어가면 안될 경우가 생간다. 매번 object.setField("") 이런식으로 값을 초기화 시키기 귀찮으면 java refection 기능을 응용해서 작업해도 좋을 듯 싶다.

replaceNull()
- object의 선언된 필드만 가지고 와서 Null 값을 체크한다. 값에 null 이 있으면 "" 로 초기화 한다.
public static void replaceNull(Object obj) throws Exception {
        try {
            Class dymClass      = obj.getClass();
            Field[] fields            = dymClass.getDeclaredFields();
           
            for(int i = 0;i<fields.length;i++) {
                String methodName = "get" + fields[i].getName().substring(0, 1).toUpperCase() + fields[i].getName().substring(1, fields[i].getName().length());               
                Method method       = obj.getClass().getMethod(methodName, null);
                String value       = (String)(method.invoke(obj, null) + "");
                if("null".equals(value)) {
                    value = "";
                    String setMethodName = "set" + fields[i].getName().substring(0, 1).toUpperCase() + fields[i].getName().substring(1, fields[i].getName().length());
                    Method setMethod       = obj.getClass().getMethod(setMethodName, new Class[]{String.class});
                    setMethod.invoke(obj, new Object[]{value});
                }
            }
        } catch (Exception e) {
            // TODO Auto-generated catch block
            throw e;
        }       
    }


'java > util' 카테고리의 다른 글

[InputStream] - String to InputStream  (1) 2010.10.13
[util] - byte to hex string  (0) 2010.09.07
[java] - File readLine  (2) 2010.07.01
[java] - File read  (0) 2010.07.01
[java] - byte array to image  (0) 2010.06.30
Posted by 짱가쟁이
JSON (JavaScript Object Notation)
- 가벼운 데이터 변환 포멧

Sample data
{"result":"success", "value":"0", "list":[...]}


Simple Code
import org.codehaus.jettison.json.JSONObject;
import org.apache.cxf.helpers.IOUtils;

JSONObject json = new JSONObject(IOUtils.toString(in));
System.out.println(json.getString("result"));
System.out.println(json.getString("value"));

List Code
JSONObject jsonObject = new JSONObject(IOUtils.toString(in));
JSONArray jsonArray = jsonObject .getJSONArray("list");

for(int i = 0 ; i < jsonArray .length() ; i++){
    JSONObject listJson= jsonArray .getJSONObject(i);
    System.out.println(listJson.getString("result"));
    System.out.println(listJson.getString("value"));
}



Posted by 짱가쟁이
2010. 7. 1. 13:31
파일에서 한줄씩 읽어서 String array 로 반환하자.
/**
 * 파일 한줄씩 읽기
 * 
 * @param file
 * @return
 * @throws IOException
 */
public static String[] readLine(File file) throws IOException {

    BufferedReader reader     = null;
    String[] result         = null;
    
    try {
        reader     = new BufferedReader(new FileReader(file));
        List<String> list         = new ArrayList<String>();

        // while(reader.read() != -1) { 첫번째 케릭터를 읽고 무시하니 line을 제대로 읽지 못함.
        while(reader.ready()) { // 변경
            String content = reader.readLine();
            
            if(content != null && !"".equals(content.trim())) {
                list.add(content);
            }
        }
        
        if(list.size() > 0) {
            result = new String[list.size()];
            for(int i = 0;i<list.size();i++) {
                result[i] = list.get(i);
            }
        }
    } catch(IOException ioe) {
        throw ioe;
    } finally {
        if(reader != null) reader.close();
    }

    return result;
}

위에 저넘을 사용하려다 문제가 발생함.. 파일을 읽을 때 얖에 2byte 빼고 데이터를 가져오더라.. 이유는 찾아보기 귀찮고 일은 바쁘고.. 그냥 새로 맹갔다.
댓글 남겨주신 GG님의 의견을 반영했습니다. 도움 감솨드립니다 ^^


/**
     * 파일 한줄씩 읽기
     *
     * @param file
     * @return
     * @throws IOException
     */
    public static String[] readLine1(File file) throws IOException {

        FileInputStream fstream = null;
        DataInputStream in        = null;
        BufferedReader br         = null;
       
        String[] result               = null;
       
        try {
            fstream = new FileInputStream(file);
            in = new DataInputStream(fstream);
            br = new BufferedReader(new InputStreamReader(in));
           
            List<String> list         = new ArrayList<String>();
           
            String strLine;
           
            while ((strLine = br.readLine()) != null)   {
                if(strLine != null && !"".equals(strLine.trim())) {
                    list.add(strLine);
                }
            }

            if(list.size() > 0) {
                result = new String[list.size()];
                for(int i = 0;i<list.size();i++) {
                    result[i] = list.get(i);
                }
            }
                       
        } catch(IOException ioe) {
            throw ioe;
        } finally {
            if(br != null) br.close();
            if(in != null) in.close();
            if(fstream != null) fstream.close();
        }

        return result;
    }

고민하기 싫은데. 대체 뭔 차이여.. 누가 설명좀 해주면 안될까?? 쩌ㅃ~



'java > util' 카테고리의 다른 글

[util] - byte to hex string  (0) 2010.09.07
[java] - replaceNull  (0) 2010.07.05
[java] - File read  (0) 2010.07.01
[java] - byte array to image  (0) 2010.06.30
[java] - 소수점 자르기 (duble type)  (0) 2010.06.30
Posted by 짱가쟁이
2010. 7. 1. 13:05
요넘 파일 가지고 놀때는 항상 API를 뒤적이더라.. 다른 넘들은 재사용을 잘하면서 요넘들은 뭐가 문제일까?

파일 전체를 문자열로 읽는 함수
/**
     * 파일 전체 읽기
     *
     * @param file
     * @return
     * @throws IOException
     */
    public static String read(File file) throws IOException {
       
        FileInputStream fis     = null;
        byte[]             buffer     = null;
       
        try {
            fis     = new FileInputStream(file);
            buffer     = new byte[fis.available()];       
            fis.read(buffer, 0, fis.available());
        } catch(IOException e) {
            throw e;
        } finally {
            if(fis != null) fis.close();
        }
       
        return new String(buffer);
    }

'java > util' 카테고리의 다른 글

[java] - replaceNull  (0) 2010.07.05
[java] - File readLine  (2) 2010.07.01
[java] - byte array to image  (0) 2010.06.30
[java] - 소수점 자르기 (duble type)  (0) 2010.06.30
[java] - base54 String decode  (0) 2010.06.30
Posted by 짱가쟁이
데이터 규약(data contract) 작성을 위해서 사용되는 XSD 추론도구중 하나로 웹 서비스를 개발할때나 XML을 가지고 놀때 사용하면 좋음.

사용방법
java -jar trang.jar EvaluateHandRequest.xml, EvaluateHandResponse.xml PokerType.xsd

Posted by 짱가쟁이
2010. 6. 30. 14:27
자바로 UI를 개발하면 기존에 사용하던 윈도우 포맷과 틀려서 거부감이 들때가 있었다. 뭐 그래서 SWT를 찾아 공부도 하고했지만.. look and feel 이라는 넘이 존재하더라.. 이넘 언제부터 나온건지 모름..

기본적으로 윈도우 포맷에 맞춰서 보여주는 코드..

Example
try {
// Set cross-platform Java L&F (also called "Metal")
    UIManager.setLookAndFeel(
        UIManager.getSystemLookAndFeelClassName());
}
catch (UnsupportedLookAndFeelException e) {
   // handle exception
}
catch (ClassNotFoundException e) {
   // handle exception
}
catch (InstantiationException e) {
   // handle exception
}
catch (IllegalAccessException e) {
   // handle exception
}


Posted by 짱가쟁이