2013년 11월 7일 목요일
byte[] 를 String으로 변환 할 때 마지막 글자가 ?로 될 때
2013년 7월 23일 화요일
Websphere Application Srever 8.5 에 JDK 7 설치 하기
IBM Installation Manager를 통해서 설치 한다.
- 저장소에 아래 URL을 추가 한다.
http://www.ibm.com/software/repositorymanager/com.ibm.websphere.IBMJAVA.v70 설치를 선택한다.기존패키지를 WAS 8.5 선택, 해당 SDK 버전을 설치 한다.managesdk를 이용하여 sdk 버전을 변경 한다.
> managesdk -listAvailable
CWSDK1003I: 사용 가능한 SDK:
CWSDK1005I: SDK 이름: 1.6_64
CWSDK1005I: SDK 이름: 1.7_64
> managesdk -enableProfileAll -sdkName 1.7_64CWSDK1017I: 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 서버이름 가져오기
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
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
2012년 6월 14일 목요일
JAX-RPC 와 JAX-WS 동시에 사용하기
아마도 BPM에서 backend의 여러 시스템에서 제공하는 서비스를 조합하고자 하는 경우 이런 일들이 발생할 텐데, IBM BPM 에서 테스트 해본 결과
- JAX-RPC 는 package 구조로 xsd의 namespace를 생성한다.
- JAX-WS는 서비스의 package 구조로 xsd의 namespace를 생성한다.
- JAX-WS는 parameter를 wrapping한 데이터 구조를 더 생성한다.
따라서 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를 이용해서 외부 프로그램 호출하기
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.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일 목요일
WebSphere v7, 설치된 J2EE 어플리케이션 확인하기
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 ( 목록 ) 확인 하기
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 하는 방법
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 초기화
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();
}
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 service’s WSDL file:
...
import javax.xml.ws.WebServiceRef;
...
public class ResponseServlet extends HTTPServlet {
@WebServiceRef(wsdlLocation=
"http://localhost:8080/helloservice/hello?wsdl")
static HelloService service;