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();
}
MY Note
2012년 1월 31일 화요일
2011년 9월 4일 일요일
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.Driverclass viaClass.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
PreparedStatementthat is associated with aPooledConnectionhas been closed or the driver determines is invalid
2011년 9월 1일 목요일
pivot / unpivot query
http://it.toolbox.com/blogs/db2luw/pivot-query-12757
http://it.toolbox.com/blogs/db2luw/unpivot-query-12798
CREATE TABLE Sales (Year INT, Quarter INT, Results INT)
http://it.toolbox.com/blogs/db2luw/unpivot-query-12798
CREATE TABLE Sales (Year INT, Quarter INT, Results INT)
YEAR QUARTER RESULTS
----------- ----------- -----------
2004 1 20
2004 2 30
2004 3 15
2004 4 10
2005 1 18
2005 2 40
2005 3 12
2005 4 27
SELECT Year,
MAX(CASE WHEN Quarter = 1
THEN Results END) AS Q1,
MAX(CASE WHEN Quarter = 2
THEN Results END) AS Q2,
MAX(CASE WHEN Quarter = 3
THEN Results END) AS Q3,
MAX(CASE WHEN Quarter = 4
THEN Results END) AS Q4 FROM Sales GROUP BY YearYEAR Q1 Q2 Q3 Q4----------- ----------- ----------- ----------- -----------2004 20 30 15 102005 18 40 12 27CREATE TABLE SalesAgg ( year INTEGER, q1 INTEGER, q2 INTEGER, q3 INTEGER, q4 INTEGER );YEAR Q1 Q2 Q3 Q4----------- ----------- ----------- ----------- -----------2004 20 30 15 102005 18 40 12 27SELECT S.Year, Q.Quarter, Q.ResultsFROM SalesAgg AS S,TABLE (VALUES(1, S.q1), (2, S.q2), (3, S.q3), (4, S.q4)) AS Q(Quarter, Results);YEAR QUARTER RESULTS----------- ----------- -----------2004 1 202004 2 302004 3 152004 4 102005 1 182005 2 402005 3 122005 4 27
2011년 8월 31일 수요일
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);
}
}
}
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
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월 11일 목요일
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번 항목을 체크 할 것
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번 항목을 체크 할 것
피드 구독하기:
게시물 (Atom)