혹시라도 JMS 구성이 안된 분들은
[웹로직] JMS MDB 테스트 구성(1) 먼저 보고 오시기를 권합니다.
테스트를 위해 MyMDB.java 파일과 QueueSend.java 파일 두 개를 컴파일하여 ejb형식으로 배포를 할 예정이다.
1) 소스 수정
- 수정해야할 소스 파일은 총 2개이다. (MyMDB.java/ QueueSend.java)
- MyMDB.java
package ejb30; import javax.ejb.MessageDriven; import javax.jms.JMSException; import javax.jms.Message; import javax.jms.MessageListener; import javax.jms.TextMessage; import javax.ejb.ActivationConfigProperty; @MessageDriven( activationConfig = { @ActivationConfigProperty(propertyName = "destinationType", propertyValue = "javax.jms.Queue") , @ActivationConfigProperty(propertyName="connectionFactoryJndiName",propertyValue="mdbConnectionFactory"), @ActivationConfigProperty(propertyName="destinationJndiName", propertyValue="mdbQueue") } ,mappedName="mdbQueue" ) public class MyMDB implements MessageListener { public void onMessage(Message message) { TextMessage textMessage = (TextMessage) message; try { System.out.println("nnt(mdb) MyMDB Received n"+ textMessage.getText()); } catch (JMSException e) { e.printStackTrace(); } } } |
-> 위 소스코드에서 MessageDriven 안에서 WLS에서 설정해주었던 Connection Factory와 Queue 이름에 맞게 수정해준다.
- QueueSend.java
import java.io.IOException; import java.util.Hashtable; import javax.jms.JMSException; import javax.jms.Queue; import javax.jms.QueueConnection; import javax.jms.QueueConnectionFactory; import javax.jms.QueueSender; import javax.jms.QueueSession; import javax.jms.Session; import javax.jms.TextMessage; import javax.naming.Context; import javax.naming.InitialContext; import javax.naming.NamingException; public class QueueSend { // Defines the JNDI context factory. public final static String JNDI_FACTORY="weblogic.jndi.WLInitialContextFactory"; // Defines the JMS context factory. public final static String JMS_FACTORY="mdbConnectionFactory"; // Defines the queue. public final static String QUEUE="mdbQueue"; private QueueConnectionFactory qconFactory; private QueueConnection qcon; private QueueSession qsession; private QueueSender qsender; private Queue queue; private TextMessage msg; public void init(Context ctx, String queueName) throws NamingException, JMSException { qconFactory = (QueueConnectionFactory) ctx.lookup(JMS_FACTORY); qcon = qconFactory.createQueueConnection(); qsession = qcon.createQueueSession(false, Session.AUTO_ACKNOWLEDGE); queue = (Queue) ctx.lookup(queueName); qsender = qsession.createSender(queue); msg = qsession.createTextMessage(); qcon.start(); } public void send(String message,int counter) throws JMSException { msg.setText(message); msg.setIntProperty("counter", counter); qsender.send(msg); } public void close() throws JMSException { qsender.close(); qsession.close(); qcon.close(); } public static void main(String[] args) throws Exception { if (args.length != 1) { System.out.println("Usage: java QueueSend WebLogicURL"); return; } InitialContext ic = getInitialContext(args[0]); QueueSend qs = new QueueSend(); qs.init(ic, QUEUE); readAndSend(qs); qs.close(); } private static void readAndSend(QueueSend qs) throws IOException, JMSException { String line="Test Message Body with counter = "; for(int i=0;i<10;i++){ qs.send(line+i,i); System.out.println("JMS Message Sent: "+line+i+"n"); } } private static InitialContext getInitialContext(String url) throws NamingException { Hashtable env = new Hashtable(); env.put(Context.INITIAL_CONTEXT_FACTORY, JNDI_FACTORY); env.put(Context.PROVIDER_URL, url); return new InitialContext(env); } } |
-> 해당 소스도 마찬가지로 WLS에서 설정해주었던 Connection Factory와 Queue 이름에 맞게 수정해준다.
2) 소스 컴파일
- 컴파일 전에 반드시 선행해주어야 할 것은 소스 코드에서 import 하는 클래스들을 불러오기 위해 weblogic에 있는 jar 파일들을 로드해야한다. 하는 방법은 아래와 같다.
[weblogic@sydev bin]$ pwd /home/weblogic/wls12213/domains/testDomain01/bin [weblogic@sydev bin]$ . ./setDomainEnv.sh [weblogic@sydev testDomain01]$ |
그전에 선행 작업이 없이 컴파일을 시도하면 아래와 같은 에러 메시지가 발생한다.
[weblogic@sydev mdb_app]$ /usr/java/java8_64/bin/javac -d . MyMDB.java MyMDB.java:3: error: package javax.ejb does not exist import javax.ejb.MessageDriven; ^ MyMDB.java:4: error: package javax.jms does not exist import javax.jms.JMSException; ^ ...(생략) |
-> ejb나 jms 같은 클래스를 찾을 수 없다는 메시지다.
이것 때문에 꽤나 헤맸다...
아무튼 다시 MyMDB.java를 컴파일 하면 아래와 같이 package 디렉토리와 컴파일된 MyMDB.class 파일이 생성된다.
-rw-rw-r-- 1 weblogic weblogic 1113 Feb 25 12:54 MyMDB.java drwxrwxr-x 2 weblogic weblogic 25 Feb 25 13:59 ejb30 drwxrwxr-x 3 weblogic weblogic 59 Feb 25 13:59 . [weblogic@sydev mdb_app]$ cd ejb30/ [weblogic@sydev ejb30]$ ls -arlt total 4 drwxrwxr-x 3 weblogic weblogic 59 Feb 25 13:59 .. drwxrwxr-x 2 weblogic weblogic 25 Feb 25 13:59 . -rw-rw-r-- 1 weblogic weblogic 1586 Feb 25 13:59 MyMDB.class |
이후에 배포를 위해 jar로 ejb30 디렉토리와 MyMDB.java 파일을 묶는다.
[weblogic@sydev mdb_app]$ /usr/java/java8_64/bin/jar cvf mdb30.jar ejb30/ MyMDB.java added manifest adding: ejb30/(in = 0) (out= 0)(stored 0%) adding: ejb30/MyMDB.class(in = 1586) (out= 913)(deflated 42%) adding: MyMDB.java(in = 1113) (out= 445)(deflated 60%) |
3) ejb 어플리케이션 배포
- 이제 생성한 ejb 어플리케이션 웹로직 관리콘솔에서 배포해보자
* WLS Admin 콘솔 > 배치 > 새 어플리케이션 배포
배포 후... 어플리케이션 확인!!
* ejb 형태의 소스가 정상적으로 배포되었다.
4) ejb 어플리케이션 호출
- QueueSend.java 소스 파일에서 10개의 메시지를 큐에 넣고 Consumer가 10개의 메시지를 가져다 쓰는 형식으로 되어 있다.
우선 서비스를 호출하려면 QueueSend.java 파일도 아래와 같이 컴파일 해주어야 한다.
[weblogic@sydev mdb_app]$ /usr/java/java8_64/bin/javac -d . QueueSend.java Note: QueueSend.java uses unchecked or unsafe operations. Note: Recompile with -Xlint:unchecked for details. |
컴파일이 완료되면 해당 class 파일로 JMS 큐에 메시지를 넣고 빼는 테스트를 진행한다.
[weblogic@sydev mdb_app]$ /usr/java/java8_64/bin/java QueueSend t3://192.168.56.106:11011 JMS Message Sent: Test Message Body with counter = 0n JMS Message Sent: Test Message Body with counter = 1n JMS Message Sent: Test Message Body with counter = 2n JMS Message Sent: Test Message Body with counter = 3n JMS Message Sent: Test Message Body with counter = 4n JMS Message Sent: Test Message Body with counter = 5n JMS Message Sent: Test Message Body with counter = 6n JMS Message Sent: Test Message Body with counter = 7n JMS Message Sent: Test Message Body with counter = 8n JMS Message Sent: Test Message Body with counter = 9n |
-> java QeueSend t3://IP:[testJMSServer1 포트]
- 아래 웹로직 노헙 로그 확
Thu Feb 25 14:33:22 KST 2021nnt(mdb) MyMDB Received nTest Message Body with counter = 0 Thu Feb 25 14:33:22 KST 2021nnt(mdb) MyMDB Received nTest Message Body with counter = 1 Thu Feb 25 14:33:22 KST 2021nnt(mdb) MyMDB Received nTest Message Body with counter = 2 Thu Feb 25 14:33:22 KST 2021nnt(mdb) MyMDB Received nTest Message Body with counter = 3 Thu Feb 25 14:33:22 KST 2021nnt(mdb) MyMDB Received nTest Message Body with counter = 4 Thu Feb 25 14:33:22 KST 2021nnt(mdb) MyMDB Received nTest Message Body with counter = 5 Thu Feb 25 14:33:22 KST 2021nnt(mdb) MyMDB Received nTest Message Body with counter = 6 Thu Feb 25 14:33:22 KST 2021nnt(mdb) MyMDB Received nTest Message Body with counter = 7 Thu Feb 25 14:33:22 KST 2021nnt(mdb) MyMDB Received nTest Message Body with counter = 8 Thu Feb 25 14:33:22 KST 2021nnt(mdb) MyMDB Received nTest Message Body with counter = 9 |
-> 0~9까지 메시지가 처리된 것 확인
아래 웹로직 관리콘솔에서도 처리된 메시지 확인 가능
* WLS Admin 콘솔 > 서비스 > 메시징 > JMS 모듈 > mdbQueue > 모니터링
--> 위 모니터링 탭을 보면 총 메시지 처리 수가 10개가 찍힌 것을 확인할 수 있다.
어플리케이션은 따로 첨부파일로 업로드 함.
-> 안에 mdb30_sleep.jar 파일은 한 개의 메시지만 sleep으로 처리를 지연시켜 보류 중인 메시지 수를 확인하기 위해 수정한 소스이다.
'오라클 > WebLogic' 카테고리의 다른 글
[웹로직] Coherence 클러스터 Inner 구성 (0) | 2021.08.13 |
---|---|
[웹로직] 암호화된 내용 복호화하는 방법 (0) | 2021.08.04 |
[웹로직] JMS MDB 테스트 구성(1) (0) | 2021.07.26 |
[웹로직] 노헙로그 로테이션(nohup rotation) (0) | 2021.07.26 |
[웹로직] 데이터소스 모니터링(WebLogic Monitoring) (0) | 2021.07.26 |