JMS AND ACTIVEMQ

1. Giới thiệu JMS

a. Nhắn tin là gì?

Là việc thông tin giữa các thành phần hệ thống hay các ứng dụng khác nhau (trong môi trường phân tán) không được liên kết chặt chẽ như giao thức TCP, CORBA, hay RMI.- Ưu điểm của nhắn tin là khả năng tích hợp các nền tảng khác nhau, làm giảm tắc nghẽn hệ thống, tăng cường khả năng mở rộng và nâng cao độ tin cậy gửi nhận tin.

b. Mô hình của nhắn tin

Messaging-Types2.jpg

c. JMS là gì?

Java Message Service (JMS) API là một phần của kỹ thuật Java Enterprice Edition (JEE). JMS là tất cả những gì thuộc về việc gửi và nhận tin giữa hai hay nhiều client.- Nó là một đặc điểm kỹ thuật mô tả một phương thức tạo bởi trương trình Java cho việc tạo, gửi và nhận tin nhắn.- JMS API cho phép lới lỏng việc liên kết thông tin, và gửi tin một cách bất đồng bộ.

d. Kiến trúc một ứng dụng JMS

JMS-flow21.png

Bao gồm các thành phần:

  • Producer/Publisher: Thành phần tạo và gửi tin Broker trung gian hay Message Oriented Middleware (MOM)

  • Consumer/Subcriber: Thành phần nhận tinProducer và Consumer là những ứng dụng Java. Còn MOM là ứng dụng trung gian.

  • Một số MOM tiêu biểu:

    Weblogic - Oracle

    MQSeries - IBM

    JBOSSMQ - JBOSS

    SonigMQ - Progress

    TIBCO EMS - TIBCO

    ActiveMQ - Apache

e. JMS cũng có 2 mô hình nhắn tin là PTP và Pub/Sub

PTP2.png

Ở sơ đồ điểm – điểm (PTP) có ba thành phần chính là ứng dụng gửi, Queue, ứng dụng nhận tin. Mỗi tin nhắn được gửi đến một client cụ thể. Queue giữ lại các tin nhắn cho đến khi client nhận hết hoặc đến thời gian timout thiết lập.

Pub-Sub2.png

Ở sơ đồ Pub/Sub trên cũng có ba thành phần chính là phía gửi, Topic, và phía nhận.

Mỗi tin nhắn có thể được nhận bởi nhiều client. Topic sẽ lưu lại toàn bộ tin nhắn mà không bị mất đi cho đến khi MOM được reset, hay xóa.

2.Gới thiệu ActiveMQ

a.ActiveMQ là gì?

  • ActiveMQ là một MOM mã nguồn mở, phổ biến và mạnh nhất.

  • ActiveMQ có thể chạy độc lập, hay bên trong các tiến trình khác, ứng dụng server, hay ứng dụng JEE.

  • Hỗ trợ mọi thứ JMS yêu cầu, và có thể mở rộng.- Ngoài Java thì ActiveMQ có thể ứng dụng với .NET, C/C++, Ruby, Delphy.

b.Sử dụng ActiveMQ như thế nào?

Cài đặt ActiveMQ. Với Windows thì các bạn chỉ cần download file .zar về giải nén và chạy. Với Lunix thì các bạn có thể tham khảo cài đặt theo link: http://activemq.apache.org/getting-started.html- Viết ứng dụng gửi tin Producer.Dưới đây là source code đơn giản tạo và gửi thực hiện gửi tin mỗi giây một lần.

    import javax.jms.Connection;
    import javax.jms.ConnectionFactory;
    import javax.jms.Destination;
    import javax.jms.JMSException;
    import javax.jms.MessageProducer;
    import javax.jms.Session;
    import javax.jms.TextMessage;
    import org.apache.activemq.ActiveMQConnectionFactory;
    publicclass ProducerMsging {
    //Địa chỉ máy cài ActiveMQ với cổng mặc định là 61616
    privatestatic String url = “failover://tcp://192.168.1.218:61616;
    //Tên Topic
    privatestatic String subject = “TESTQUEUE1″;
     publicstaticvoid main(String[] args) throws JMSException {
    // Getting JMS connection from the server and starting it
    ConnectionFactory connectionFactory =
        new ActiveMQConnectionFactory(url);
    Connection connection =     connectionFactory.createConnection();
    connection.start();
    // JMS messages are sent and received using a Session. We will
    // create here a non-transactional session object. If you want
    // to use transactions you should set the first parameter to ‘true’
    Session session = connection.createSession(false,
    Session.AUTO_ACKNOWLEDGE);
    // Destination represents here our queue ‘TESTQUEUE’ on the
    // JMS server. You don’t have to do anything special on the
    // server to create it, it will be created automatically.
    Destination destination = session.createQueue(subject);
    // MessageProducer is used for sending messages (as opposed
    // to MessageConsumer which is used for receiving them)

      MessageProducer producer = session.createProducer(destination);

     //Delay waiting consumer start

    try {

       // We will send a small text message saying ‘Hello’ in Japanese

      int msgTemp = 0;

      while(true){

          msgTemp++;

         String msg = “TextMessage-+ String.valueOf(msgTemp);

         TextMessage message = session.createTextMessage(msg);

         // Here we are sending the message!

         producer.send(message);

         System.out.println(“‘” + msg + “‘ has been send.);

         //Delay 1s

         Thread.sleep(1000);

        }

            } catch (InterruptedException e) {

                System.out.println(“Error when during sent message:+ e.printStackTrace());
            }
        }
    }

- Viết ứng dụng nhận tin Consumer

Dưới đây là source code phần nhận tin

    import javax.jms.Connection;

    Import javax.jms.ConnectionFactory;

    import javax.jms.Destination;

    import javax.jms.JMSException;

    import javax.jms.Message;

    import javax.jms.MessageConsumer;

    import javax.jms.Session;

    import javax.jms.TextMessage;

    import org.apache.activemq.ActiveMQConnectionFactory;

    publicclass ConsumerMsging {

    // URL of the JMS server

    privatestatic String url = “failover://tcp://192.168.1.218:61616;

    // Name of the queue we will receive messages from

    privatestatic String subject = “TESTQUEUE1″;

    publicstaticvoid main(String[] args) throws JMSException {

          // Getting JMS connection from the server

     ConnectionFactory connectionFactory

                    = new ActiveMQConnectionFactory(url);

     Connection connection = connectionFactory.createConnection();

     connection.start();

          // Creating session for seding messages

         Session session = connection.createSession(false,

          Session.AUTO_ACKNOWLEDGE);

         // Getting the queue ‘TESTQUEUE’

          Destination destination = session.createQueue(subject);

         // MessageConsumer is used for receiving (consuming) messages

     MessageConsumer consumer = session.createConsumer(destination);

         while(true){

       Message message = consumer.receive();

             // There are many types of Message and TextMessage

            // is just one of them. Producer sent us a TextMessage

           // so we must cast to it to get access to its .getText()

          // method.

         if (message instanceof TextMessage) {

        TextMessage textMessage = (TextMessage) message;

                System.out.println(“Received message ‘”

                              + textMessage.getText() + “‘”);

     }

    }

        //connection.close();

    }

    }

c. Làm sao giám sát gửi nhận tin trong ActiveMQ

ActiveMQ hỗ trợ giao diện web thân thiện để quản lý tin.

URL: http://[server-address]:8161/admin

Monitoring-ActiveMQ.png

Tài liệu tham khảo

Thank you so much.