본문 바로가기

카테고리 없음

WLS 11gR1 JMS QueueSender, QueueReceiver example

이 프로그램을 테스트하기 전에 먼저 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();
      }
   }
}