- JMS 시스템의 이해


Uajjang.com 미디어 검색팀 정경석
                2012. 05 .09
   What is JMS?
   Why JMS?
   Producer/Consumer
   Type of JMS model
   About ActiveMQ
   When is the right time to use ActiveMQ?
   How to use ActiveMQ?
   How to monitoring in ActiveMQ?
   Fault tolerance and High availability
   JMS is Java Message Service
   Standard J2EE messaging API
   JMS is asynchronous in nature
   Producer/Consumer pattern의 구현체
   Producer, Message, Consumer로 구성됨.
   Message broker system
     메시지 전송 중계를 담당.
     Message의 전송을 보장.
       즉, JMS를 통해 전송된 메시지는 반드시 목적지에 도달함.
 Heterogeneous application integration
   Unix <-> IBM Host, Java <-> C++
   이기종, 다른 언어로 작성된 Applicaion간의 업무 통
    합이 가능함.
 High reliability and the performance
 Do not need to concern about
 communication.
   데이터의 통신은 JMS가 담당 하므로 개발자는 순수
   하게 메시지에만 관심을 가질 수 있음
   메시지 전송의 투명성을 가짐.
Broker(JMS)



    Producer                   Consumer

 생산자는 메시지를 만들어서 Broker에게 전송.
 소비자는 Broker로 부터 메시지를 수신
 즉, 메시지가 생성되어 소비하기까지의 과정을 중계하는 역할
 Point to Point(Sender/Receiver)
     하나의 메시지는 하나의 목적지로만 전달됨.
     특정한 App이 메시지를 수신하도록 유도 가능.



        Sender              Queue    Receiver 1

                                     Receiver 2

 Publish and Subscribe
    하나의 메시지는 다중의 목적지로 전달됨.
    모든 App이 메시지를 수신



       Publisher             Topic   Subscriber

                                     Subscriber
 Most popular and powerful open source
 Message Broker
 Java based JMS implementation
 Spring Integration with ActiveMQ
 Fault tolerance(High availability)
 Easy to Scale out
 Supports a large number of Cross
 Language Clients(C#, C++, Perl, PHP, Python,
 Ruby, Delphi…)
 RPC의 대체(Async)
 Event Driven Architecture with POJOs
 (Shopping)
 Software적인 scalability를 보장받고자 하는 경
 우(SOA)
 메시지 전송의 보장이 필요한 경우(System간)
 Transaction load balancing 필요한 경우
 각 시스템에 동일한 메시지를 전달해야 하는 경
 우(Notification)
 Install ActiveMQ(using default setting).
 Write sender application(using ActiveMQ Lib)
 Write receiver application(using ActiveMQ Lib)




                    Broker(JMS)


     Producer                        Consumer
     (Sender)                        (Receiver)
Write sender application
ActiveMQConnectionFactory connectionFactory = new
ActiveMQConnectionFactory(“tcp://10.1.0.11:61616”);
Connection connection = connectionFactory.createConnection();
connection.start();

// Create the session
session = connection.createSession(true, Session.AUTO_ACKNOWLEDGE);
destination = session.createQueue(“com.jjanglive.jPush”);

// Create the producer.
producer = session.createProducer(destination);
producer.setDeliveryMode(DeliveryMode.NON_PERSISTENT);

TextMessage textMessage = session.createTextMessage(“This is a sample message!!”);

producer.send(textMessage);
Write receiver application with Spring
public class SampleMessageHandler implements MessageListener {
@Override
public void onMessage(Message message) {
  // do something
  System.out.println(“Message Received!!!!!!!!”);
}
Spring setting
<bean id="connectionFactory"
class="org.apache.activemq.spring.ActiveMQConnectionFactory">
<property name="brokerURL" value="failover:tcp://10.4.0.101:61616" />
</bean>
<bean id="jPushQueue" class="org.apache.activemq.command.ActiveMQQueue">
<constructor-arg index="0" value="com.jjanglive.jPush" />
</bean>
<bean class="org.springframework.jms.listener.DefaultMessageListenerContainer">
<property name="connectionFactory" ref="connectionFactory" />
<property name="destination" ref="jPushQueue" />
<property name="messageListener" ref="jMessageListenerAdapter" />
</bean>
<bean id="jMessageListenerAdapter"
class="org.springframework.jms.listener.adapter.MessageListenerAdapter">
<constructor-arg>
<bean class="com.jjanglive.jpush.message.handler.JPushMessageHandler"></bean>
</constructor-arg>
</bean>
Connect to http://server_address:8161/admin
Broker down case


            MQ Client    MQ Client    …   MQ Client

                         Broker Agent          Failover connect



              Active       Active           Active
              MQ 1         MQ 2       …     MQ n



            Receiver 1   Receiver 2   …   Receiver n


 특정 Broker가 Down된 경우 MQ Client와 Receiver는 자동으로 down을 감
  지하고 살아 있는 Broker를 찾아 auto reconnect

Active MQ

  • 1.
    - JMS 시스템의이해 Uajjang.com 미디어 검색팀 정경석 2012. 05 .09
  • 2.
    What is JMS?  Why JMS?  Producer/Consumer  Type of JMS model  About ActiveMQ  When is the right time to use ActiveMQ?  How to use ActiveMQ?  How to monitoring in ActiveMQ?  Fault tolerance and High availability
  • 3.
    JMS is Java Message Service  Standard J2EE messaging API  JMS is asynchronous in nature  Producer/Consumer pattern의 구현체  Producer, Message, Consumer로 구성됨.  Message broker system  메시지 전송 중계를 담당.  Message의 전송을 보장.  즉, JMS를 통해 전송된 메시지는 반드시 목적지에 도달함.
  • 4.
     Heterogeneous applicationintegration  Unix <-> IBM Host, Java <-> C++  이기종, 다른 언어로 작성된 Applicaion간의 업무 통 합이 가능함.  High reliability and the performance  Do not need to concern about communication.  데이터의 통신은 JMS가 담당 하므로 개발자는 순수 하게 메시지에만 관심을 가질 수 있음  메시지 전송의 투명성을 가짐.
  • 5.
    Broker(JMS) Producer Consumer  생산자는 메시지를 만들어서 Broker에게 전송.  소비자는 Broker로 부터 메시지를 수신  즉, 메시지가 생성되어 소비하기까지의 과정을 중계하는 역할
  • 6.
     Point toPoint(Sender/Receiver)  하나의 메시지는 하나의 목적지로만 전달됨.  특정한 App이 메시지를 수신하도록 유도 가능. Sender Queue Receiver 1 Receiver 2  Publish and Subscribe  하나의 메시지는 다중의 목적지로 전달됨.  모든 App이 메시지를 수신 Publisher Topic Subscriber Subscriber
  • 7.
     Most popularand powerful open source Message Broker  Java based JMS implementation  Spring Integration with ActiveMQ  Fault tolerance(High availability)  Easy to Scale out  Supports a large number of Cross Language Clients(C#, C++, Perl, PHP, Python, Ruby, Delphi…)
  • 8.
     RPC의 대체(Async) Event Driven Architecture with POJOs (Shopping)  Software적인 scalability를 보장받고자 하는 경 우(SOA)  메시지 전송의 보장이 필요한 경우(System간)  Transaction load balancing 필요한 경우  각 시스템에 동일한 메시지를 전달해야 하는 경 우(Notification)
  • 9.
     Install ActiveMQ(usingdefault setting).  Write sender application(using ActiveMQ Lib)  Write receiver application(using ActiveMQ Lib) Broker(JMS) Producer Consumer (Sender) (Receiver)
  • 10.
    Write sender application ActiveMQConnectionFactoryconnectionFactory = new ActiveMQConnectionFactory(“tcp://10.1.0.11:61616”); Connection connection = connectionFactory.createConnection(); connection.start(); // Create the session session = connection.createSession(true, Session.AUTO_ACKNOWLEDGE); destination = session.createQueue(“com.jjanglive.jPush”); // Create the producer. producer = session.createProducer(destination); producer.setDeliveryMode(DeliveryMode.NON_PERSISTENT); TextMessage textMessage = session.createTextMessage(“This is a sample message!!”); producer.send(textMessage);
  • 11.
    Write receiver applicationwith Spring public class SampleMessageHandler implements MessageListener { @Override public void onMessage(Message message) { // do something System.out.println(“Message Received!!!!!!!!”); }
  • 12.
    Spring setting <bean id="connectionFactory" class="org.apache.activemq.spring.ActiveMQConnectionFactory"> <propertyname="brokerURL" value="failover:tcp://10.4.0.101:61616" /> </bean> <bean id="jPushQueue" class="org.apache.activemq.command.ActiveMQQueue"> <constructor-arg index="0" value="com.jjanglive.jPush" /> </bean> <bean class="org.springframework.jms.listener.DefaultMessageListenerContainer"> <property name="connectionFactory" ref="connectionFactory" /> <property name="destination" ref="jPushQueue" /> <property name="messageListener" ref="jMessageListenerAdapter" /> </bean> <bean id="jMessageListenerAdapter" class="org.springframework.jms.listener.adapter.MessageListenerAdapter"> <constructor-arg> <bean class="com.jjanglive.jpush.message.handler.JPushMessageHandler"></bean> </constructor-arg> </bean>
  • 13.
  • 14.
    Broker down case MQ Client MQ Client … MQ Client Broker Agent Failover connect Active Active Active MQ 1 MQ 2 … MQ n Receiver 1 Receiver 2 … Receiver n  특정 Broker가 Down된 경우 MQ Client와 Receiver는 자동으로 down을 감 지하고 살아 있는 Broker를 찾아 auto reconnect