142
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

Dsd05 04-05-jmsa

Embed Size (px)

DESCRIPTION

qlda

Citation preview

Page 1: Dsd05 04-05-jmsa

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

Page 2: Dsd05 04-05-jmsa

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

Page 3: Dsd05 04-05-jmsa

1. Truyền thông điệp là gì?

3

Page 4: Dsd05 04-05-jmsa

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

Page 5: Dsd05 04-05-jmsa

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

Page 6: Dsd05 04-05-jmsa

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

Page 7: Dsd05 04-05-jmsa

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

Page 8: Dsd05 04-05-jmsa

Kênh truyền thông

8

Page 9: Dsd05 04-05-jmsa

Mô hình Đẩy

9

Sinh/Kênh – chủ động

Page 10: Dsd05 04-05-jmsa

Mô hình lai

10

Page 11: Dsd05 04-05-jmsa

Mô hình kéo

Kênh/Nhận – chủ động

11

Page 12: Dsd05 04-05-jmsa

Phần dẻo hướng thông điệp

12

Sender Receiver

MOM

Messages

Page 13: Dsd05 04-05-jmsa

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

Page 14: Dsd05 04-05-jmsa

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

Page 15: Dsd05 04-05-jmsa

Một số hệ thống MOM

TIBCO

JMS (Java Message Service)

WebsphereMQ,

ActiveMQ (apache)

IBM MQ (Message Queues)

MSMQ (Microsoft Message Queue)

15

Page 16: Dsd05 04-05-jmsa

1.1. Mô hình truyền thông điệp

16

Page 17: Dsd05 04-05-jmsa

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

Page 18: Dsd05 04-05-jmsa

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

Page 19: Dsd05 04-05-jmsa

Point-to-point

19

Client

Senders

Client

Receiver Queue Sends

Consumes

Acknowledges

Posts messages to

the queue

Receives messages

on the queue

Page 20: Dsd05 04-05-jmsa

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

Page 21: Dsd05 04-05-jmsa

Một vài trường hợp

21

Page 22: Dsd05 04-05-jmsa

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

Page 23: Dsd05 04-05-jmsa

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

Page 24: Dsd05 04-05-jmsa

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

Page 25: Dsd05 04-05-jmsa

Publish-Subscribe

25

Producer Broker Consumer Consumer

publish(m1) send(m1) Pass message to broker

send(m1)

send(m2)

send(m2)

Dispatch message to

all consumers

publish(m2)

publish(m3)

Page 26: Dsd05 04-05-jmsa

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);

Page 27: Dsd05 04-05-jmsa

1.2. Tính tin cậy

27

Page 28: Dsd05 04-05-jmsa

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

Page 29: Dsd05 04-05-jmsa

1.3. Các thao tác giao dịch

29

Page 30: Dsd05 04-05-jmsa

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

Page 31: Dsd05 04-05-jmsa

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

Page 32: Dsd05 04-05-jmsa

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

Page 33: Dsd05 04-05-jmsa

1.4. Truyền thông điệp phân tán

33

Page 34: Dsd05 04-05-jmsa

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

Page 35: Dsd05 04-05-jmsa

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

Page 36: Dsd05 04-05-jmsa

1.5. An ninh

36

Page 37: Dsd05 04-05-jmsa

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

Page 38: Dsd05 04-05-jmsa

2. Tại sao cần truyền thông điệp?

38

Page 39: Dsd05 04-05-jmsa

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

Page 40: Dsd05 04-05-jmsa

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

Page 41: Dsd05 04-05-jmsa

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

Page 42: Dsd05 04-05-jmsa

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

Page 43: Dsd05 04-05-jmsa

Ví dụ về các ứng dụng truyền thông điệp

43

Page 44: Dsd05 04-05-jmsa

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

Page 45: Dsd05 04-05-jmsa

Ví dụ

45

Page 46: Dsd05 04-05-jmsa

Bài tập đọc hiểu

http://www.eaipatterns.com/BondTradingCaseStudy.html

46

Page 47: Dsd05 04-05-jmsa

3. JMS (Java Message Service)

47

Page 48: Dsd05 04-05-jmsa

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

Page 49: Dsd05 04-05-jmsa

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

Page 50: Dsd05 04-05-jmsa

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

Page 51: Dsd05 04-05-jmsa

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

Page 52: Dsd05 04-05-jmsa

3. Kiến trúc của 1 ứng dụng JMS

52

Page 53: Dsd05 04-05-jmsa

Các thành phần kiến trúc JMS

JMS clients

Messages

JMS Provider (Messaging systems)

JNDI administered objects

Destination

ConnectionFactory

53

Page 54: Dsd05 04-05-jmsa

Các thành phần kiến trúc JMS

Administrative

Tool JNDI Namespace

JMS Client JMS Provider

Bind

Lookup

Logical

Connection

Page 55: Dsd05 04-05-jmsa

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

Page 56: Dsd05 04-05-jmsa

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

Page 57: Dsd05 04-05-jmsa

JMS Domains (Mô hình truyền thông điệp)

57

Page 58: Dsd05 04-05-jmsa

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

Page 59: Dsd05 04-05-jmsa

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

Page 60: Dsd05 04-05-jmsa

JMS Messages

60

Page 61: Dsd05 04-05-jmsa

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

Page 62: Dsd05 04-05-jmsa

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

Page 63: Dsd05 04-05-jmsa

Message Components

Header

Properties

Body

63

Header

Properties

Body

Message

Page 64: Dsd05 04-05-jmsa

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

Page 65: Dsd05 04-05-jmsa

Các trường của Message header

JMSDestination

JMSDeliveryMode

persistent or nonpersistent

JMSMessageID

JMSTimeStamp

JMSRedelivered

JMSExpiration

65

Page 66: Dsd05 04-05-jmsa

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.getJMSM

essageID());

Queue replyQ = (Queue)ctx.lookup(jmsReplyQ);

requestMsg.setJMSReplyTo(replyQ);

Page 67: Dsd05 04-05-jmsa

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

Page 68: Dsd05 04-05-jmsa

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

Page 69: Dsd05 04-05-jmsa

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

Page 70: Dsd05 04-05-jmsa

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

Page 71: Dsd05 04-05-jmsa

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

Page 72: Dsd05 04-05-jmsa

4. JMS Programming APIs

72

Page 73: Dsd05 04-05-jmsa

Các đối tượng JMS

73

Page 74: Dsd05 04-05-jmsa

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

Page 75: Dsd05 04-05-jmsa

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

Page 76: Dsd05 04-05-jmsa

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

Page 77: Dsd05 04-05-jmsa

ConnectionFactory Java Interface

77

<<Interface>>

QueueConnectionFactory

(from jms)

<<Interface>>

TopicConnectionFactory

(from jms)

<<Interface>>

ConnectionFactory

(from jms)

createTopicConnection()

createTopicConnection()

createQueueConnection()

createQueueConnection()

Page 78: Dsd05 04-05-jmsa

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

Page 79: Dsd05 04-05-jmsa

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

Page 80: Dsd05 04-05-jmsa

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()

Page 81: Dsd05 04-05-jmsa

Đố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

Page 82: Dsd05 04-05-jmsa

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

Page 83: Dsd05 04-05-jmsa

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()

Page 84: Dsd05 04-05-jmsa

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

Page 85: Dsd05 04-05-jmsa

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()

Page 86: Dsd05 04-05-jmsa

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

Page 87: Dsd05 04-05-jmsa

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

Page 88: Dsd05 04-05-jmsa

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

Page 89: Dsd05 04-05-jmsa

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

Page 90: Dsd05 04-05-jmsa

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()

Page 91: Dsd05 04-05-jmsa

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

Page 92: Dsd05 04-05-jmsa

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

Page 93: Dsd05 04-05-jmsa

JMS APIs

93

Page 94: Dsd05 04-05-jmsa

JMS A

PI

94

Page 95: Dsd05 04-05-jmsa

6. Các bước viết JMS clients

95

Page 96: Dsd05 04-05-jmsa

6.1. Các bước viết JMS Sender Application

96

Page 97: Dsd05 04-05-jmsa

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

Page 98: Dsd05 04-05-jmsa

(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

Page 99: Dsd05 04-05-jmsa

(2) Tạo Connection Object

// Create a Connection object from

// ConnectionFactory object

TopicConnection topicConnection =

factory.createTopicConnection();

99

Page 100: Dsd05 04-05-jmsa

(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

Page 101: Dsd05 04-05-jmsa

(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

Page 102: Dsd05 04-05-jmsa

(5) Start Connection

// Until Connection gets started, message flow

// is inhibited: Connection must be started before

// messages will be transmitted.

topicConnection.start();

102

Page 103: Dsd05 04-05-jmsa

(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

Page 104: Dsd05 04-05-jmsa

6.2.1. Các bước viết JMS Application Receiver theo chế độ Non-blocking

104

Page 105: Dsd05 04-05-jmsa

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

Page 106: Dsd05 04-05-jmsa

(4) Tạo Message Subscriber

// Create Subscriber from Session object

TopicSubscriber subscriber =

session.createSubscriber(weatherTopic);

106

Page 107: Dsd05 04-05-jmsa

(5) Đăng ký MessageListener cho chế độ non-blocking

// Create MessageListener object

WeatherListener myListener

= new WeatherListener();

// Register MessageListener with

// TopicSubscriber object subscriber.setMessageListener(myListener);

107

Page 108: Dsd05 04-05-jmsa

6.2.2. Các bước viết JMS Application Receiver theo chế độ blocking

108

Page 109: Dsd05 04-05-jmsa

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

Page 110: Dsd05 04-05-jmsa

6.3. Cách thức tạo một ứng dụng JMS có tính chịu lỗi

110

Page 111: Dsd05 04-05-jmsa

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

Page 112: Dsd05 04-05-jmsa

Độ 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

Page 113: Dsd05 04-05-jmsa

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

Page 114: Dsd05 04-05-jmsa

6.3.1. Điều khiển việc thừa nhận thông điệp

114

Page 115: Dsd05 04-05-jmsa

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

Page 116: Dsd05 04-05-jmsa

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

Page 117: Dsd05 04-05-jmsa

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

Page 118: Dsd05 04-05-jmsa

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

Page 119: Dsd05 04-05-jmsa

6.3.2. Chỉ định truyền thông điệp Persistent (Các chế độ truyền)

119

Page 120: Dsd05 04-05-jmsa

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

Page 121: Dsd05 04-05-jmsa

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

Page 122: Dsd05 04-05-jmsa

6.3.3. Thiết lập các mức ưu tiên thông điệp

122

Page 123: Dsd05 04-05-jmsa

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

Page 124: Dsd05 04-05-jmsa

6.3.4. Cho phép thông điệp hết hạn

124

Page 125: Dsd05 04-05-jmsa

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

Page 126: Dsd05 04-05-jmsa

6.3.5. Tạo các durable subscriptions

126

Page 127: Dsd05 04-05-jmsa

Độ 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

Page 128: Dsd05 04-05-jmsa

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

Page 129: Dsd05 04-05-jmsa

6.3.6. Giao dịch trong JMS

129

Page 130: Dsd05 04-05-jmsa

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

Page 131: Dsd05 04-05-jmsa

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

Page 132: Dsd05 04-05-jmsa

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

Page 133: Dsd05 04-05-jmsa

6.3.7. Message Selector

133

Page 134: Dsd05 04-05-jmsa

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

Page 135: Dsd05 04-05-jmsa

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

Page 136: Dsd05 04-05-jmsa

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

Page 137: Dsd05 04-05-jmsa

7. Các đặc tính thông điệp không được định nghĩa trong JMS

137

Page 138: Dsd05 04-05-jmsa

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

Page 139: Dsd05 04-05-jmsa

8. Xử lý giao dịch

boolean transactionMode=true;

javax.jms.Session session;

session=connection.createSession(transactionMode, ackMode);

....

session.commit();

session.rollback();

139

Page 140: Dsd05 04-05-jmsa

Phụ lục

Page 141: Dsd05 04-05-jmsa
Page 142: Dsd05 04-05-jmsa

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