JMS AND ACTIVEMQ
Bài đăng này đã không được cập nhật trong 3 năm
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
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
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
Ở 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.
Ở 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
Tài liệu tham khảo
Thank you so much.
All rights reserved