Ejb를 공통으로 호출하고 캐쉬하는 라이브러리를 만들어 봤습니다.
Weblogic 기반에서 제작했으며 SessionBean만을 구현했으며 여러가지 참조 소스를 이용해서 만들었습니다.
도움이 되시길 바랍니다.
크게 화일을 보면
BaseSessionBean.java
EjbCache.java
EjbCacheHdr.java
EjbProxyHdr.java
JNDIHdr.java
로 구성되어 있습니다. 오늘 부터 하나 하나 설명할 작정입니다.
부족한게 많더라도 이해 바랍니다.
질문이나 기타 사항은 일절 받지 않습니다. 이해 바랍니다.
그럼 먼저 JNDIHdr.java를 만들어 보도록 하겠습니다.
주로 메소드위주의 JavaDoc 형태의 주석으로 설명을 대신합니다.
아래의 소스는 간단하게 말하면 EJBHome Interface를 얻어오기 위한 Class 입니다.
import javax.ejb.*;
import javax.naming.*;
import java.rmi.RemoteException;
import java.util.*;
import weblogic.common.*; // <== 웹로직 공통함수와 Jndi를 import 합니다.
import weblogic.jndi.*;
public class JNDIHdr {
private static JNDIHdr m_instance = null;
public JNDIHdr() {
}
public static void init() throws Exception {
m_instance = new JNDIHdr();
}
/**
* JNDIHdr Instance를 리턴
* @return JNDIHdr
*/
public static JNDIHdr getInstance() {
if( m_instance == null ) m_instance = new JNDIHdr();
return m_instance;
}
/**
* Weblogic JNDI API를 사용하여 EJBHome인터페이스를 얻는다.
* @param jndiName EJB의 JNDI Alias name
* @return EJBHome EJB의 홈인터페이스
* @exception java.lang.Exception
*/
public static EJBHome getHome(String jndiName) throws Exception {
return getHome(null, jndiName, null, null);
}
/**
* Weblogic JNDI API를 사용하여 EJBHome인터페이스를 얻는다.
* @param jndiName EJB의 JNDI Alias name
* @param user 사용자 ID
* @param passwd 사용자 비밀번호
* @return EJBHome EJB의 홈인터페이스
* @exception java.lang.Exception
*/
public static EJBHome getHome(String jndiName, String user, String passwd)
throws Exception {
return getHome(null, jndiName, user, passwd);
}
/**
* Weblogic JNDI API를 사용하여 EJBHome인터페이스를 얻는다.
* @param hostIP Server address (t3://localhost:7001)
* @param jndiName EJB의 JNDI Alias name
* @return EJBHome EJB의 홈인터페이스
* @exception java.lang.Exception
*/
public static EJBHome getHome(String hostIP, String jndiName)
throws Exception {
return getHome(hostIP, jndiName, null, null);
}
/**
* Weblogic JNDI API를 사용하여 EJBHome인터페이스를 얻는다.<BR>
* JNDI 구조는 aaaa.bbbb형식을 기준으로 한다. LOG를 위해 필요.
* @param hostIP Server address (t3://localhost:7001)
* @param jndiName EJB의 JNDI Alias name
* @param user 사용자 ID
* @param passwd 사용자 비밀번호
* @return EJBHome EJB의 홈인터페이스
* @exception java.lang.Exception
*/
public static EJBHome getHome(String hostIP, String jndiName, String user, String passwd)
throws Exception {
JNDIHdr jndiMng = JNDIHdr.getInstance();
EJBHome ejbHome = null;
Context ctx = null;
try {
ctx = jndiMng.getInitialContext(hostIP, user, passwd);
ejbHome = (EJBHome)ctx.lookup(jndiName);
}
catch (Exception e) {
throw new Exception("JNDIHdr.notFoundEJB : " + jndiName);
}
finally {
if (ctx != null) {
try {
ctx.close(); }
catch (NamingException e) {
throw new Exception("JNDIHdr.failedCloseContext");
}
}
}
return ejbHome;
}
/**
* initial context를 얻는다.
* @param hostIP Server address (t3://localhost:7001)
* @param user 사용자 ID
* @param passwd 사용자 비밀번호
* @return Context 초기화된 Context
* @exception Exception
*/
public Context getInitialContext(String hostIP, String user, String passwd)
throws Exception {
Context ctx = null;
try {
Hashtable env = new Hashtable();
env.put(Context.INITIAL_CONTEXT_FACTORY, weblogic.jndi.WLInitialContextFactory.class.getName());
if( hostIP != null ) env.put(Context.PROVIDER_URL, hostIP);
if( user == null ) ctx = new InitialContext(env);
else {
env.put(Context.SECURITY_CREDENTIALS, new T3User(user, passwd));
ctx = new InitialContext(env);
}
}
catch (AuthenticationException e) {
throw new Exception("JNDIHdr.getInitialContext : invalidUser");
}
catch (CommunicationException e) {
throw new Exception("JNDIHdr.getInitialContext : invalidAddress");
}
catch (Exception e) {
e.printStackTrace();
throw new Exception("JNDIHdr.getInitialContext : unknown");
}
return ctx;
}
}