레이블이 Java인 게시물을 표시합니다. 모든 게시물 표시
레이블이 Java인 게시물을 표시합니다. 모든 게시물 표시

2013년 11월 7일 목요일

byte[] 를 String으로 변환 할 때 마지막 글자가 ?로 될 때

한글은 두바이트 글자이므로 byte로 변환을 하면  0보다 작은 같이 된다. 
따라서 변환전에  마지막  byte 부터 0보다 작은 값의 수가 짝이 맞는지 검사 하여 변환 길이 값을 조절 하면 된다. 

int cnt=0;
for( int i=len-1; i >= 0 ; i-- ){
if( b[i] < 0 ) cnt++;
else break;
}
if( cnt % 2 == 0)
str = new String( b, 0, len, "euc-kr"); // 짝이 맞으면 길이대로 변환 
else

str = new String( b, 0, len-1, "euc-kr"); // 짝이 맞지 않으면 마지막 byte는 버린다. 


* 변환된  string의 마지막 char가 ? 인지 검사하는 방법은 무슨 이유인지 동작하지 않음.

str.charAt( str.length() - 1 ) == '?' ==> false 
str.substring( str.length() - 1).equals("?") ==> false 

--------
테스트 코드 ( Java 1.6으로 테스트 함 )
--------
public class EncTest {

public static void main(String[] args) throws Exception{
String str = "한글테스트;";
byte[] b = str.getBytes("euc-kr");
System.out.println(b.length);
printByte( b );
for( int len = 10; len > 7 ; len--){
int cnt=0;
for( int i=len-1; i >= 0 ; i-- ){
if( b[i] < 0 ) cnt++;
else break;
}
if( cnt % 2 == 0)
str = new String( b, 0, len, "euc-kr");
else
str = new String( b, 0, len-1, "euc-kr");
System.out.println(str.length()+":"+str+":"+str.getBytes().length);
printByte(str.getBytes() );
}

}

private static void printByte( byte[] data ){
int i=0;
for( byte b : data){
System.out.printf("%d : %d %x; ",i++,b,b);
}
System.out.println();
}
}

2013년 7월 23일 화요일

Websphere Application Srever 8.5 에 JDK 7 설치 하기

참고 : http://pic.dhe.ibm.com/infocenter/wasinfo/v8r5/index.jsp?topic=%2Fcom.ibm.websphere.installation.base.doc%2Fae%2Ftins_installation_jdk7.html

IBM Installation Manager를 통해서 설치 한다.
  1. 저장소에 아래 URL을 추가 한다.  
    http://www.ibm.com/software/repositorymanager/com.ibm.websphere.IBMJAVA.v70 
  2. 설치를 선택한다.
  3. 기존패키지를 WAS 8.5 선택, 해당 SDK 버전을 설치 한다. 
  4. managesdk를 이용하여 sdk 버전을 변경 한다. 
> managesdk -listAvailable
CWSDK1003I: 사용 가능한 SDK:
CWSDK1005I: SDK 이름: 1.6_64
CWSDK1005I: SDK 이름: 1.7_64


> managesdk  -enableProfileAll -sdkName 1.7_64
CWSDK1017I: AppSrv01 프로파일에서 이제 SDK 1.7_64을(를) 사용할 수 있습니다.
CWSDK1017I:
AppSrv02 프로파일에서 이제 SDK 1.7_64을(를) 사용할 수 있습니다.
CWSDK1001I: 요청된 managesdk 태스크를 수행했습니다.


※ WAS 시작로그에 아래처럼 Java version이 1.7.0으로 나오면 성공 !!!

************ Start Display Current Environment ************
WebSphere [IBMJAVA7 7.0.4.1 gm1318.03]Platform 8.5.5.0 [BASE 8.5.5.0 gm1319.01] running with process name kr900963Node02Cell\kr900963Node02\server1 and process id 36744
Host Operating System is Windows 7, version 6.1
Java version = 1.7.0, Java Compiler = j9jit26, Java VM name = IBM J9 VM

2013년 4월 19일 금요일

WebSphere 서버이름 가져오기

jar : WebSphere/AppServer/plugins/com.ibm.ws.runtime.jar

class : com.ibm.websphere.runtime.ServerName

api

ServerName.getFullName() - cell , node 이름이 포함된 전체 이름
ServerName.getDisplayName() - cell , node 이름은 제외된 서버 이름
ServerName.getjsabpref() - z/WAS 인 경우 servant ID ( job id )

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년 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();
 }

2011년 9월 5일 월요일

JDBC 4.0 Driver 자동 로딩 사용하기


META-INF/services/java.sql.Driver 파일을 만든다. 

파일의 내용에 driver 클래스 이름을 적어 준다. 

ex) com.ibm.db2.jcc.DB2Driver

 

java.sql and javax.sql Features Introduced in the JDBC 4.0 API

  • auto java.sql.Driver discovery -- no longer need to load a java.sql.Driver class via Class.forName
  • National Character Set support added
  • Support added for the SQL:2003 XML data type
  • SQLException enhancements -- Added support for cause chaining; New SQLExceptions added for common SQLState class value codes
  • Enhanced Blob/Clob functionality -- Support provided to create and free a Blob/Clob instance as well as additional methods added to improve accessiblity
  • Support added for accessing a SQL ROWID
  • Support added to allow a JDBC application to access an instance of a JDBC resource that has been wrapped by a vendor, usually in an application server or connection pooling environment.
  • Availability to be notfied when a PreparedStatement that is associated with a PooledConnection has been closed or the driver determines is invalid

2011년 9월 1일 목요일

WebSphere v7, 설치된 J2EE 어플리케이션 확인하기

    MBeanFactory mf =AdminServiceFactory.getMBeanFactory();
    MBeanServer server = mf.getMBeanServer();

    ObjectName obj = new ObjectName("WebSphere:type=J2EEApplication,*");
    Set<ObjectInstance> mbeans = server.queryMBeans(obj, null);

    if(mbeans!=null ) {
        Iterator<ObjectInstance> itr = mbeans.iterator();
        while(itr.hasNext()) {
            ObjectInstance objInstance =  itr.next();

            if(objInstance!=null && objInstance.getObjectName()!=null) {
                String beanName = objInstance.getObjectName().getKeyProperty("name");

                System.out.println(beanName);
            }
        }
    }

WebSphere MBean list ( 목록 ) 확인 하기

MBeanFactory mf =AdminServiceFactory.getMBeanFactory();
List mbeanlist = mf.getMBeanTypes();
for( Object mbean : mbeanlist ){
System.out.println( mbean );
}

ConfigRepository
JVM
StatusCache
AdminOperations
J2EEDomain
ConfigService
RemoteCommandMgr
AntAgent
AppManagement
J2EEAppDeployment
DataSourceCfgHelper
NotificationService
JMXConnector
WebServer
PluginCfgGenerator
FileBrowser
Perf
PerfPrivate
SystemMetrics
TivoliPerfEngine
TivoliPerfAdvisor
ThreadPool
TargetTreeMbean
WMQConnectivityTester
ObjectPoolManager
SIBMain
PmiRmJmxService
ApplicationManager
CompositionUnitManager
Server
TraceService
RasLoggingService
SSLAdmin
DiagnosticService
ORB
HAManager
BulletinBoard
WLMAppServer
NameServer
EndpointCentralManager
TransportChannelService
SIBMQResourceDiscovery
WMQQueueDefiner
WMQInfo
WebServicesSecurityAdmin
WebServicesSecurityAlgorithmHelper
WASSchedulerCfgHelper
SecurityAdmin
FileTransferServer
TransactionService
Transaction
JMSProvider
J2CResourceAdapter
JDBCProvider
DataSource
JDBCDriver
DynaCache
WebServicesService
SdoRepository
SecurityTokenServiceAdmin
CacheableTokenMBean
ExtensionRegistryService
EJBContainer
WebcontainerDiagnosticProvider
J2EEApplication
Application
EJBModule
ObjectPool
WebContainer
PolicySetManager
SessionManager
WebModule
Servlet
Portlet
PortletApplication
AB_AlarmManager
JMSBasicFunction
JMSAdministration
ServerRuleDriverMBean
AdvisorNotificationMBean
StatelessSessionBean
JSP
CommandAssistance

2011년 8월 12일 금요일

MvsJobSubmitter 이용하여 z/WAS 에서 배치 Job JCL submit 하는 방법

 z/WAS에서 배치 Job JCL을 submit하기 위해서 다음의 사항을 먼저 체크한다.



1. z/WAS의 프로세스를 실행하는 user가 JCL이 실행되는 환경에 대한 권한이 있는지
   파일을 읽고 쓰기 위해서는 해당 데이터 셋을 읽고 쓸 수 있어야 한다.

2. submitJob , jobStatus REXX  script가 ascii 모드가 아닌지 확인 한다.
   MvsJobSubmitter는 submitJob과 jobStatus REXX script파일을 실행해서  JCL을 submit 하고 status 를 체크한다. 따라서 submitJob과 jobStatus 파일을 OMVS환경에서 봤을 때 실행가능하고 ascii 파일이 아니어야 실행할 수 있다.
   OMVS 환경에서 vi로 파일을 봤을때 정상적으로 보여야 한다. 만약 viascii로 봤을 때 내용이 보인다면 파일을 변경해야 한다. ( vi 로 새 파일을 열고 viascii에서 또는 window시스템에서 복사한 내용을 붙여 넣는 방법도 있음 )

3. jzos.script.path 환경 변수 확인
   submitJob과 jobStatus를 실행하기 위해서 해당 파일의 위치를 이 환경변수에서 찾는다.
   JZOS 압축을 풀어 놓은 곳에 sample까지 지정하면 된다. ex) /usr/lpp/jzos/sample



z/WAS에서 테스트하기 위해서는 약간의 수정이 필요 하다. MvsJobSubmitter.java를 열고 수정한다.



copyFile(), getInternalReaderWriter() 을 JSP에서 사용할 수 있도록 public 으로 변경한다.

 JSP에 job submit 하는 method를 만든다.
<%!
 MvsJob submitJob( String jclName ) throws IOException {
    MvsJobSubmitter submitter = new MvsJobSubmitter();

    submitter.copyFile( jclName, submitter.getInternalReaderWriter() );

    return submitter.submitJob();
}
%>

JSP에서 다음처럼 호출하여 job을 submit 한다.

<%
MvsJob job = submitJob("//'DATA.SET.NM(MEMBER)'");
%>


※ 이 외에 FTP를 이용하여 원격으로 job submit을 할 수도 있다. ( IBM readbook 참조 )
※ Job status를 가져오는 것은 에러가 있으나 job이 정상적으로 submit 되는 경우를 확인 함.
※ JCL file read에 문제가 있는 경우 1번항목의 권을 체크 할 것
※ JCL은 읽었으나 REXX syntax에러가 발생하는 경우 2번 항목을 체크 할 것
※ submitJob REXX script를 찾자 못하는 경우 3번 항목을 체크 할 것


2010년 5월 28일 금요일

JDK logger 초기화

LogManager logMgr = LogManager.getLogManager();
URL configURL = getClass().getResource("/config/JDKLog.properties");
InputStream ins;
           try {
               ins = configURL.openStream();
               if( ins != null )
                   logMgr.readConfiguration(ins);
               else
                   logger.log( Level.WARNING, "Failed to open JDKLog.properties");
           } catch (IOException e) {
               // TODO 자동 생성된 catch 블록
               e.printStackTrace();
           }

---------------------JDKLog.properties-------------------
handlers=java.util.logging.ConsoleHandler
java.util.logging.ConsoleHandler.level=ALL
.level=FINEST

2009년 8월 28일 금요일

Resource Injection using Annotation - Java EE5

In web application.

 

      Container-managed object에만 사용할 수 있다.

            - container가 생성을 관리할 수 있어야 injection을 할 수있기 때문.

            - 따라서 일반 Javabean에서는 사용할 수 없다. 그러나 JavaServer Faces에서 사용하는 bean에는 사용할 수 있다.

 

      Resource injection JSP에 사용할 수 없다.

            - Resource Injection을 위한 annotaion deployment time에 적용되기 때문에 JSP에서는 사용할 수 없다.

 

Table 3-1 Web Components That Accept Resource Injections

Component

Interface/Class

Servlets

javax.servlet.Servlet

Servlet Filters

javax.servlet.ServletFilter

Event Listeners

javax.servlet.ServletContextListener

javax.servlet.ServletContextAttributeListener

javax.servlet.ServletRequestListener

javax.servlet.ServletRequestAttributeListener

javax.servlet.http.HttpSessionListener

javax.servlet.http.HttpSessionAttributeListener

Taglib Listeners

Same as above

Taglib Tag Handlers

javax.servlet.jsp.tagext.JspTag

Managed Beans

Plain Old Java Objects

 

Declaring Resource References

 

@Resource annotation deployment descriptor 내의 resource-ref element와 동일하다.

 

@Resource javax.sql.DataSource catalogDS;

public getProductsByCategory() {

// get a connection and execute the query

Connection conn = catalogDS.getConnection();

..

}

 

@Resources ({
    @Resource (name="myDB" type=java.sql.DataSource),
    @Resource(name="myMQ" type=javax.jms.ConnectionFactory)
})

 

 

Declaring a Reference to a Web Service

The @WebServiceRef annotation provides a reference to a web service. The following example shows uses the @WebServiceRef annotation to declare a reference to a web service. WebServiceRef uses the wsdlLocation element to specify the URI of the deployed services WSDL file:

...
import javax.xml.ws.WebServiceRef;
...
public class ResponseServlet extends HTTPServlet {
@WebServiceRef(wsdlLocation=
    "http://localhost:8080/helloservice/hello?wsdl")
static HelloService service;

JSP EL(expression language)에서 사용하는 객체들

The JSP expression language defines a set of implicit objects:

■ pageContext: The context for the JSP page. Provides access to various objects including:
■ servletContext: The context for the JSP page’s servlet and any web components contained in the same application. See “Accessing the Web Context” on page 124.
■ session: The session object for the client. See “Maintaining Client State” on page 125.
■ request: The request triggering the execution of the JSP page. See “Getting Information from Requests” on page 110.
■ response: The response returned by the JSP page. See “Constructing Responses” on page 112.
■ In addition, several implicit objects are available that allow easy access to the following objects:
■ param:Maps a request parameter name to a single value
■ paramValues:Maps a request parameter name to an array of values
■ header:Maps a request header name to a single value
■ headerValues:Maps a request header name to an array of values
■ cookie:Maps a cookie name to a single cookie
■ initParam:Maps a context initialization parameter name to a single value
■ Finally, there are objects that allow access to the various scoped variables described in “Using Scope Objects” on page 105.
■ pageScope:Maps page-scoped variable names to their values
■ requestScope:Maps request-scoped variable names to their values
■ sessionScope:Maps session-scoped variable names to their values
■ applicationScope:Maps application-scoped variable names to their values

DB2에서 CODESET을 지정하여 새로운 DB만들기

db2 create db mywiki  USING CODESET UTF-8 TERRITORY KR

Windows에서 기본 설정으로 만들면 CODEPAGE와 CODESET이 1363으로 지정되어 JDBC 연결 사용시 UnsupportedEncodingException : Cp1363C 에러가 발생함.

DB2 BLOB 처리방법

저장 방법
ByteArrayOutputStream과 OjbectInputStream을 이용하여
저장하고자 하는 내용( 자바 객체 )를 byte array로 serialize한다. ( writeObject )사용
변환된 byte array를 DB2LobFactory를 이용하여 create 한다.

ByteArrayOutputStream bo = new ByteArrayOutputStream(2048);
ObjectOutputStream oo = new ObjectOutputStream(bo);
oo.writeObject(msg.getArgs());
stmt.setBlob(++index, DB2LobFactory.createBlob( bo.toByteArray() ));
oo.close();
bo.close();


조회 방법

동일한 sql문을 사용하여 조회 후 ResultSet의 getBlob을 이용하여 꺼낸다음.
ByteArrayInputStream과 ObjectInputStream을 이용하여 Object로 변환 후 원하는 객체로 캐스팅 한다.

Blob blob =  rset.getBlob(++index);
//System.out.println(rset.getInt(1)+"blob : "+blob );
if( blob != null ){
// System.out.println(blob.getBytes(1L,(int)blob.length()));
ByteArrayInputStream bin = new ByteArrayInputStream( blob.getBytes(1L,(int)blob.length()) );
ObjectInputStream oin = new ObjectInputStream( bin );
Object[] args = (Object[])oin.readObject();
for( int i=0; args!=null &&  i < args.length; i++ ){
if( args[i] == null ) continue;
out.println(args[i].getClass().getName()+":");out.println( args[i] ); out.println("<br>");
}
oin.close();
bin.close();
}