이 프로그램을 테스트하기 전에 먼저 Weblogic Server Console에서 JMS 설정을 해야 한다. JMS를 설정할 때 입력한 Queue의 JNDI 이름이 프로그램의 코드에 사용된다.
MDB(Message Driven Bean)을 사용하지 않고 Weblogic JMS서버의 Queue에 메시지를 전송하고 또 다른 프로그램에서는 메시지를 수신하는 내용이다. 즉, QueueSender, QueueReceiver를 이용하는 예제이다. MDB을 하기 전에 이런 유형의 프로그램을 경험해 보는 것은 MDB가 JMS 시스템에서 메시지 수신자의 입장이라는 것을 이해하기 위한 좋은 수단이 될 수 있다.
1. 서버콘솔에서 JMS설정을 한다.
2. Eclipse에서 일반 Java Project를 생성하고 다음에 제시한 2개의 클래스를 작성한다.
3. MessageQueueSenderApp를 몇번 실행하면 Weblogic JMS 서버의 Queue로 메시지가 전송되어 저장된다.
4. MessageQueueReceiverApp를 실행하면 Queue 에 저장된 메시지를 모두 읽어와 출력된다.
5. 메시지를 모두 읽고 나면 Queue에 저장되어 있던 메시지는 삭제되므로 확인한다
OEPE(Eclipse 3.5) 프로젝트의 라이브러리 설정
아래의 클래스는 메시지를 보내거나 받는 예제인데 컴파일 및 실행하기 위해서는 JMS관련 라이브러리가 프로젝트에 등록되어야 한다. weblogic.jar 파일을 C:\Oracle\Middleware\wlserver_10.3\server\lib 안에서 찾아서 프로젝트의 Build Path에 등록해 주면 된다.
MessageQueueSenderApp.java
import java.io.*;
import javax.jms.*;
import javax.naming.*;
import java.util.Properties;
public class MessageQueueSenderApp {
public static void main(String args[]) {
try {
Properties h = new Properties();
h.put(Context.INITIAL_CONTEXT_FACTORY, "weblogic.jndi.WLInitialContextFactory");
h.put(Context.PROVIDER_URL, "t3://localhost:7001");
Context ctx = new InitialContext(h);
QueueConnectionFactory factory = (QueueConnectionFactory)ctx.lookup("weblogic.jms.ConnectionFactory");
Queue queue = (Queue)ctx.lookup("jms/queue"); /* 서버콘솔에서 설정한 Queue의 JNDI 이름 */
QueueConnection con = factory.createQueueConnection();
QueueSession session = con.createQueueSession(false, Session.AUTO_ACKNOWLEDGE);
QueueSender qsender = session.createSender(queue);
TextMessage message = session.createTextMessage();
message.setText("This is test message(Application Client)");
message.setStringProperty("hello", "Application에서 보낸 메시지");
qsender.send(message);
con.close();
System.out.println("메시지 전송 완료");
} catch (Exception ex) {
System.out.println(ex);
}
}
}
MessageQueueReceiverApp.java
import java.util.Properties;
import javax.jms.Message;
import javax.jms.Queue;
import javax.jms.QueueConnection;
import javax.jms.QueueConnectionFactory;
import javax.jms.QueueReceiver;
import javax.jms.QueueSession;
import javax.jms.Session;
import javax.jms.TextMessage;
import javax.naming.Context;
import javax.naming.InitialContext;
public class MessageQueueRecieverApp {
public static void main(String[] args) {
try {
Properties h = new Properties();
h.put(Context.INITIAL_CONTEXT_FACTORY, "weblogic.jndi.WLInitialContextFactory");
h.put(Context.PROVIDER_URL, "t3://localhost:7001");
Context ctx = new InitialContext(h);
QueueConnectionFactory factory = (QueueConnectionFactory)ctx.lookup("weblogic.jms.ConnectionFactory");
Queue queue = (Queue)ctx.lookup("jms/queue"); /* 서버콘솔에서 설정한 Queue의 JNDI 이름 */
QueueConnection con = factory.createQueueConnection();
QueueSession session = con.createQueueSession(false, Session.AUTO_ACKNOWLEDGE);
QueueReceiver qreceiver = session.createReceiver(queue);
con.start(); /* 수신할 때는 반드시 start()를 호출해야 한다 */
while( true ) {
Message msg = qreceiver.receive(1);
if ( msg != null ) {
if ( msg instanceof TextMessage) {
TextMessage tmpMsg = (TextMessage) msg;
System.out.println("읽어온 메시지 : " + tmpMsg.getText());
String text = tmpMsg.getStringProperty("hello");
System.out.println("hello:"+text);
}
} else {
System.out.println("메시지가 없습니다.");
break;
}
}
con.close();
} catch(Exception e) {
e.printStackTrace();
}
}
}