SlideShare a Scribd company logo
1 of 142
Download to read offline
Lập trình phân tán theo chủ đề - JMS 
Cao Tuấn Dũng 
Trịnh Tuấn Đạt 
Vũ Hương Giang 
1
Nội dung 
1. Truyền thông điệp là gì 
Các mô hình, tính tin dùng, giao dịch, truyền thông điệp phân tán, an toàn. 
2. Tại sao cần truyền thông điệp 
3. JMS là gì 
4. Kiến trúc của JMS 
5. APIs Lập trình JMS 
6. Các bước viết JMS clients (bộ gửi và nhận) 
7. Các đặc tính không có trong JMS 
2
1. Truyền thông điệp là gì? 
3
Truyền thông điệp (messaging) 
Mô hình trong đó các ứng dụng liên kết lỏng với nhau thông qua việc chuyển giao các thông điệp tự - mô tả. 
4
Hệ thống truyền thông điệp 
Truyền thông kết nối lỏng (Loose coupled) 
Truyền thông không đồng bộ 
Thông điệp là phương tiện giao tiếp giữa các ứng dụng 
Các thuật ngữ gần nghĩa: 
MOM (Message Oriented Middleware) 
Messaging system 
Messaging server 
Messaging provider 
JMS provider 
5
Thực thể truyền thông 
Các bộ sinh thông điệp – producers 
Các bộ nhận thông điệp – consumers 
Sự khác nhau giữa Producer/Consumer và client/server 
Truyền thông 1 - n, n - 1, hoặc n – n 
Phía sinh không cần quan tâm tới phía nhận 
6
Liên kết lỏng 
Về không gian: Bộ sinh và nhận không kết nối trực tiếp qua một kênh truyền thông. 
Không cần biết đến danh tính của nhau. 
Về thời gian: 
Thời gian truyền thông điệp là không xác định 
Bộ sinh /nhận không phải có mặt tại cùng một thời điểm 
Về cú pháp: 
S/N không liên kết qua một API chung (khác với RMI) 
7
Kênh truyền thông 
8
Mô hình Đẩy 
9 
Sinh/Kênh – chủ động
Mô hình lai 
10
Mô hình kéo 
Kênh/Nhận – chủ động 
11
Phần dẻo hướng thông điệp 
12 
Sender Receiver 
MOM 
Messages
Các tính năng của phần dẻo hướng thông điệp 
Hỗ trợ 2 mô hình truyền thông điệp: 
Point-to-point: điểm-điểm 
Publish-Subscribe 
Độ tin cậy 
Các thao tác giao dịch 
Truyền thông điệp phân tán 
An ninh 
13
Các đặc tính thêm 
Truyền thông điệp thời gian thực 
Đảm bảo an ninh cho các giao dịch 
Chứng thực 
Cân bằng tải 
14
Một số hệ thống MOM 
TIBCO 
JMS (Java Message Service) 
WebsphereMQ, 
ActiveMQ (apache) 
IBM MQ (Message Queues) 
MSMQ (Microsoft Message Queue) 
15
1.1. Mô hình truyền thông điệp 
16
Mô hình truyền thông điệp 
Point to point 
Một thông điệp được xử lý bởi 1 bên nhận duy nhất 
Publish/Subscribe 
Một thông điệp được xử lý bởi nhiều bên nhận 
17
Point-to-point 
Một thông điệp được xử lý bởi 1 bên nhận duy nhất 
Có thể có nhiều bên gửi 
“Đích” của 1 thông điệp được gọi là queue 
First in, first out (nếu cùng mức ưu tiên) 
Bên gửi (senders/producers): gửi 1 thông điệp vào 1 queue (cùng mức ưu tiên) 
Bên nhận (receiver/consumer): Lấy ra 1 thông điệp từ queue 
18
Point-to-point 
19 
Client 
Senders 
Client Receiver 
Queue 
Sends 
Consumes 
Acknowledges 
Posts messages to the queue 
Receives messages on the queue
Hàng đợi thông điệp (MQ) 
 Thông điệp gửi bởi client được đưa vào hàng đợi 
 Khi thực thể nhận sẵn sàng, nó sẽ nhận thông điệp và xử lý 
20 
Producer Queue Consumer Consumer 
send(m1) 
send(m3) 
send(m2) 
receive() 
m1 
m2 
receive() 
Put message into queue 
Consume message
Một vài trường hợp 
21
Khi nào sử dụng point-to-point? 
Sử dụng khi tất cả các thông điệp truyền đi phải được xử lý thành công bởi 1 consumer 
22
Publish/Subscribe (Pub/Sub) 
Một message được xử lý bởi nhiều consumers 
“Destination” của 1 message gọi là topic 
Không phải là 1 queue 
Producers “publish” đến topic 
Consumers “subscribe” đến topic 
23
Publish-and-Subscribe 
24 
Client Publishers 
Client 
Subscriber 
Client 
Subscriber 
Publishes 
Subject of communication 
Available to registered participants 
Posts messages to the topic 
Receives messages on the topic
Publish-Subscribe 
25 
Producer Broker Consumer Consumer 
publish(m1) 
Pass message to broker send(m1) 
send(m1) 
send(m2) 
send(m2) 
Dispatch message to 
all consumers 
publish(m2) 
publish(m3)
Khi nào sử dụng Pub/Sub? 
 Sử dụng khi 1 thông điệp gửi đi cần xử lý bởi nhiều consumers 
 Ví dụ: ứng dụng nhân sự 
 Tạo “new hire” topic 
 Rất nhiều ứng dụng (“facilities”, “payroll”, …) subscribe “new hire” topic 
26 
subscribe (“AAPL”); 
subscribe (“SUN”); 
subscribe (“AAPL”); 
subscribe (“SUN”); 
publish (“AAPL”, 29.2); 
publish(“AAPL”, 29.3); 
publish (“SUN”, 43.0); 
publish(“SUN”, 42.7);
1.2. Tính tin cậy 
27
Tính tin cậy (Reliability) 
Đôi khi phải đảm bảo việc truyền thông điệp: 
Có nhiều mức độ tin cậy khác nhau 
Sender có thể chỉ ra mức độ tin cậy cụ thể 
Độ tin cậy cao thì lượng công việc càng ít hơn 
Đặc biệt sử dụng persistent storage để lưu trữ các thông điệp 
28
1.3. Các thao tác giao dịch 
29
Các thao tác giao dịch 
Giao dịch sinh thông điệp 
Sender nhóm 1 loạt các thông điệp vào 1 transaction 
Hoặc tất cả hoặc không thông điệp nào được cho vào queue thành công 
Giao dịch nhận thông điệp 
Consumer nhận 1 nhóm các thông điệp như 1 transaction 
Trừ khi tất cả các thông điệp được nhận, nếu không chúng vẫn còn lai ở queue hoặc topic 
30
Phạm vi giao dịch 
Phạm vi Client-to-Messaging 
Transaction bao phủ mỗi lần tương tác nhận/gửi thông điệp 
JMS hỗ trợ loại này 
31 
Application 1 
Application 2 
Queue 
Messaging system
Phạm vi Client-to-Client 
Phạm vi Client-to-Client 
Transaction bao phủ cả 2 client 
JMS không hỗ trợ phạm vi này 
32 
Application 1 
Application 2 
Queue 
Messaging system
1.4. Truyền thông điệp phân tán 
33
Truyền thông điệp phân tán 
Các hệ thống truyền thông điệp phân tán (Enterprise MS) có thể cung cấp hạ tầng trong đó, thông điệp được forward giữa các servers: 
Được gọi là “message channel” 
34
Truyền thông điệp phân tán 
35 
Application 1 
Application 2 
message 
Queue 
Queue 
message 
Messaging server 1 
Messaging server 2 
Message channel
1.5. An ninh 
36
Các vấn đề an ninh 
Chứng thực - Authentication 
Hệ thống thông điệp yêu cầu client trình ra chứng chỉ được ký (signed certificates) 
Tính bí mật của các thông điệp 
Hệ thống thông điệp cung cấp cơ chế mã hóa 
Tính toàn vẹn dữ liệu của các thông điệp 
Hệ thống thông điệp cung cấp cơ chế đảm bảo toàn vẹn dữ liệu khi thông điệp được xử lý 
Được xử lý tùy theo nhà cung cấp 
37
2. Tại sao cần truyền thông điệp? 
38
Tại sao cần truyền thông điệp? 
Độc lập Platform 
Độc lập theo network location 
Làm việc tốt với các hệ thống không đồng nhất 
39
Tại sao cần truyền thông điệp? 
Anonymity 
Who doesn’t matter 
 
Where doesn’t matter 
 
When doesn’t matter 
Ngược với hệ thống RPC 
Corba 
RMI 
40
Tại sao cần truyền thông điệp? 
Scalability 
Xử lý được với nhiều clients mà 
Không cần thay đổi ở application 
Không cần thay đổi ở architecture 
Không làm hỏng công việc của hệ thống 
Tăng công suất phần cứng nếu yêu cầu mức scalability cao hơn 
41
Tại sao cần truyền thông điệp? 
Khả năng chịu lỗi (robustness) 
Thực thể nhận có thể hỏng. 
 
Thực thể gửi có thể hỏng. 
 
Mạng có thể hỏng 
Hệ thống thông điệp vẫn tiếp tục hoạt động được bình thường 
42
Ví dụ về các ứng dụng truyền thông điệp 
43
Các ứng dụng truyền thông điệp 
Giao dịch thẻ tín dụng 
Báo cáo thời tiết 
Workflow 
Quản trị mạng 
Quản lý dây chuyền sản xuất 
Chăm sóc khách hàng 
Truyền thông (Voice Over IP, Paging Systems, etc.) 
… 
44
Ví dụ 
45
Bài tập đọc hiểu 
http://www.eaipatterns.com/BondTradingCaseStudy.html 
46
3. JMS (Java Message Service) 
47
JMS là gì? 
JMS là một tập các Java interfaces kết hợp với các APIs định nghĩa cách thức một JMS client truy cập tới các chức năng của một hệ thống thông điệp 
Hỗ trợ các cơ chế truyền thông điệp 
Synchronous or Asynchronous 
 
transacted 
 
Guaranteed 
 
Durable 
48
JMS là gì? (tiếp) 
Hỗ trợ các mô hình truyền thông điệp 
Point-to-point (hàng đợi tin cậy) 
Publish/Subscribe 
Message selectors (phía nhận) 
5 loại message 
49
JMS là một API 
50 
JavaTM Application 1 
JMS API 
JMS Provider 
JMS Provider 
JMS Provider 
JMS Provider 
JMS Provider 
IBM MQSeries 
Progress 
SonicMq 
Fiorano 
BEA 
SUN MQ
JMS và J2EE 
Cho phép Java developers truy cập tới hệ thống truyền thông điệp 
Là 1 phần của bộ J2EE Enterprise 
51 
JMS
3. Kiến trúc của 1 ứng dụng JMS 
52
Các thành phần kiến trúc JMS 
JMS clients 
Messages 
JMS Provider (Messaging systems) 
JNDI administered objects 
Destination 
ConnectionFactory 
53
Các thành phần kiến trúc JMS 
Administrative 
Tool 
JNDI Namespace 
JMS Client 
JMS Provider 
Bind 
Lookup 
Logical 
Connection
Kiến trúc ứng dụng JMS 
JMS clients: Bộ sinh/ nhận 
Các thông điệp: Đối tượng truyền thông giữa các client. 
Các đối tượng quản lý: Connection factories và destinations 
55
Các thuật ngữ trong JMS 
Domain (Mô hình truyền thông điệp) 
Point-to-point, publish/subscribe 
Session 
Connection 
Destination 
Produce, send, publish 
Consume, receive, subscribe 
56
JMS Domains (Mô hình truyền thông điệp) 
57
JMS Domains (Mô hình truyền thông điệp) 
JMS Point-to-Point 
Các thông điệp trong 1 queue có thể là persistent hoặc non-persistent 
JMS Pub/Sub 
Non-durable 
Durable 
58
JMS Pub/Sub Non-durable và JMS Pub/Sub Durable 
Non-durable 
Các thông điệp là sẵn có chỉ trong thời gian subscribers là active 
Nếu subscriber không active (không được connected), nó sẽ thiếu các thông điệp được cung cấp trong suốt thời gian vắng mặt 
Durable 
Các thông điệp được lưu giữ tại đại diện của subscriber không có mặt lúc thông điệp được sinh ra 
59
JMS Messages 
60
JMS Messages 
Thông điệp là các thức truyền tin giữa các applications 
Các message được truyền thực sự biến đổi tùy theo hệ thống truyền thông điệp 
Một hệ thống có thể chỉ giao tiếp được với duy nhất 1 loại hệ thống thông điệp khác 
61
Message Java Interface 
JMS cung cấp 1 mô hình “unified” và “abstract” qua Interface này 
Đối tượng thực thi thực sự của interface này tùy theo provider 
62
Message Components 
Header 
Properties 
Body 
63 
Header Properties Body 
Message
Message header 
Được sử dụng để định danh message và routing 
Chứa Destination 
Có thể bao gồm cả dữ liệu sau: 
delivery mode (persistent, nonpersistent) 
 
message ID 
 
timestamp 
 
priority 
 
ReplyTo 
64
Các trường của Message header 
JMSDestination 
JMSDeliveryMode 
persistent or nonpersistent 
JMSMessageID 
JMSTimeStamp 
JMSRedelivered 
JMSExpiration 
65
Message header fields 
JMSPriority 
JMSCorrelationID 
JMSReplyTo 
đối tượng Destination của một client; nơi gửi thông điệp trả lời 
JMSType 
Type of message body 
66 
replyMsg.setJMSCorrelationID(requestMsg.getJMSMessageID()); 
Queue replyQ = (Queue)ctx.lookup(jmsReplyQ); requestMsg.setJMSReplyTo(replyQ);
Message Properties 
Các fields tùy theo Application 
Các fields do provider chỉ định 
Optional fields 
Các properties là các cặp Name/value 
Values có thể là byte, int, String, … 
67
Message body 
Lưu trữ nội dung thông điệp 
Hỗ trợ một số types 
Mỗi type được định nghĩa bởi 1 message interface: 
StreamMessage 
 
MapMessage 
 
TextMessage 
 
ObjectMessage 
 
BytesMessage 
68
Message Body Interfaces 
StreamMessage 
Chứa các giá trị Java primitive 
Được đọc tuần tự 
MapMessage 
Lưu trữ các cặp name/value 
Được đọc tuần tự hoặc theo name 
BytesMessage 
Uninterpreted bytes 
Được sử dụng để match 1 định dạng thông điệp có trước 
69
Ví dụ: tạo 1 thông điệp text 
Để tạo 1 TextMessage đơn giản: 
TextMessage message = 
session.createTextMessage(); 
message.setText("greetings"); 
70
Ví dụ: tạo 1 object message 
Để tạo một ObjectMesage đơn giản: 
ObjectMessage message = 
session.createObjectMessage(); 
message.setObject(myObject); 
Lưu ý: 
myObject phải implement java.io.Serializable 
71
4. JMS Programming APIs 
72
Các đối tượng JMS 
73
Destination Java Interface 
Là trừu tượng hóa của topic & queue 
Là interface cha của Queue và Topic interface 
74 
<<Interface>> 
Topic 
(from jms) 
<<Interface>> 
Queue 
(from jms) 
<<Interface>> 
Destination 
(from jms) 
getTopicName() : String toString() : String 
getQueueName() : String toString() : String
Destination 
Destination là đối tượng được quản lý (là đối tượng phân tán) 
Là kênh truyền thông 
String subject; 
javax.jms.Session session; 
javax.jms.Destination destination; 
destination = session.createTopic(subject); 
destination = session.createQueue(subject); 
75
ConnectionFactory Java Interface 
Factory class để tạo 1 connection từ provider đến JMS server 
Tương tự như driver manager (java.sql.DriverManager) trong JDBC 
Là interface cha của: 
QueueConnectionFactory interface 
TopicConnectionFactory interface 
76
ConnectionFactory Java Interface 
77 
<<Interface>> 
QueueConnectionFactory 
(from jms) 
<<Interface>> 
TopicConnectionFactory 
(from jms) 
<<Interface>> 
ConnectionFactory 
(from jms) 
createTopicConnection() createTopicConnection() 
createQueueConnection() createQueueConnection()
Connection Factory 
Connection Factory là đối tượng được quản lý (phân tán). 
Điểm truy nhập tới JMS server 
Cần thiết để kết nối tới một JMS server 
ConnectionFactory connectionFactory = 
new XXXXXConnectionFactory(user, password, url); 
// url: e.g. tcp://localhost:61616 
78
Connection Java Interface 
Là trừu tượng hóa, biểu diễn một kênh giao tiếp tới JMS provider 
Được tạo từ 1 đối tượng ConnectionFactory 
Một connection nên được đóng khi chương trình sử dụng xong nó 
79
Connection Java Interface 
80 
<<Interface>> Connection (from jms) 
<<Interface>> 
QueueConnection 
(from jms) 
<<Interface>> TopicConnection (from jms) 
getClientID() setClientID() getMetaData() getExceptionListener() setExceptionListener() start() 
stop() 
close() 
createTopicSession() 
createConnectionConsumer() 
createDurableConnectionConsumer() 
createQueueSession() 
createConnectionConsumer()
Đối tượng Connection 
Đóng gói socket TCP/IP giữa một client và một JMS server 
Tạo ra session giữa bộ nhận/sinh và server 
javax.jms.Connection connection; 
connection = connectionFactory.createConnection(); 
connection.start(); 
... 
connection.stop();//temporary stop message delivery 
... 
connection.start(); 
... 
connection.close(); 
81
Session Java Interface 
Được tạo từ 1 đối tượng Connection 
Một khi được kết nối tới provider thông qua 1 Connection, tất cả các công việc được thực hiện dưới ngữ cảnh của 1 Session 
Một session ứng với một thread, tức là mọi thông điệp gửi và nhận tuần tự, tiếp nối nhau 
82
Session Java Interface 
83 
<<Interface>> Session 
(from jms) 
$ AUTO_ACKNOWLEDGE : int = 1 
$ CLIENT_ACKNOWLEDGE : int = 2 
$ DUPS_OK_ACKNOWLEDGE : int = 3 
createBytesMessage() createMapMessage() createMessage() createObjectMessage() createObjectMessage() createStreamMessage() createTextMessage() getTransacted() commit() rollback() close() recover() getMessageListener() run() 
<<Interface>> QueueSession 
(from jms) 
<<Interface>> TopicSession 
(from jms) 
createQueue() 
createReceiver() 
createSender() 
createBrowser() 
createTemporaryQueue() 
createTopic() 
createSubscriber() c 
reateDurableSubscriber() 
createPublisher() 
createTemporaryTopic() 
unsubscribe()
Session 
Tạo ra MessageProducer và MessageConsumer 
Đảm bảo thứ tự các thông điệp (xác định bởi số hiệu của chúng và destination trong phiên) 
Nằm trong 1 thread 
javax.jms.Session session; 
session = connection.createSession(transactionMode, ackMode); 
84
MessageProducer Java Interface 
85 
<<Interface>> MessageProducer (from jms) 
<<Interface>> 
QueueSender (from jms) 
<<Interface>> 
TopicPublisher (from jms) 
setDisableMessageID() 
setDisableMessageTimestamp() 
setDeliveryMode() 
getDeliveryMode() 
setPriority() 
setTimeToLive() 
getTimeToLive() 
close() 
getQueue() 
send() 
getTopic() 
publish()
MessageProducer Java Interface 
Client muốn nhận thông điệp tạo đối tượng MessageConsumer thông qua đối tượng Session 
Đối tượng MessageConsumer được gắn với 1 đối tượng Destination 
Client có thể nhận thông điệp theo 1 trong 2 chế độ: 
Blocking 
Non-blocking 
86
Message Producer 
Tạo ra bởi 1 session 
Gửi các thông điệp tới destination 
javax.jms.MessageProducer producer; 
javax.jms.TextMessage message; 
producer = session.createProducer(destination); 
... 
message = session.createTextMessage(texte); 
producer.send(message); 
87
Nhận thông điệp trong chế độ Blocking 
Client gọi phương thức receive() của đối tượng MessageConsumer 
Client blocks cho đến khi có được thông điệp 
88
Nhận thông điệp ở chế độ Non-blocking 
Client đăng ký 1 đối tượng MessageListener 
Client không bị block 
Khi một message đến, JMS provider gọi phương thức onMessage() của đối tượng MessageListener 
89
MessageConsumer Java Interface 
90 
<<Interface>> MessageConsumer 
(from jms) 
<<Interface>> TopicSubscriber (from jms) 
<<Interface>> TopicSubscriber (from jms) 
getMessageSelector() getMessageListener() setMessageListener() 
receive() 
receiveNoWait() 
close() 
getQueue() 
getTopic() 
getNoLocal()
Message Consumer 
Tạo ra bởi 1 session 
nhận thông điệp từ destination 
javax.jms.MessageConsumer consumer; 
javax.jms.Message message; 
consumer = session.createConsumer(destination); 
message = consumer.receive(); // synchronous receive 
91
Message Listener 
Bộ quản lý sự kiện không đồng bộ 
Cài đặt giao diện MessageListener với phương thức onMessage 
Một message listener được đăng ký với MessageConsumer 
public class MyListener implements MessageListener { 
public void onMessage(Message message) { 
... 
} 
} 
MyListener messageListener; 
consumer.setMessageListener(messageListener); 
92
JMS APIs 
93
JMS API 
94
6. Các bước viết JMS clients 
95
6.1. Các bước viết JMS Sender Application 
96
Các bước viết JMS Sender Application 
1. Lấy đối tượng ConnectionFactory và Destination (Topic hoặc Queue) qua JNDI 
2. Tạo 1 Connection 
3. Tạo 1 Session để send/receive thông điệp 
4. Tạo 1 MessageProducer (TopicPublisher hoặc QueueSender) 
5. Start connection 
6. Send (publish) thông điệp 
7. Đóng Session và Connection 
97
(1) Lấy đối tượng ConnectionFactory và Destination (Topic hoặc Queue) qua JNDI 
// Get JNDI InitialContext object 
Context jndiContext = new InitialContext(); 
// Locate ConnectionFactory object via JNDI 
TopicConnectionFactory factory = 
(TopicConnectionFactory) jndiContext.lookup( 
"MyTopicConnectionFactory"); 
// Locate Destination object (Topic or Queue) 
// through JNDI 
Topic weatherTopic = 
(Topic) jndiContext.lookup("WeatherData"); 
98
(2) Tạo Connection Object 
// Create a Connection object from 
// ConnectionFactory object 
TopicConnection topicConnection = 
factory.createTopicConnection(); 
99
(3) Tạo 1 Session 
// Create a Session from Connection object. 
// 1st parameter controls transaction 
// 2nd parameter specifies acknowledgment type 
TopicSession session = 
topicConnection.createTopicSession (false, Session.CLIENT_ACKNOWLEDGE); 
100
(4) Tạo Message Producer 
// Create MessageProducer from Session object 
// TopicPublisher for Pub/Sub 
// QueueSender for Point-to-Point 
TopicPublisher publisher = 
session.createPublisher(weatherTopic); 
101
(5) Start Connection 
// Until Connection gets started, message flow 
// is inhibited: Connection must be started before 
// messages will be transmitted. 
topicConnection.start(); 
102
(6) Publish thông điệp 
// Create a Message 
TextMessage message = 
session.createMessage(); 
message.setText("text:35 degrees"); 
// Publish the message 
publisher.publish(message); 
103
6.2.1. Các bước viết JMS Application Receiver theo chế độ Non-blocking 
104
Các bước viết JMS Application Receiver theo chế độ Non-blocking 
1. Lấy đối tượng ConnectionFactory và Destination (Topic hoặc Queue) qua JNDI 
2. Tạo 1 Connection 
3. Tạo 1 Session để send/receive thông điệp 
4. Tạo 1 MessageConsumer (TopicSubscriber hoặc QueueReceiver) 
5. Đăng ký MessageListener cho chế độ non- blocking 
6. Start Connection 
7. Đóng Session và Connection 
105
(4) Tạo Message Subscriber 
// Create Subscriber from Session object 
TopicSubscriber subscriber = 
session.createSubscriber(weatherTopic); 
106
(5) Đăng ký MessageListener cho chế độ non-blocking 
// Create MessageListener object 
WeatherListener myListener 
= new WeatherListener(); 
// Register MessageListener with 
// TopicSubscriber object subscriber.setMessageListener(myListener); 
107
6.2.2. Các bước viết JMS Application Receiver theo chế độ blocking 
108
Các bước viết JMS Application Receiver theo chế độ blocking 
1. Lấy đối tượng ConnectionFactory và Destination (Topic hoặc Queue) qua JNDI 
2. Tạo 1 Connection 
3. Tạo 1 Session để send/receive thông điệp 
4. Tạo 1 MessageConsumer 
5. Start Connection 
6. Nhận message 
7. Đóng Session và Connection 
109
6.3. Cách thức tạo một ứng dụng JMS có tính chịu lỗi 
110
Theo cách thức tin cậy nhất 
Cách tin cậy nhất để produce một thông điệp là gửi một PERSISTENT message trong một giao dịch 
Cách tin cậy nhất để consume một thông điệp là thực hiện trong một giao dịch, hoặc từ một queue, hoặc từ một subscription “bền lâu” tới một topic 
111
Độ tin cậy cơ bản 
Điều khiển việc thừa nhận thông điệp 
Chỉ định truyền thông điệp Persistent 
Thiết lập các mức ưu tiên thông điệp 
Cho phép thông điệp hết hạn 
Tạo các destination tạm thời 
112
Các cơ chế với độ tin cậy nâng cao 
Tạo các durable subscriptions 
Sử dụng các giao dịch cục bộ (local transactions) 
113
6.3.1. Điều khiển việc thừa nhận thông điệp 
114
Các pha xử lý thông điệp nhận được 
Client nhận thông điệp 
Client xử lý thông điệp 
Thông điệp được acknowledged 
Việc thừa nhận được khởi tạo hoặc bởi JMS provider, hoặc bởi client, tùy theo chế độ thừa nhận của Session 
Session.AUTO_ACKNOWLEDGE 
Session.CLIENT_ACKNOWLEDGE: Bên nhận gọi message.acknowledge() 
Session.DUPS_OK_ACKNOWLEDGE: Ví lý do hiệu năng, JMS server cho phép acknowledge mà ko lưu lại ngữ cảnh, cho phép trùng lặp thông điệp. 
115
Transaction và Acknowledgment 
Trong các sessions giao dịch hóa: 
Việc thừa nhận (ACK) xảy ra tự động khi một transaction được commit 
Nếu 1 transaction được roll back, tất cả các thông điệp đã được “tiêu thụ” sẽ được truyền lại 
Trong các sessions giao dịch hóa 
Khi nào & cách thức 1 thông điệp được thừa nhận phụ thuộc vào giá trị được chỉ định (slide tiếp) làm tham số thứ 2 của phương thức createSession 
116
Acknowledgment Types 
Auto acknowledgment (AUTO_ACKNOWLEDGE) 
Thông điệp được xem như đã được thừa nhận khi trả về thành công trong MessageConsumer.receive() và MessageListener.onMessage() 
Client acknowledgment (CLIENT_ACKKNOWLEDGE) 
Client phải gọi phương thức acknowledge() của đối tượng Message 
Lazy acknowledgment (DUPS_OK_ACKNOWLEDGE) 
Thông điệp được thừa nhận ngay khi chúng đến với consumers 
117
Cách thức thiết lập Acknowledgment Type trong JMS 
Một Acknowledgment Type được thiết lập khi tạo Session bằng cách thiết lập cờ thích hợp 
QueueConnection.createQueueSession(..,<flag>) 
TopicConnection.createTopicSession(.., <flag>) 
Ví dụ: 
TopicSession session = 
topicConnection.createTopicSession (false, Session.CLIENT_ACKNOWLEDGE); 
118
6.3.2. Chỉ định truyền thông điệp Persistent (Các chế độ truyền) 
119
2 chế độ truyền 
Chế độ truyền PERSISTENT 
Mặc định 
Hướng dẫn JMS provider thực hiện các hành động cần thiết để 1 thông điệp không bị mất khi truyền trong trường hợp gặp sự cố 
Chế độ truyền NON_PERSISTENT 
Không yêu cầu JMS provider lưu trữ thông điệp 
Hiệu năng tốt hơn 
120
Cách thức thiết lập chế độ truyền 
Phương thức setDeliveryMode của interface MessageProducer 
producer.setDeliveryMode(DeliveryMode.NON_PERSISTENT); 
Sử dụng kiểu sau của phương thức send hoặc publish 
producer.send(message, DeliveryMode.NON_PERSISTENT, 3,10000); 
121
6.3.3. Thiết lập các mức ưu tiên thông điệp 
122
Cách thức thiết lập mức ưu tiên khi truyền 
Có 10 mức ưu tiên 
Từ 0 (thấp nhất)-9 (cao nhất) 
Mặc định là 4 
Sử dụng phương thức setPriority của interface MessageProducer 
producer.setPriority(7); 
Sử dụng kiểu sau của phương thức send hoặc publish 
producer.send(message, DeliveryMode.NON_PERSISTENT, 7, 10000); 
123
6.3.4. Cho phép thông điệp hết hạn 
124
Cách thức thiết lập thông số hết hạn cho thông điệp 
Sử dụng phương thức setTimeToLive của interface MessageProducer 
producer.setTimeToLive(60000); 
Sử dụng kiểu sau của phương thức send hoặc publish 
producer.send(message, DeliveryMode.NON_PERSISTENT, 3, 60000); 
125
6.3.5. Tạo các durable subscriptions 
126
Độ tin cậy cực đại 
Để đảm bảo 1 ứng dụng pub/sub nhận được tất cả các published messages 
Sử dụng chế độ truyền PERSISTENT cho publishers 
Thêm vào đó, sử dụng các durable subscriptions cho các subscribers 
Sử dụng phương thức Session.createDurableSubscriber để tạo 1 durable subscriber 
String clientId; 
connection.setClientID(clientId); 
consumer = session.createDurableSubscriber((Topic) destination, consumerName); 
127
Cách thức durable subscription làm việc 
Một durable subscription có thể có chỉ 1 subcriber active tại 1 thời điểm 
Một durable subscriber đăng ký 1 durable subscription bằng việc chỉ ra 1 định danh duy nhất lưu trữ bởi JMS provider 
Các đối tượng subscriber sau có cùng định danh sẽ bắt đầu lại subscription ở trạng thái của các subscriber trước đó 
Nếu 1 durable subscription không có susbcriber active nào, JMS provider sẽ lưu các thông điệp của subscription cho đến khi chúng được nhận bởi subscription hoặc cho đến khi nó hết hạn 
128
6.3.6. Giao dịch trong JMS 
129
Giao dịch trong JMS 
Phạm vi giao dịch là chỉ giữa client và hệ thống thông điệp, không phải giữa các client 
1 nhóm các thông điệp được phát ra như 1 đơn vị (từ phía gửi) 
1 nhóm các thông điệp được nhận lại như 1 đơn vị (từ phía nhận) 
Các giao dịch “Local” và “Distributed” 
130
Giao dịch cục bộ trong JMS 
Các giao dịch cục bộ được điều khiển bởi đối tượng Session 
Giao dịch bắt đầu khi 1 session được tạo 
Không có phương thức “bắt đầu giao dịch” tường minh 
Giao dịch kết thúc khi gọi Session.commit() hoặc Session.abort() 
Transactional session được tạo ra bằng cách chỉ định cờ thích hợp khi tạo 1 session 
QueueConnection.createQueueSession(true, ..) 
 
TopicConnection.createTopicSession(true, ..) 
131
Giao dịch phân tán trong JMS 
Được điều hành bởi 1 transactional manager 
Các ứng dụng sẽ điều khiển giao dịch qua các phương thức JTA 
Cấm sử dụng Session.commit() và Session.rollback() 
132
6.3.7. Message Selector 
133
JMS Message Selector 
(Receiver) JMS application sử dụng 1 bộ chọn để lấy ra chỉ những thông điệp quan tâm 
Một bộ chọn cơ bản nhất là 1 xâu SQL92, chỉ rõ luật chọn (hay lọc) 
134
Ví dụ: JMS message selectors 
Bộ chọn không thể tham chiếu đến nội dung của 1 thông điệp 
Có thể truy cập tới properties và header 
Ví dụ 
JMSType==’wasp’ 
 
phone LIKE ‘223’ 
 
price BETWEEN 100 AND 200 
 
name IN(‘sameer’,’tyagi’) 
 
JMSType IS NOT NULL 
135
Xử lý ngoại lệ 
exception cơ sở: JMSException 
Các lớp kế thừa: IllegalStateException, InvalidClientIDException, InvalidDestinationException, InvalidSelectorException, JMSSecurityException, MessageEOFException, MessageFormatException, 
MessageNotReadableException, MessageNotWriteableException, 
ResourceAllocationException, TransactionInProgressException, 
TransactionRolledBackException 
136
7. Các đặc tính thông điệp không được định nghĩa trong JMS 
137
Các đặc tính thông điệp không được định nghĩa trong JMS 
Encryption 
JMS giả thiết hệ thống thông điệp đã xử lý rồi 
Điều khiển truy cập 
JMS giả thiết hệ thống thông điệp đã xử lý rồi 
Load balancing 
Quản trị các queue và topic 
138
8. Xử lý giao dịch 
boolean transactionMode=true; 
javax.jms.Session session; 
session=connection.createSession(transactionMode, ackMode); 
.... 
session.commit(); 
session.rollback(); 
139
Phụ lục
Kiến trúc của ứng dụng JMS 
142 
JMS Application (JMS Client) 
JMS API 
(vendor neutral) 
JMS provider 
(vendor specific) 
JMS Application 
(JMS Client) 
JMS API (vendor neutral) 
JMS provider (vendor specific) 
Mesaging service

More Related Content

What's hot

Chapter 8 fault tolerance full
Chapter 8   fault tolerance fullChapter 8   fault tolerance full
Chapter 8 fault tolerance full
Trần Thanh Huyền
 
Ex 1 chapter04-transport-layer-tony_chen - tieng viet
Ex 1 chapter04-transport-layer-tony_chen - tieng vietEx 1 chapter04-transport-layer-tony_chen - tieng viet
Ex 1 chapter04-transport-layer-tony_chen - tieng viet
Đô GiẢn
 
Mo hinh osi compatibility mode
Mo hinh osi compatibility modeMo hinh osi compatibility mode
Mo hinh osi compatibility mode
24071983
 
Bao cao do an ltm hoan chinh
Bao cao do an ltm hoan chinhBao cao do an ltm hoan chinh
Bao cao do an ltm hoan chinh
Ngok Ánk
 
Network 1206754309287969-2
Network 1206754309287969-2Network 1206754309287969-2
Network 1206754309287969-2
Tiệu Vây
 
Slides Lập trình mạng
Slides Lập trình mạngSlides Lập trình mạng
Slides Lập trình mạng
asakebigone
 
Các giao thức sử dụng trong các lớp của mô hình osi
Các giao thức sử dụng trong các lớp của mô hình osiCác giao thức sử dụng trong các lớp của mô hình osi
Các giao thức sử dụng trong các lớp của mô hình osi
UDCNTT
 
Ex 1 chapter05-network-layer-tony_chen - tieng viet1
Ex 1 chapter05-network-layer-tony_chen - tieng viet1Ex 1 chapter05-network-layer-tony_chen - tieng viet1
Ex 1 chapter05-network-layer-tony_chen - tieng viet1
Đô GiẢn
 
Ex 1 chapter05-network-layer-tony_chen - tieng viet
Ex 1 chapter05-network-layer-tony_chen - tieng vietEx 1 chapter05-network-layer-tony_chen - tieng viet
Ex 1 chapter05-network-layer-tony_chen - tieng viet
Đô GiẢn
 

What's hot (19)

Naming - Định danh trong các hệ thống phân tán
Naming - Định danh trong các hệ thống phân tánNaming - Định danh trong các hệ thống phân tán
Naming - Định danh trong các hệ thống phân tán
 
Chapter 8 fault tolerance full
Chapter 8   fault tolerance fullChapter 8   fault tolerance full
Chapter 8 fault tolerance full
 
Ex 1 chapter04-transport-layer-tony_chen - tieng viet
Ex 1 chapter04-transport-layer-tony_chen - tieng vietEx 1 chapter04-transport-layer-tony_chen - tieng viet
Ex 1 chapter04-transport-layer-tony_chen - tieng viet
 
Mo hinh osi compatibility mode
Mo hinh osi compatibility modeMo hinh osi compatibility mode
Mo hinh osi compatibility mode
 
Mô hình-osi
Mô hình-osiMô hình-osi
Mô hình-osi
 
chương 4 - TCP/IP - mạng máy tính
chương 4 - TCP/IP - mạng máy tínhchương 4 - TCP/IP - mạng máy tính
chương 4 - TCP/IP - mạng máy tính
 
Bao cao do an ltm hoan chinh
Bao cao do an ltm hoan chinhBao cao do an ltm hoan chinh
Bao cao do an ltm hoan chinh
 
Phan 1 sv
Phan 1   svPhan 1   sv
Phan 1 sv
 
Network 1206754309287969-2
Network 1206754309287969-2Network 1206754309287969-2
Network 1206754309287969-2
 
Network
NetworkNetwork
Network
 
Báo Cáo Cơ Sở Truyền Số Liệu
Báo Cáo Cơ Sở Truyền Số LiệuBáo Cáo Cơ Sở Truyền Số Liệu
Báo Cáo Cơ Sở Truyền Số Liệu
 
Lt socket
Lt socketLt socket
Lt socket
 
Slides Lập trình mạng
Slides Lập trình mạngSlides Lập trình mạng
Slides Lập trình mạng
 
Peer to peer
Peer to peerPeer to peer
Peer to peer
 
Các giao thức sử dụng trong các lớp của mô hình osi
Các giao thức sử dụng trong các lớp của mô hình osiCác giao thức sử dụng trong các lớp của mô hình osi
Các giao thức sử dụng trong các lớp của mô hình osi
 
Mang co ban
Mang co banMang co ban
Mang co ban
 
Ex 1 chapter05-network-layer-tony_chen - tieng viet1
Ex 1 chapter05-network-layer-tony_chen - tieng viet1Ex 1 chapter05-network-layer-tony_chen - tieng viet1
Ex 1 chapter05-network-layer-tony_chen - tieng viet1
 
Htc.kien.truc.unix.linux
Htc.kien.truc.unix.linuxHtc.kien.truc.unix.linux
Htc.kien.truc.unix.linux
 
Ex 1 chapter05-network-layer-tony_chen - tieng viet
Ex 1 chapter05-network-layer-tony_chen - tieng vietEx 1 chapter05-network-layer-tony_chen - tieng viet
Ex 1 chapter05-network-layer-tony_chen - tieng viet
 

Similar to Dsd05 04-05-jmsa

Similar to Dsd05 04-05-jmsa (20)

Baocaotuan1
Baocaotuan1Baocaotuan1
Baocaotuan1
 
Bao cao btl f11(1)
Bao cao btl f11(1)Bao cao btl f11(1)
Bao cao btl f11(1)
 
Nghien cuu ma nguon mo openvpn
Nghien cuu ma nguon mo openvpnNghien cuu ma nguon mo openvpn
Nghien cuu ma nguon mo openvpn
 
chuong 1 - Tong quan ve Lap trinh mang.ppt
chuong 1 - Tong quan ve Lap trinh mang.pptchuong 1 - Tong quan ve Lap trinh mang.ppt
chuong 1 - Tong quan ve Lap trinh mang.ppt
 
Nhóm 9-khái-niệm-ims
Nhóm 9-khái-niệm-imsNhóm 9-khái-niệm-ims
Nhóm 9-khái-niệm-ims
 
Baocao Tong Hop
Baocao Tong HopBaocao Tong Hop
Baocao Tong Hop
 
00050001334
0005000133400050001334
00050001334
 
Cau hoi an ninh internet version 3 (1)
Cau hoi an ninh internet version 3 (1)Cau hoi an ninh internet version 3 (1)
Cau hoi an ninh internet version 3 (1)
 
bctntlvn (50).pdf
bctntlvn (50).pdfbctntlvn (50).pdf
bctntlvn (50).pdf
 
Giai ma mang
Giai ma mangGiai ma mang
Giai ma mang
 
Mmt
MmtMmt
Mmt
 
Công nghệ mạng
Công nghệ mạng Công nghệ mạng
Công nghệ mạng
 
Giáo trình mạng máy tính PTIT
Giáo trình mạng máy tính PTITGiáo trình mạng máy tính PTIT
Giáo trình mạng máy tính PTIT
 
Slide 01
Slide 01Slide 01
Slide 01
 
Datotnghiep openvpn
Datotnghiep openvpnDatotnghiep openvpn
Datotnghiep openvpn
 
SSO with SAML 2.0
SSO with SAML 2.0SSO with SAML 2.0
SSO with SAML 2.0
 
50137078 đề-tai-giao-thức-sip (1)
50137078 đề-tai-giao-thức-sip (1)50137078 đề-tai-giao-thức-sip (1)
50137078 đề-tai-giao-thức-sip (1)
 
Cluster bao cao 1
Cluster   bao cao 1Cluster   bao cao 1
Cluster bao cao 1
 
VIVAS Profile_VN
VIVAS Profile_VNVIVAS Profile_VN
VIVAS Profile_VN
 
Mailserver
MailserverMailserver
Mailserver
 

Dsd05 04-05-jmsa

  • 1. Lập trình phân tán theo chủ đề - JMS Cao Tuấn Dũng Trịnh Tuấn Đạt Vũ Hương Giang 1
  • 2. Nội dung 1. Truyền thông điệp là gì Các mô hình, tính tin dùng, giao dịch, truyền thông điệp phân tán, an toàn. 2. Tại sao cần truyền thông điệp 3. JMS là gì 4. Kiến trúc của JMS 5. APIs Lập trình JMS 6. Các bước viết JMS clients (bộ gửi và nhận) 7. Các đặc tính không có trong JMS 2
  • 3. 1. Truyền thông điệp là gì? 3
  • 4. Truyền thông điệp (messaging) Mô hình trong đó các ứng dụng liên kết lỏng với nhau thông qua việc chuyển giao các thông điệp tự - mô tả. 4
  • 5. Hệ thống truyền thông điệp Truyền thông kết nối lỏng (Loose coupled) Truyền thông không đồng bộ Thông điệp là phương tiện giao tiếp giữa các ứng dụng Các thuật ngữ gần nghĩa: MOM (Message Oriented Middleware) Messaging system Messaging server Messaging provider JMS provider 5
  • 6. Thực thể truyền thông Các bộ sinh thông điệp – producers Các bộ nhận thông điệp – consumers Sự khác nhau giữa Producer/Consumer và client/server Truyền thông 1 - n, n - 1, hoặc n – n Phía sinh không cần quan tâm tới phía nhận 6
  • 7. Liên kết lỏng Về không gian: Bộ sinh và nhận không kết nối trực tiếp qua một kênh truyền thông. Không cần biết đến danh tính của nhau. Về thời gian: Thời gian truyền thông điệp là không xác định Bộ sinh /nhận không phải có mặt tại cùng một thời điểm Về cú pháp: S/N không liên kết qua một API chung (khác với RMI) 7
  • 9. Mô hình Đẩy 9 Sinh/Kênh – chủ động
  • 11. Mô hình kéo Kênh/Nhận – chủ động 11
  • 12. Phần dẻo hướng thông điệp 12 Sender Receiver MOM Messages
  • 13. Các tính năng của phần dẻo hướng thông điệp Hỗ trợ 2 mô hình truyền thông điệp: Point-to-point: điểm-điểm Publish-Subscribe Độ tin cậy Các thao tác giao dịch Truyền thông điệp phân tán An ninh 13
  • 14. Các đặc tính thêm Truyền thông điệp thời gian thực Đảm bảo an ninh cho các giao dịch Chứng thực Cân bằng tải 14
  • 15. Một số hệ thống MOM TIBCO JMS (Java Message Service) WebsphereMQ, ActiveMQ (apache) IBM MQ (Message Queues) MSMQ (Microsoft Message Queue) 15
  • 16. 1.1. Mô hình truyền thông điệp 16
  • 17. Mô hình truyền thông điệp Point to point Một thông điệp được xử lý bởi 1 bên nhận duy nhất Publish/Subscribe Một thông điệp được xử lý bởi nhiều bên nhận 17
  • 18. Point-to-point Một thông điệp được xử lý bởi 1 bên nhận duy nhất Có thể có nhiều bên gửi “Đích” của 1 thông điệp được gọi là queue First in, first out (nếu cùng mức ưu tiên) Bên gửi (senders/producers): gửi 1 thông điệp vào 1 queue (cùng mức ưu tiên) Bên nhận (receiver/consumer): Lấy ra 1 thông điệp từ queue 18
  • 19. Point-to-point 19 Client Senders Client Receiver Queue Sends Consumes Acknowledges Posts messages to the queue Receives messages on the queue
  • 20. Hàng đợi thông điệp (MQ)  Thông điệp gửi bởi client được đưa vào hàng đợi  Khi thực thể nhận sẵn sàng, nó sẽ nhận thông điệp và xử lý 20 Producer Queue Consumer Consumer send(m1) send(m3) send(m2) receive() m1 m2 receive() Put message into queue Consume message
  • 22. Khi nào sử dụng point-to-point? Sử dụng khi tất cả các thông điệp truyền đi phải được xử lý thành công bởi 1 consumer 22
  • 23. Publish/Subscribe (Pub/Sub) Một message được xử lý bởi nhiều consumers “Destination” của 1 message gọi là topic Không phải là 1 queue Producers “publish” đến topic Consumers “subscribe” đến topic 23
  • 24. Publish-and-Subscribe 24 Client Publishers Client Subscriber Client Subscriber Publishes Subject of communication Available to registered participants Posts messages to the topic Receives messages on the topic
  • 25. Publish-Subscribe 25 Producer Broker Consumer Consumer publish(m1) Pass message to broker send(m1) send(m1) send(m2) send(m2) Dispatch message to all consumers publish(m2) publish(m3)
  • 26. Khi nào sử dụng Pub/Sub?  Sử dụng khi 1 thông điệp gửi đi cần xử lý bởi nhiều consumers  Ví dụ: ứng dụng nhân sự  Tạo “new hire” topic  Rất nhiều ứng dụng (“facilities”, “payroll”, …) subscribe “new hire” topic 26 subscribe (“AAPL”); subscribe (“SUN”); subscribe (“AAPL”); subscribe (“SUN”); publish (“AAPL”, 29.2); publish(“AAPL”, 29.3); publish (“SUN”, 43.0); publish(“SUN”, 42.7);
  • 27. 1.2. Tính tin cậy 27
  • 28. Tính tin cậy (Reliability) Đôi khi phải đảm bảo việc truyền thông điệp: Có nhiều mức độ tin cậy khác nhau Sender có thể chỉ ra mức độ tin cậy cụ thể Độ tin cậy cao thì lượng công việc càng ít hơn Đặc biệt sử dụng persistent storage để lưu trữ các thông điệp 28
  • 29. 1.3. Các thao tác giao dịch 29
  • 30. Các thao tác giao dịch Giao dịch sinh thông điệp Sender nhóm 1 loạt các thông điệp vào 1 transaction Hoặc tất cả hoặc không thông điệp nào được cho vào queue thành công Giao dịch nhận thông điệp Consumer nhận 1 nhóm các thông điệp như 1 transaction Trừ khi tất cả các thông điệp được nhận, nếu không chúng vẫn còn lai ở queue hoặc topic 30
  • 31. Phạm vi giao dịch Phạm vi Client-to-Messaging Transaction bao phủ mỗi lần tương tác nhận/gửi thông điệp JMS hỗ trợ loại này 31 Application 1 Application 2 Queue Messaging system
  • 32. Phạm vi Client-to-Client Phạm vi Client-to-Client Transaction bao phủ cả 2 client JMS không hỗ trợ phạm vi này 32 Application 1 Application 2 Queue Messaging system
  • 33. 1.4. Truyền thông điệp phân tán 33
  • 34. Truyền thông điệp phân tán Các hệ thống truyền thông điệp phân tán (Enterprise MS) có thể cung cấp hạ tầng trong đó, thông điệp được forward giữa các servers: Được gọi là “message channel” 34
  • 35. Truyền thông điệp phân tán 35 Application 1 Application 2 message Queue Queue message Messaging server 1 Messaging server 2 Message channel
  • 37. Các vấn đề an ninh Chứng thực - Authentication Hệ thống thông điệp yêu cầu client trình ra chứng chỉ được ký (signed certificates) Tính bí mật của các thông điệp Hệ thống thông điệp cung cấp cơ chế mã hóa Tính toàn vẹn dữ liệu của các thông điệp Hệ thống thông điệp cung cấp cơ chế đảm bảo toàn vẹn dữ liệu khi thông điệp được xử lý Được xử lý tùy theo nhà cung cấp 37
  • 38. 2. Tại sao cần truyền thông điệp? 38
  • 39. Tại sao cần truyền thông điệp? Độc lập Platform Độc lập theo network location Làm việc tốt với các hệ thống không đồng nhất 39
  • 40. Tại sao cần truyền thông điệp? Anonymity Who doesn’t matter  Where doesn’t matter  When doesn’t matter Ngược với hệ thống RPC Corba RMI 40
  • 41. Tại sao cần truyền thông điệp? Scalability Xử lý được với nhiều clients mà Không cần thay đổi ở application Không cần thay đổi ở architecture Không làm hỏng công việc của hệ thống Tăng công suất phần cứng nếu yêu cầu mức scalability cao hơn 41
  • 42. Tại sao cần truyền thông điệp? Khả năng chịu lỗi (robustness) Thực thể nhận có thể hỏng.  Thực thể gửi có thể hỏng.  Mạng có thể hỏng Hệ thống thông điệp vẫn tiếp tục hoạt động được bình thường 42
  • 43. Ví dụ về các ứng dụng truyền thông điệp 43
  • 44. Các ứng dụng truyền thông điệp Giao dịch thẻ tín dụng Báo cáo thời tiết Workflow Quản trị mạng Quản lý dây chuyền sản xuất Chăm sóc khách hàng Truyền thông (Voice Over IP, Paging Systems, etc.) … 44
  • 46. Bài tập đọc hiểu http://www.eaipatterns.com/BondTradingCaseStudy.html 46
  • 47. 3. JMS (Java Message Service) 47
  • 48. JMS là gì? JMS là một tập các Java interfaces kết hợp với các APIs định nghĩa cách thức một JMS client truy cập tới các chức năng của một hệ thống thông điệp Hỗ trợ các cơ chế truyền thông điệp Synchronous or Asynchronous  transacted  Guaranteed  Durable 48
  • 49. JMS là gì? (tiếp) Hỗ trợ các mô hình truyền thông điệp Point-to-point (hàng đợi tin cậy) Publish/Subscribe Message selectors (phía nhận) 5 loại message 49
  • 50. JMS là một API 50 JavaTM Application 1 JMS API JMS Provider JMS Provider JMS Provider JMS Provider JMS Provider IBM MQSeries Progress SonicMq Fiorano BEA SUN MQ
  • 51. JMS và J2EE Cho phép Java developers truy cập tới hệ thống truyền thông điệp Là 1 phần của bộ J2EE Enterprise 51 JMS
  • 52. 3. Kiến trúc của 1 ứng dụng JMS 52
  • 53. Các thành phần kiến trúc JMS JMS clients Messages JMS Provider (Messaging systems) JNDI administered objects Destination ConnectionFactory 53
  • 54. Các thành phần kiến trúc JMS Administrative Tool JNDI Namespace JMS Client JMS Provider Bind Lookup Logical Connection
  • 55. Kiến trúc ứng dụng JMS JMS clients: Bộ sinh/ nhận Các thông điệp: Đối tượng truyền thông giữa các client. Các đối tượng quản lý: Connection factories và destinations 55
  • 56. Các thuật ngữ trong JMS Domain (Mô hình truyền thông điệp) Point-to-point, publish/subscribe Session Connection Destination Produce, send, publish Consume, receive, subscribe 56
  • 57. JMS Domains (Mô hình truyền thông điệp) 57
  • 58. JMS Domains (Mô hình truyền thông điệp) JMS Point-to-Point Các thông điệp trong 1 queue có thể là persistent hoặc non-persistent JMS Pub/Sub Non-durable Durable 58
  • 59. JMS Pub/Sub Non-durable và JMS Pub/Sub Durable Non-durable Các thông điệp là sẵn có chỉ trong thời gian subscribers là active Nếu subscriber không active (không được connected), nó sẽ thiếu các thông điệp được cung cấp trong suốt thời gian vắng mặt Durable Các thông điệp được lưu giữ tại đại diện của subscriber không có mặt lúc thông điệp được sinh ra 59
  • 61. JMS Messages Thông điệp là các thức truyền tin giữa các applications Các message được truyền thực sự biến đổi tùy theo hệ thống truyền thông điệp Một hệ thống có thể chỉ giao tiếp được với duy nhất 1 loại hệ thống thông điệp khác 61
  • 62. Message Java Interface JMS cung cấp 1 mô hình “unified” và “abstract” qua Interface này Đối tượng thực thi thực sự của interface này tùy theo provider 62
  • 63. Message Components Header Properties Body 63 Header Properties Body Message
  • 64. Message header Được sử dụng để định danh message và routing Chứa Destination Có thể bao gồm cả dữ liệu sau: delivery mode (persistent, nonpersistent)  message ID  timestamp  priority  ReplyTo 64
  • 65. Các trường của Message header JMSDestination JMSDeliveryMode persistent or nonpersistent JMSMessageID JMSTimeStamp JMSRedelivered JMSExpiration 65
  • 66. Message header fields JMSPriority JMSCorrelationID JMSReplyTo đối tượng Destination của một client; nơi gửi thông điệp trả lời JMSType Type of message body 66 replyMsg.setJMSCorrelationID(requestMsg.getJMSMessageID()); Queue replyQ = (Queue)ctx.lookup(jmsReplyQ); requestMsg.setJMSReplyTo(replyQ);
  • 67. Message Properties Các fields tùy theo Application Các fields do provider chỉ định Optional fields Các properties là các cặp Name/value Values có thể là byte, int, String, … 67
  • 68. Message body Lưu trữ nội dung thông điệp Hỗ trợ một số types Mỗi type được định nghĩa bởi 1 message interface: StreamMessage  MapMessage  TextMessage  ObjectMessage  BytesMessage 68
  • 69. Message Body Interfaces StreamMessage Chứa các giá trị Java primitive Được đọc tuần tự MapMessage Lưu trữ các cặp name/value Được đọc tuần tự hoặc theo name BytesMessage Uninterpreted bytes Được sử dụng để match 1 định dạng thông điệp có trước 69
  • 70. Ví dụ: tạo 1 thông điệp text Để tạo 1 TextMessage đơn giản: TextMessage message = session.createTextMessage(); message.setText("greetings"); 70
  • 71. Ví dụ: tạo 1 object message Để tạo một ObjectMesage đơn giản: ObjectMessage message = session.createObjectMessage(); message.setObject(myObject); Lưu ý: myObject phải implement java.io.Serializable 71
  • 74. Destination Java Interface Là trừu tượng hóa của topic & queue Là interface cha của Queue và Topic interface 74 <<Interface>> Topic (from jms) <<Interface>> Queue (from jms) <<Interface>> Destination (from jms) getTopicName() : String toString() : String getQueueName() : String toString() : String
  • 75. Destination Destination là đối tượng được quản lý (là đối tượng phân tán) Là kênh truyền thông String subject; javax.jms.Session session; javax.jms.Destination destination; destination = session.createTopic(subject); destination = session.createQueue(subject); 75
  • 76. ConnectionFactory Java Interface Factory class để tạo 1 connection từ provider đến JMS server Tương tự như driver manager (java.sql.DriverManager) trong JDBC Là interface cha của: QueueConnectionFactory interface TopicConnectionFactory interface 76
  • 77. ConnectionFactory Java Interface 77 <<Interface>> QueueConnectionFactory (from jms) <<Interface>> TopicConnectionFactory (from jms) <<Interface>> ConnectionFactory (from jms) createTopicConnection() createTopicConnection() createQueueConnection() createQueueConnection()
  • 78. Connection Factory Connection Factory là đối tượng được quản lý (phân tán). Điểm truy nhập tới JMS server Cần thiết để kết nối tới một JMS server ConnectionFactory connectionFactory = new XXXXXConnectionFactory(user, password, url); // url: e.g. tcp://localhost:61616 78
  • 79. Connection Java Interface Là trừu tượng hóa, biểu diễn một kênh giao tiếp tới JMS provider Được tạo từ 1 đối tượng ConnectionFactory Một connection nên được đóng khi chương trình sử dụng xong nó 79
  • 80. Connection Java Interface 80 <<Interface>> Connection (from jms) <<Interface>> QueueConnection (from jms) <<Interface>> TopicConnection (from jms) getClientID() setClientID() getMetaData() getExceptionListener() setExceptionListener() start() stop() close() createTopicSession() createConnectionConsumer() createDurableConnectionConsumer() createQueueSession() createConnectionConsumer()
  • 81. Đối tượng Connection Đóng gói socket TCP/IP giữa một client và một JMS server Tạo ra session giữa bộ nhận/sinh và server javax.jms.Connection connection; connection = connectionFactory.createConnection(); connection.start(); ... connection.stop();//temporary stop message delivery ... connection.start(); ... connection.close(); 81
  • 82. Session Java Interface Được tạo từ 1 đối tượng Connection Một khi được kết nối tới provider thông qua 1 Connection, tất cả các công việc được thực hiện dưới ngữ cảnh của 1 Session Một session ứng với một thread, tức là mọi thông điệp gửi và nhận tuần tự, tiếp nối nhau 82
  • 83. Session Java Interface 83 <<Interface>> Session (from jms) $ AUTO_ACKNOWLEDGE : int = 1 $ CLIENT_ACKNOWLEDGE : int = 2 $ DUPS_OK_ACKNOWLEDGE : int = 3 createBytesMessage() createMapMessage() createMessage() createObjectMessage() createObjectMessage() createStreamMessage() createTextMessage() getTransacted() commit() rollback() close() recover() getMessageListener() run() <<Interface>> QueueSession (from jms) <<Interface>> TopicSession (from jms) createQueue() createReceiver() createSender() createBrowser() createTemporaryQueue() createTopic() createSubscriber() c reateDurableSubscriber() createPublisher() createTemporaryTopic() unsubscribe()
  • 84. Session Tạo ra MessageProducer và MessageConsumer Đảm bảo thứ tự các thông điệp (xác định bởi số hiệu của chúng và destination trong phiên) Nằm trong 1 thread javax.jms.Session session; session = connection.createSession(transactionMode, ackMode); 84
  • 85. MessageProducer Java Interface 85 <<Interface>> MessageProducer (from jms) <<Interface>> QueueSender (from jms) <<Interface>> TopicPublisher (from jms) setDisableMessageID() setDisableMessageTimestamp() setDeliveryMode() getDeliveryMode() setPriority() setTimeToLive() getTimeToLive() close() getQueue() send() getTopic() publish()
  • 86. MessageProducer Java Interface Client muốn nhận thông điệp tạo đối tượng MessageConsumer thông qua đối tượng Session Đối tượng MessageConsumer được gắn với 1 đối tượng Destination Client có thể nhận thông điệp theo 1 trong 2 chế độ: Blocking Non-blocking 86
  • 87. Message Producer Tạo ra bởi 1 session Gửi các thông điệp tới destination javax.jms.MessageProducer producer; javax.jms.TextMessage message; producer = session.createProducer(destination); ... message = session.createTextMessage(texte); producer.send(message); 87
  • 88. Nhận thông điệp trong chế độ Blocking Client gọi phương thức receive() của đối tượng MessageConsumer Client blocks cho đến khi có được thông điệp 88
  • 89. Nhận thông điệp ở chế độ Non-blocking Client đăng ký 1 đối tượng MessageListener Client không bị block Khi một message đến, JMS provider gọi phương thức onMessage() của đối tượng MessageListener 89
  • 90. MessageConsumer Java Interface 90 <<Interface>> MessageConsumer (from jms) <<Interface>> TopicSubscriber (from jms) <<Interface>> TopicSubscriber (from jms) getMessageSelector() getMessageListener() setMessageListener() receive() receiveNoWait() close() getQueue() getTopic() getNoLocal()
  • 91. Message Consumer Tạo ra bởi 1 session nhận thông điệp từ destination javax.jms.MessageConsumer consumer; javax.jms.Message message; consumer = session.createConsumer(destination); message = consumer.receive(); // synchronous receive 91
  • 92. Message Listener Bộ quản lý sự kiện không đồng bộ Cài đặt giao diện MessageListener với phương thức onMessage Một message listener được đăng ký với MessageConsumer public class MyListener implements MessageListener { public void onMessage(Message message) { ... } } MyListener messageListener; consumer.setMessageListener(messageListener); 92
  • 95. 6. Các bước viết JMS clients 95
  • 96. 6.1. Các bước viết JMS Sender Application 96
  • 97. Các bước viết JMS Sender Application 1. Lấy đối tượng ConnectionFactory và Destination (Topic hoặc Queue) qua JNDI 2. Tạo 1 Connection 3. Tạo 1 Session để send/receive thông điệp 4. Tạo 1 MessageProducer (TopicPublisher hoặc QueueSender) 5. Start connection 6. Send (publish) thông điệp 7. Đóng Session và Connection 97
  • 98. (1) Lấy đối tượng ConnectionFactory và Destination (Topic hoặc Queue) qua JNDI // Get JNDI InitialContext object Context jndiContext = new InitialContext(); // Locate ConnectionFactory object via JNDI TopicConnectionFactory factory = (TopicConnectionFactory) jndiContext.lookup( "MyTopicConnectionFactory"); // Locate Destination object (Topic or Queue) // through JNDI Topic weatherTopic = (Topic) jndiContext.lookup("WeatherData"); 98
  • 99. (2) Tạo Connection Object // Create a Connection object from // ConnectionFactory object TopicConnection topicConnection = factory.createTopicConnection(); 99
  • 100. (3) Tạo 1 Session // Create a Session from Connection object. // 1st parameter controls transaction // 2nd parameter specifies acknowledgment type TopicSession session = topicConnection.createTopicSession (false, Session.CLIENT_ACKNOWLEDGE); 100
  • 101. (4) Tạo Message Producer // Create MessageProducer from Session object // TopicPublisher for Pub/Sub // QueueSender for Point-to-Point TopicPublisher publisher = session.createPublisher(weatherTopic); 101
  • 102. (5) Start Connection // Until Connection gets started, message flow // is inhibited: Connection must be started before // messages will be transmitted. topicConnection.start(); 102
  • 103. (6) Publish thông điệp // Create a Message TextMessage message = session.createMessage(); message.setText("text:35 degrees"); // Publish the message publisher.publish(message); 103
  • 104. 6.2.1. Các bước viết JMS Application Receiver theo chế độ Non-blocking 104
  • 105. Các bước viết JMS Application Receiver theo chế độ Non-blocking 1. Lấy đối tượng ConnectionFactory và Destination (Topic hoặc Queue) qua JNDI 2. Tạo 1 Connection 3. Tạo 1 Session để send/receive thông điệp 4. Tạo 1 MessageConsumer (TopicSubscriber hoặc QueueReceiver) 5. Đăng ký MessageListener cho chế độ non- blocking 6. Start Connection 7. Đóng Session và Connection 105
  • 106. (4) Tạo Message Subscriber // Create Subscriber from Session object TopicSubscriber subscriber = session.createSubscriber(weatherTopic); 106
  • 107. (5) Đăng ký MessageListener cho chế độ non-blocking // Create MessageListener object WeatherListener myListener = new WeatherListener(); // Register MessageListener with // TopicSubscriber object subscriber.setMessageListener(myListener); 107
  • 108. 6.2.2. Các bước viết JMS Application Receiver theo chế độ blocking 108
  • 109. Các bước viết JMS Application Receiver theo chế độ blocking 1. Lấy đối tượng ConnectionFactory và Destination (Topic hoặc Queue) qua JNDI 2. Tạo 1 Connection 3. Tạo 1 Session để send/receive thông điệp 4. Tạo 1 MessageConsumer 5. Start Connection 6. Nhận message 7. Đóng Session và Connection 109
  • 110. 6.3. Cách thức tạo một ứng dụng JMS có tính chịu lỗi 110
  • 111. Theo cách thức tin cậy nhất Cách tin cậy nhất để produce một thông điệp là gửi một PERSISTENT message trong một giao dịch Cách tin cậy nhất để consume một thông điệp là thực hiện trong một giao dịch, hoặc từ một queue, hoặc từ một subscription “bền lâu” tới một topic 111
  • 112. Độ tin cậy cơ bản Điều khiển việc thừa nhận thông điệp Chỉ định truyền thông điệp Persistent Thiết lập các mức ưu tiên thông điệp Cho phép thông điệp hết hạn Tạo các destination tạm thời 112
  • 113. Các cơ chế với độ tin cậy nâng cao Tạo các durable subscriptions Sử dụng các giao dịch cục bộ (local transactions) 113
  • 114. 6.3.1. Điều khiển việc thừa nhận thông điệp 114
  • 115. Các pha xử lý thông điệp nhận được Client nhận thông điệp Client xử lý thông điệp Thông điệp được acknowledged Việc thừa nhận được khởi tạo hoặc bởi JMS provider, hoặc bởi client, tùy theo chế độ thừa nhận của Session Session.AUTO_ACKNOWLEDGE Session.CLIENT_ACKNOWLEDGE: Bên nhận gọi message.acknowledge() Session.DUPS_OK_ACKNOWLEDGE: Ví lý do hiệu năng, JMS server cho phép acknowledge mà ko lưu lại ngữ cảnh, cho phép trùng lặp thông điệp. 115
  • 116. Transaction và Acknowledgment Trong các sessions giao dịch hóa: Việc thừa nhận (ACK) xảy ra tự động khi một transaction được commit Nếu 1 transaction được roll back, tất cả các thông điệp đã được “tiêu thụ” sẽ được truyền lại Trong các sessions giao dịch hóa Khi nào & cách thức 1 thông điệp được thừa nhận phụ thuộc vào giá trị được chỉ định (slide tiếp) làm tham số thứ 2 của phương thức createSession 116
  • 117. Acknowledgment Types Auto acknowledgment (AUTO_ACKNOWLEDGE) Thông điệp được xem như đã được thừa nhận khi trả về thành công trong MessageConsumer.receive() và MessageListener.onMessage() Client acknowledgment (CLIENT_ACKKNOWLEDGE) Client phải gọi phương thức acknowledge() của đối tượng Message Lazy acknowledgment (DUPS_OK_ACKNOWLEDGE) Thông điệp được thừa nhận ngay khi chúng đến với consumers 117
  • 118. Cách thức thiết lập Acknowledgment Type trong JMS Một Acknowledgment Type được thiết lập khi tạo Session bằng cách thiết lập cờ thích hợp QueueConnection.createQueueSession(..,<flag>) TopicConnection.createTopicSession(.., <flag>) Ví dụ: TopicSession session = topicConnection.createTopicSession (false, Session.CLIENT_ACKNOWLEDGE); 118
  • 119. 6.3.2. Chỉ định truyền thông điệp Persistent (Các chế độ truyền) 119
  • 120. 2 chế độ truyền Chế độ truyền PERSISTENT Mặc định Hướng dẫn JMS provider thực hiện các hành động cần thiết để 1 thông điệp không bị mất khi truyền trong trường hợp gặp sự cố Chế độ truyền NON_PERSISTENT Không yêu cầu JMS provider lưu trữ thông điệp Hiệu năng tốt hơn 120
  • 121. Cách thức thiết lập chế độ truyền Phương thức setDeliveryMode của interface MessageProducer producer.setDeliveryMode(DeliveryMode.NON_PERSISTENT); Sử dụng kiểu sau của phương thức send hoặc publish producer.send(message, DeliveryMode.NON_PERSISTENT, 3,10000); 121
  • 122. 6.3.3. Thiết lập các mức ưu tiên thông điệp 122
  • 123. Cách thức thiết lập mức ưu tiên khi truyền Có 10 mức ưu tiên Từ 0 (thấp nhất)-9 (cao nhất) Mặc định là 4 Sử dụng phương thức setPriority của interface MessageProducer producer.setPriority(7); Sử dụng kiểu sau của phương thức send hoặc publish producer.send(message, DeliveryMode.NON_PERSISTENT, 7, 10000); 123
  • 124. 6.3.4. Cho phép thông điệp hết hạn 124
  • 125. Cách thức thiết lập thông số hết hạn cho thông điệp Sử dụng phương thức setTimeToLive của interface MessageProducer producer.setTimeToLive(60000); Sử dụng kiểu sau của phương thức send hoặc publish producer.send(message, DeliveryMode.NON_PERSISTENT, 3, 60000); 125
  • 126. 6.3.5. Tạo các durable subscriptions 126
  • 127. Độ tin cậy cực đại Để đảm bảo 1 ứng dụng pub/sub nhận được tất cả các published messages Sử dụng chế độ truyền PERSISTENT cho publishers Thêm vào đó, sử dụng các durable subscriptions cho các subscribers Sử dụng phương thức Session.createDurableSubscriber để tạo 1 durable subscriber String clientId; connection.setClientID(clientId); consumer = session.createDurableSubscriber((Topic) destination, consumerName); 127
  • 128. Cách thức durable subscription làm việc Một durable subscription có thể có chỉ 1 subcriber active tại 1 thời điểm Một durable subscriber đăng ký 1 durable subscription bằng việc chỉ ra 1 định danh duy nhất lưu trữ bởi JMS provider Các đối tượng subscriber sau có cùng định danh sẽ bắt đầu lại subscription ở trạng thái của các subscriber trước đó Nếu 1 durable subscription không có susbcriber active nào, JMS provider sẽ lưu các thông điệp của subscription cho đến khi chúng được nhận bởi subscription hoặc cho đến khi nó hết hạn 128
  • 129. 6.3.6. Giao dịch trong JMS 129
  • 130. Giao dịch trong JMS Phạm vi giao dịch là chỉ giữa client và hệ thống thông điệp, không phải giữa các client 1 nhóm các thông điệp được phát ra như 1 đơn vị (từ phía gửi) 1 nhóm các thông điệp được nhận lại như 1 đơn vị (từ phía nhận) Các giao dịch “Local” và “Distributed” 130
  • 131. Giao dịch cục bộ trong JMS Các giao dịch cục bộ được điều khiển bởi đối tượng Session Giao dịch bắt đầu khi 1 session được tạo Không có phương thức “bắt đầu giao dịch” tường minh Giao dịch kết thúc khi gọi Session.commit() hoặc Session.abort() Transactional session được tạo ra bằng cách chỉ định cờ thích hợp khi tạo 1 session QueueConnection.createQueueSession(true, ..)  TopicConnection.createTopicSession(true, ..) 131
  • 132. Giao dịch phân tán trong JMS Được điều hành bởi 1 transactional manager Các ứng dụng sẽ điều khiển giao dịch qua các phương thức JTA Cấm sử dụng Session.commit() và Session.rollback() 132
  • 134. JMS Message Selector (Receiver) JMS application sử dụng 1 bộ chọn để lấy ra chỉ những thông điệp quan tâm Một bộ chọn cơ bản nhất là 1 xâu SQL92, chỉ rõ luật chọn (hay lọc) 134
  • 135. Ví dụ: JMS message selectors Bộ chọn không thể tham chiếu đến nội dung của 1 thông điệp Có thể truy cập tới properties và header Ví dụ JMSType==’wasp’  phone LIKE ‘223’  price BETWEEN 100 AND 200  name IN(‘sameer’,’tyagi’)  JMSType IS NOT NULL 135
  • 136. Xử lý ngoại lệ exception cơ sở: JMSException Các lớp kế thừa: IllegalStateException, InvalidClientIDException, InvalidDestinationException, InvalidSelectorException, JMSSecurityException, MessageEOFException, MessageFormatException, MessageNotReadableException, MessageNotWriteableException, ResourceAllocationException, TransactionInProgressException, TransactionRolledBackException 136
  • 137. 7. Các đặc tính thông điệp không được định nghĩa trong JMS 137
  • 138. Các đặc tính thông điệp không được định nghĩa trong JMS Encryption JMS giả thiết hệ thống thông điệp đã xử lý rồi Điều khiển truy cập JMS giả thiết hệ thống thông điệp đã xử lý rồi Load balancing Quản trị các queue và topic 138
  • 139. 8. Xử lý giao dịch boolean transactionMode=true; javax.jms.Session session; session=connection.createSession(transactionMode, ackMode); .... session.commit(); session.rollback(); 139
  • 141.
  • 142. Kiến trúc của ứng dụng JMS 142 JMS Application (JMS Client) JMS API (vendor neutral) JMS provider (vendor specific) JMS Application (JMS Client) JMS API (vendor neutral) JMS provider (vendor specific) Mesaging service