logo

JMS 튜토리얼

JMS(Java Message Service)는 메시지를 생성하고 보내고 읽을 수 있는 기능을 제공하는 API입니다. 느슨하게 결합되고 안정적인 비동기 통신을 제공합니다.

문자열 C++에서 찾기

JMS는 메시징 서비스라고도 합니다.


메시징 이해

메시징은 애플리케이션이나 소프트웨어 구성 요소를 통신하는 기술입니다.

JMS는 주로 한 애플리케이션에서 다른 애플리케이션으로 메시지를 보내고 받는 데 사용됩니다.


JMS 요구 사항

일반적으로 사용자는 애플리케이션에 메시지를 보냅니다. 하지만 한 애플리케이션에서 다른 애플리케이션으로 메시지를 보내려면 JMS API를 사용해야 합니다.

한 애플리케이션 A가 인도에서 실행되고 다른 애플리케이션 B가 미국에서 실행되는 시나리오를 생각해 보십시오. A 애플리케이션에서 B 애플리케이션으로 메시지를 보내려면 JMS를 사용해야 합니다.


JMS의 장점

1) 비동기식: 메시지를 받기 위해 클라이언트는 요청을 보낼 필요가 없습니다. 메시지가 자동으로 클라이언트에 도착합니다.

2) 믿을 수 있는: 메시지가 전달되었음을 보장합니다.


메시징 도메인

JMS에는 두 가지 유형의 메시징 도메인이 있습니다.

  1. 지점간 메시징 도메인
  2. 게시자/구독자 메시징 도메인

1) 지점간(PTP) 메시징 도메인

PTP 모델에서 하나의 메시지는 다음과 같습니다. 한 명의 수신자에게 전달됨 오직. 여기, 대기줄 메시지 지향 미들웨어(MOM)로 사용됩니다.

대기열은 수신자가 준비될 때까지 메시지를 보관하는 역할을 담당합니다.

PTP 모델에는 타이밍 의존성 없음 송신자와 수신자 사이.


2) 게시자/구독자(Pub/Sub) 메시징 도메인

Pub/Sub 모델에서 하나의 메시지는 다음과 같습니다. 구독자 전원에게 전달됩니다 . 방송같네요. 여기, 주제 메시지를 보관하고 전달하는 역할을 하는 메시지 지향 미들웨어로 사용됩니다.

PTP 모델에는 타이밍 의존성 게시자와 구독자 사이.



JMS 프로그래밍 모델


JMS 대기열 예

JMS 대기열 예제를 개발하려면 애플리케이션 서버를 설치해야 합니다. 여기서 우리는 유리고기3 두 개의 JNDI를 생성하는 서버입니다.

  1. 이름이 지정된 연결 팩토리 생성 myQueueConnectionFactory
  2. 이름이 지정된 대상 리소스 만들기 마이큐

JNDI 생성 후 서버 및 수신 애플리케이션을 생성합니다. 서버와 수신기를 다른 콘솔에서 실행해야 합니다. 여기서는 Eclipse IDE를 사용하고 있으며 기본적으로 다른 콘솔에서 열립니다.

1) 연결 팩토리 및 대상 리소스 생성

URL로 서버 관리 콘솔 열기 http://localhost:4848

사용자 이름과 비밀번호로 로그인하세요.

다음을 클릭하세요. JMS 리소스 -> 연결 팩토리 -> 새로 만들기 이제 풀 이름을 쓰고 리소스 유형을 QueueConnectionFactory로 선택한 다음 확인 버튼을 클릭하세요.

다음을 클릭하세요. JMS 리소스 -> 대상 리소스 -> 새로 만들기 , 이제 JNDI 이름과 물리적 대상 이름을 작성한 다음 확인 버튼을 클릭하세요.

2) 발신자 및 수신자 애플리케이션 생성

발신자 및 수신자 코드를 살펴보겠습니다. Receiver는 사용자가 메시지를 보낼 때 호출되는 수신기와 연결되어 있습니다.

파일: MySender.java
 import java.io.BufferedReader; import java.io.InputStreamReader; import javax.naming.*; import javax.jms.*; public class MySender { public static void main(String[] args) { try { //Create and start connection InitialContext ctx=new InitialContext(); QueueConnectionFactory f=(QueueConnectionFactory)ctx.lookup('myQueueConnectionFactory'); QueueConnection con=f.createQueueConnection(); con.start(); //2) create queue session QueueSession ses=con.createQueueSession(false, Session.AUTO_ACKNOWLEDGE); //3) get the Queue object Queue t=(Queue)ctx.lookup('myQueue'); //4)create QueueSender object QueueSender sender=ses.createSender(t); //5) create TextMessage object TextMessage msg=ses.createTextMessage(); //6) write message BufferedReader b=new BufferedReader(new InputStreamReader(System.in)); while(true) { System.out.println('Enter Msg, end to terminate:'); String s=b.readLine(); if (s.equals('end')) break; msg.setText(s); //7) send message sender.send(msg); System.out.println('Message successfully sent.'); } //8) connection close con.close(); }catch(Exception e){System.out.println(e);} } } 
파일: MyReceiver.java
 import javax.jms.*; import javax.naming.InitialContext; public class MyReceiver { public static void main(String[] args) { try{ //1) Create and start connection InitialContext ctx=new InitialContext(); QueueConnectionFactory f=(QueueConnectionFactory)ctx.lookup('myQueueConnectionFactory'); QueueConnection con=f.createQueueConnection(); con.start(); //2) create Queue session QueueSession ses=con.createQueueSession(false, Session.AUTO_ACKNOWLEDGE); //3) get the Queue object Queue t=(Queue)ctx.lookup('myQueue'); //4)create QueueReceiver QueueReceiver receiver=ses.createReceiver(t); //5) create listener object MyListener listener=new MyListener(); //6) register the listener object with receiver receiver.setMessageListener(listener); System.out.println('Receiver1 is ready, waiting for messages...'); System.out.println('press Ctrl+c to shutdown...'); while(true){ Thread.sleep(1000); } }catch(Exception e){System.out.println(e);} } } 
파일: MyListener.java
 import javax.jms.*; public class MyListener implements MessageListener { public void onMessage(Message m) { try{ TextMessage msg=(TextMessage)m; System.out.println('following message is received:'+msg.getText()); }catch(JMSException e){System.out.println(e);} } } 

Receiver 클래스를 먼저 실행한 다음 Sender 클래스를 실행합니다.


JMS 주제 예

JMS Queue와 동일하지만 Queue를 Topic으로, Sender를 Publisher로, Receiver를 Subscriber로 변경해야 합니다.

이름이 지정된 2개의 JNDI를 생성해야 합니다. myTopicConnectionFactory 그리고 내 주제 .

파일: MySender.java
 import java.io.BufferedReader; import java.io.InputStreamReader; import javax.naming.*; import javax.jms.*; public class MySender { public static void main(String[] args) { try { //Create and start connection InitialContext ctx=new InitialContext(); TopicConnectionFactory f=(TopicConnectionFactory)ctx.lookup('myTopicConnectionFactory'); TopicConnection con=f.createTopicConnection(); con.start(); //2) create queue session TopicSession ses=con.createTopicSession(false, Session.AUTO_ACKNOWLEDGE); //3) get the Topic object Topic t=(Topic)ctx.lookup('myTopic'); //4)create TopicPublisher object TopicPublisher publisher=ses.createPublisher(t); //5) create TextMessage object TextMessage msg=ses.createTextMessage(); //6) write message BufferedReader b=new BufferedReader(new InputStreamReader(System.in)); while(true) { System.out.println('Enter Msg, end to terminate:'); String s=b.readLine(); if (s.equals('end')) break; msg.setText(s); //7) send message publisher.publish(msg); System.out.println('Message successfully sent.'); } //8) connection close con.close(); }catch(Exception e){System.out.println(e);} } } 
파일: MyReceiver.java
 import javax.jms.*; import javax.naming.InitialContext; public class MyReceiver { public static void main(String[] args) { try { //1) Create and start connection InitialContext ctx=new InitialContext(); TopicConnectionFactory f=(TopicConnectionFactory)ctx.lookup('myTopicConnectionFactory'); TopicConnection con=f.createTopicConnection(); con.start(); //2) create topic session TopicSession ses=con.createTopicSession(false, Session.AUTO_ACKNOWLEDGE); //3) get the Topic object Topic t=(Topic)ctx.lookup('myTopic'); //4)create TopicSubscriber TopicSubscriber receiver=ses.createSubscriber(t); //5) create listener object MyListener listener=new MyListener(); //6) register the listener object with subscriber receiver.setMessageListener(listener); System.out.println('Subscriber1 is ready, waiting for messages...'); System.out.println('press Ctrl+c to shutdown...'); while(true){ Thread.sleep(1000); } }catch(Exception e){System.out.println(e);} } } 
파일: MyListener.java
 import javax.jms.*; public class MyListener implements MessageListener { public void onMessage(Message m) { try{ TextMessage msg=(TextMessage)m; System.out.println('following message is received:'+msg.getText()); }catch(JMSException e){System.out.println(e);} } }