본문 바로가기
오라클/WebLogic

[웹로직] JMS MDB 테스트 구성(2)

by sangyeon 2021. 7. 26.
728x90

혹시라도 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.zip
0.01MB

-> 안에 mdb30_sleep.jar 파일은 한 개의 메시지만 sleep으로 처리를 지연시켜 보류 중인 메시지 수를 확인하기 위해 수정한 소스이다.

728x90