2012년 8월 10일 금요일

Eclipse 4.2에 RTC 4.0 설치 하기

RTC 4.0은 eclipse 3.x 를 기반으로 하기 때문에 IBM install manager로는 설치 되지 않는다.

참조 :
http://pic.dhe.ibm.com/infocenter/clmhelp/v4r0/topic/com.ibm.jazz.install.doc/topics/t_client_installation_p2.html


  1. p2 설치를 위해 RTC의 p2 설치 zip 파일을 다운 받는다. 
  2. eclipse의 help -> Install New Software 
  3. Add
  4. Archive 선택. p2 zip 파일을 지정 하고 설치 한다.

2012년 7월 27일 금요일

JDBC type 2 WAS Multiple Row Fetch 옵션 설정 - JDBC Tuning

http://www.ibm.com/developerworks/data/library/techarticle/dm-0909rowsetdb2zos/index.html

WAS에서 사용하는 DB어플리케이션은 JDBC를 사용한다. 그런데...

WAS의 Data source는 DB2 JDBC Driver에서 제공하는 클래스를 어플리케이션에게 return하지 않고, wrapping된 클래스를 return하므로  아니기 때문에 sample code처럼 data source에 직접 설정할 수 없다. 그렇다고 WAS에 보여지는 기본 data source property 에도 사용할 수 있는 property가 없다.

그러므로 WAS의 data source 사용자 정의 특성에 추가 별도로 추가 해 주어야 한다.

데이터 소스 > my data source > 사용자 정의 특성

새로작성

    이름 : enableRowsetSupport
        값 : 1
     유형 : java.lang.Integer


    이름 : fetchSize
        값 : 100
     유형 : java.lang.Integer

fetchSize는 해당 데이터 소스를 사용하는 모든 sql에 적용되므로 개별적으로 적용을 하고자 할 경우엔 프로그램에서 setFetchSize()를 사용해서 statement에 지정해야 한다. 

※ enableRowsetSupport 를 disable 할 경우엔 값을 2를 사용한다.

2012년 7월 2일 월요일

우분투 12.04 업그레이드 후 network ( eth0 ) 이 동작 하지 않음.

배포판 업그레이드 후 리부팅 까지 완벽하게 되었으나
네트워크 연결이 되지 않음.

ifconfig로 확인해 보니 eth0 가 보이지 않았으며
dmesg 상으로는 정상적으로 인식한 걸로 보임.

/etc/network/interfaces 파일에 보니 loopback만 잡혀 있음.

auto lo
iface lo inet loopback
post-up /usr/bin/sendmail.pl

그래서 eth0를 추가함.

auto eth0
iface eth0 inet dhcp
그리고 networking을 재 시작 함.
/etc/init.d/networking stop
/etc/init.d/networking start
ifconfig로 eth0가 올라오고 ip가 할당된 것을 확인 함. ^^



2012년 6월 14일 목요일

JAX-RPC 와 JAX-WS 동시에 사용하기

동시에 여러개의 WebService를 호출하는 경우, 또한 서비스간 데이터를 주고 받아야 하는 겨우 Java로 메소드 호출 하듯이 A 서비스에서 가져온 결과를 B 서비스의 호출 인자로 넘겨 주고 싶은 경우가 있다.

아마도 BPM에서 backend의 여러 시스템에서 제공하는 서비스를 조합하고자 하는 경우 이런 일들이 발생할 텐데, IBM BPM 에서 테스트 해본 결과
  • JAX-RPC 는 package 구조로 xsd의 namespace를 생성한다. 
  • JAX-WS는 서비스의 package 구조로 xsd의 namespace를 생성한다. 
  • JAX-WS는 parameter를 wrapping한 데이터 구조를 더 생성한다. 
 namespace가 일치 하지 않으면 xsd로부터 만들어지는 Business Object는 호환이 되지 않는다.

따라서 JAX-WS로 생성할 parameter object에 annotation으로 namespace를 지정해 주면 동일한 namespace의 xsd를 생성할 수 있다.

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "Customer", namespace = "http://bo.demo.bizhub.ibm.com")
public class Customer {

    long customerId;
...


2012년 1월 31일 화요일

Java 1.5 이상에서 ProcessBuilder를 이용해서 외부 프로그램 호출하기

Java 1.5부터 Runtime.exec()를 대신할 ProcessBuilder가 생겼다.

WAS에서 배치 프로그램을 시작할 수도 있고,
다른 시스템 프로그램을 호출 할 수도 있다.

아래 코드는  main() 메소드를 가지고 있는 자바 클래스를 실행하는 코드다.
실행 명령은 기존의 Runtime.exec와 다르게 명령행을 내용을 한 줄로 만드는 것이 아니라
space로 구분되는 내용을 각각의 문자열로 지정해야 한다.
아래 ProcessBuilder의 내용은 "java test.Callee a b=b c" 이렇게 명령행을 입력 하는 경우이다.
 // 각각의 command line argument까지 개별 항목으로 지정해야 한다.
 ProcessBuilder pb = new ProcessBuilder("java","test.Callee","a", "b=b" ,"c");
 Map env = pb.environment();
 // -classpath옵션은 ProcessBuilder에 직접 지정할 수 없다.
 // shell script를 만들때 처럼 환경 변수 CLASSPATH로 클래스 path를 지정한다.
 env.put("CLASSPATH", "C:/workspace/Test/bin");
 pb.directory(new File("C:/workspace/Test")); // 로그 파일이 생기는 기본 위치
 File log = new File("log"); // 로그 파일명
 pb.redirectErrorStream(true); // 에러도 로그에 출력되게 설정
  // redirectOutput과 Redirect는 java se 7 에서 추가된 내용 임. 
 pb.redirectOutput(Redirect.appendTo(log)); // System.out이 이 파일에 쓰여진다.
 Process p = pb.start(); // 프로그램을 실행한다.

위의 코드는 프로그램을 실행하고 바로 return 되는 코드다.

프로그램을 실행하고 끝날때 까지 기다리기를 원하면 p.waitFor();를 호출 한다.
이런 경우는 아래처럼 별도의 로그 파일을 쓰지 않고 직접 출력 할 수도 있다.

  ProcessBuilder pb = new ProcessBuilder("java","test.Callee","a", "b=b" ,"c");
  Map env = pb.environment();
  env.put("CLASSPATH", "C:/workspace/android/Test/bin");
  Process p = pb.start();
  p.waitFor();

  InputStream i = p.getInputStream();
  byte b[] = new byte[8192];
  int read=0;
  while( (read = i.read(b)) > 0 ){
   System.out.println("out : "+new String(b,0,read));
  }
  i= p.getErrorStream();
  while( (read = i.read(b)) > 0 ){
   System.out.println("err : "+new String(b,0,read));
  }
  System.out.printf("exit value : %s\n",p.exitValue()); // 0 이면 정상종료

간혹 명령이 잘못 되면 pb.start()에서 에러가 발생하기도 한다. 헌데, windows에서는 exception의 메시지에 포함된 한글이 깨지기도 한다. 이런경우 encoding값을 직접 지정하여 한글 메시지를 확인 하는 것이 도움이 된다. 또는 로그파일을 쓰면 된다.

 try {
  ProcessBuilder pb = new ProcessBuilder("java","test.Callee","a", "b=b" ,"c");
  Map env = pb.environment();
  env.put("CLASSPATH", "C:/workspace/android/Test/bin");
  Process p = pb.start();
  p.waitFor();
  InputStream i = p.getInputStream();
  byte b[] = new byte[8192];
  int read=0;
  while( (read = i.read(b)) > 0 ){
   System.out.println("out : "+new String(b,0,read));
  }
  i= p.getErrorStream();
  while( (read = i.read(b)) > 0 ){
   System.out.println("err : "+new String(b,0,read));
  }
  System.out.printf("exit value : %s\n",p.exitValue());
 } catch (IOException e) {
  try {
   System.out.println(
          new String( e.getMessage().getBytes("8859_1"), "euc-kr"));
  } catch (UnsupportedEncodingException e1) {
    e1.printStackTrace();
  }
  e.printStackTrace();
 } catch (InterruptedException e) {
  e.printStackTrace();
 }