Giới thiệu về JMS – Java Message Services – Cài đặt ứng dụng Chat
Mục đích: Nội dung của chủ đề này giới thiệu các khái niệm liên quan đến Java Message Services – JMS và cách sử dụng JMS trong cả EJB2 và EJB3. Sau nội dung lý thuyết, chúng tôi sẽ cài đặt ứng dụng chat sử dụng JMS
Giới thiệu về JMS – Java Message Services – Cài đặt ứng dụng Chat
Mục đích: Nội dung của chủ đề này giới thiệu các khái niệm liên quan đến Java Message Services – JMS và cách sử dụng JMS trong cả EJB2 và EJB3. Sau nội dung lý thuyết, chúng tôi sẽ cài đặt ứng dụng chat sử dụng JMS
Yêu cầu
- Nắm vững các khái niệm về EJB 2.1 và EJB3 và các nguyên lý cơ bản về cài đặt các đối tượng trong EJB 2.1 và EJB3
- Nắm vững kiến thức về OOP
Định nghĩa về Message
- Trong lúc quá trình áp dụng mô hình EJB nghĩa là chúng ta đang thực hiện gọi phương thức từ xa trên middleware
- Áp dụng cơ chế này, chúng ta nhận thấy khi một client gọi phương thức trên máy ở xa thì bản chất nó đã tạo ra một request và thread/process của nó sẽ bị block lại để chờ response trở về và có thể làm trì hoãn quá trình xử lý
- Thay vì thế người ta đưa ra cơ chế giao tiếp bằng cách chuyển thông tin qua định dạng dùng chung qua đối tượng trung gian và không cần mong kết quả trả về. Cơ chế này đòi hỏi phải có đối tượng trung gian để nhận và chuyển message độc lập với việc xử lý
- Cơ chế này còn cho phép khả năng truyền message đến nhiều hơn một đối tượng nhận cùng một lúc (broadcast)
- Cơ chế này có hạn chế đó là làm quá tải đối tượng trung gian
- Đối tượng theo định dạng giao tiếp dùng chung đó là message
- Đối tượng trung gian đó là MOM – Message Oriented Middleware hay MQ – Message Queue
- Hỗ trợ cơ chế tương tự như DB với việc nhận và gửi message, đảm bảo toàn vẹn dữ liệu, transaction và cân bằng cho việc gửi nhận dữ liệu
- Nơi lưu trữ dữ liệu và tương tác với MOM có tên gọi là Destination
Khái niệm về hệ thống EMS – Enterprise Message System
- Cung cấp cơ chế gửi nhận message đồng bộ và bất đồng bộ
- Người gửi gửi message đến middleware, middleware tự chuyển message đến người nhận, khi tác vụ truyền hoàn tất thì người nhận sẽ gửi tín hiệu đến middleware thông báo hoàn tất tác vụ (đây là cơ chế gửi nhận message bất đồng bộ)
- Hệ thống EMS có thể nhìn tương đương cuộc sống thực tế chính là hệ thống gửi nhận SMS của chúng ta theo cách nhìn đó là điện thoại gửi tin nhắn cho nhau thông qua tổng đài, và máy chúng ta nhận tin nhắn tự động là do tổng đài đưa tin nhắn đến máy và tín hiệu phản hồi thể hiện cho chúng ta biết người nhận có nhận hay chưa. Bên cạnh đó, người nhận tin nhắn không cần bật điện thoại tại thời điểm gửi
- Hệ thống EMS cũng giống tương tự hệ thống khác đó là email, cho phép lưu trữ message và sau đó người dùng sử dụng account với quyền xác thực truy cập vào mail server để lấy thông tin về message theo nghĩa chúng ta không gửi mail cho nhau mà gửi thông qua object trung gian
Khái niệm về hệ thống JMS
- JMS đưa ra API cho phép người phát triển phần mềm có thể tương tác với các MOM khác nhau tương tự như khái niệm người ta đưa ra JDBC API để hỗ trợ tương tác giữa các DB khác nhau
- JMS API cung cấp tất các mọi chức năng hỗ trợ tạo, thêm, xóa, gửi và nhận message
- JMS bao gồm 2 thành phần API hỗ trợ chức năng cho người phát triển phần mềm và SPI – Service Provider Interface cho phép các nhà sản xuất tạo ra tool JMS tích hợp định hướng cho mọi người sử dụng theo hướng chuẩn hóa
- JMS cung cấp cơ chế giao tiếp bao gồm
- Asynchronous: JMS tự động chuyển message đến người nhận khi message đến
- Reliable: một message chỉ được chuyển đến đúng một người nhận mà không có cơ chế nhân bản, do vậy, tín hiệu phản hồi hoàn tất nhận message từ người nhận sẽ gây nên xóa bỏ thông tin trên middleware object
- Kiến trúc JMS bao gồm 4 thành phần
- JMS Provider: những người tạo ra hệ thống JMS để lưu trữ tương tự hệ thống quản lý CSDL như SQL Server, Oracle, ….
- JMS Client: những thành phần sử dụng JMS API truy cập và thao tác trên JMS Provider
- Messages: định dạng trung gian để giao tiếp giữa JMS Clients và Providers
- Administratered Object: hỗ trợ cơ chế quản lý và cấu hình cho JMS Objects
- Cơ chế JMS được deploy vào trong Application Server
- JMS được deploy vào trong server bao gồm 02 thành phần
§ Connection Factory: là nơi tạo ra thành phần định hướng đến địa chỉ hay tên gọi để truy cập vào JMS tương tự như khái niệm truy cập DataSource của kết nối dữ liệu
§ Destination: là nơi lưu trữ cho message
- 02 đối tượng này được quản lý bởi administered object và container, để container cung cấp cơ chế active cho phép bên ngoài giao tiếp
§ Khi cần thao tác sử dụng JMS, ứng dụng thực hiện tìm kiếm connection factory và destination để thao tác và thực hiện tác vụ của ứng dụng
- Khi thao tác trong thực hiện tạo ứng dụng với JMS, ngoài chuyện thực hiện kết nối 02 đối tượng nêu trên, người dùng cần thực hiện thêm một số thao tác sau
- Tạo connection từ connection factory tìm thấy
- Từ connection để phân biệt giữa các người dùng khác nhau, chúng ta cần phải tạo session object
§ Khi có session object, tùy theo việc gửi nhận message mà chúng ta tạo Message Producer hay Consumer.
- Sau đó thực hiện phương thức gửi hay nhận message
- Giới thiệu về JMS Domain
- Đây là cơ chế để thực hiện việc gửi, nhận message
- Có 02 cách đó là Point to Point (P2P) và Publisher and Subcriber (Pub/Sub)
- P2P
- Sử dụng queue để lưu trữ message và hủy message đi khi hết thời gian và mô hình này message chuyển đi tuần tự (FIFO)
- Định nghĩa 02 đối tượng cho việc gửi và nhận, đó là sender và receiver, và chỉ có một người gửi và một người nhận
- Sử dụng tín hiệu acknowledge để kích hoạt cho việc nhận message ở người nhận hoàn tất
- Mô hình có tính bảo mật cao do một người gửi và một người nhận nhưng đôi lúc làm hệ thống bị block lại do chờ message đến
- Ngoài ra, mô hình cho phép người nhận không cần active tại thời điểm gửi message
Mô hình tổng quát
Mô hình cắt dọc
- Pub/Sub
- Mô hình sử dụng Topic làm nơi lưu trữ
- Mô hình cho phép 1 người gửi và nhiều người nhận do vậy đối tượng được định nghĩa là Publisher và Subcribers
- Không cần sử dụng thông tin acknowledge và message được chuyển đến các subscriber chỉ là bản copy
- Mô hình này có thể đại diện cho email so với mô hình P2P tương tự như SMS
- Mô hình bảo mật không cao do gửi nhiều người nhận nhưng được ưu điểm đó là áp dụng thuận lợi cho hệ thống phân tán
- Topic thực chất cũng là dạng queue nhưng có nhiều hơn một queue với các queue có đánh độ ưu tiên khác nhau
- Mô hình Pub/Sub đòi hỏi đối tượng nhận phải active hay listener tại thời điểm gửi nhận message, nếu không message sẽ mất đi (non-durable). Do vậy, để message vẫn không mất đi nhưng được lưu trữ tạm thời trong MOM và cho phép người dùng truy cập vào MOM với tính xác thực thì chức năng durable phải được kích hoạt
Mô hình tổng quát
Mô hình cắt dọc
- Cơ chế gửi nhận message trong JMS được chia thành hai thành phần
- Synchronous: đối tượng nhận và gửi message thông qua thực hiện phương thức receive và phương thức này giữ ứng dụng chờ đợi cho đến khi message tới.
- Asynchronous: đối tượng nhận bắt buộc phải đăng ký cơ chế lắng nghe MessageListener để đón nhận message và phương thức được kích hoạt là onMessage để đón nhận và xử lý message
- Mô hình tổng quát của JMS trong thực tế là kết hợp các domain và phối hợp với nhau tạo nên kênh truyền tin theo kiểu chúng ta gửi tin nhắn từ tổng đài này qua tổng đài khác rồi mới đến máy người nhận
- Một số thành phần trong mô hình JMS
- Destination: nơi tiếp nhận, lưu trữ message và là nơi để các chương trình ứng dụng truy cập tới
- Connection factory: nơi đưa ra kết nối trên server đến chỗ lưu trữ message để từ đó có thể gửi và nhận message
- Connection: thể hiện một kết nối TCP/IP để thực hiện kết nối giữa client và người tạo ra lưu trữ message đó là provider
- Session: một thread hỗ trợ tương tác cho việc gửi nhận message
- Message Producer: được tạo từ session được dùng để gửi message lên destination
- Message Consumer: được tạo từ session được dùng để nhận message từ destination
- Message Listener: đưa ra cơ chế bất đồng bộ trong việc gửi nhận message
- Message Selector: cung cấp cơ chế lọc message theo cơ chế của provider
- Message: loại dữ liệu dùng để cung cấp cơ chế nói chuyện giữa các ứng dụng và thành phần component của ứng dụng
- Bao gồm 3 phần
- header (bắt buộc có)
- Dùng để xác định thông tin giao tiếp giữa client và thông qua cặp key và trị của nó, xác định việc gửi message đi từ đâu đến đâu
- Các thành phần chủ yếu bao gồm to, from, cc, bcc, subject
- Các thuộc tính thường sử dụng
Các field |
Mô tả |
JMS Destination |
Xác định destination gửi/nhận message |
JMSDeliveryMode |
Xác định cơ chế gửi message |
JMSExpiration |
Xác định thời gian message tồn tại ở destination |
JMSPriority |
Xác định độ ưu tiên khi destination gửi message |
JMSMessageID |
Mỗi message có một id duy nhất |
JMSTimestamp |
Xác định thời gian gửi message |
JMSCorrelationID |
Xác định id message tương tự như lưu trữ message được reply cho message nào |
JMSReplyTo |
Xác định cơ chế response |
JMSType |
Xác định cấu trúc của message |
JMSRedelivered |
Xác định message đã được gửi đi từ destination nhiều hơn một lần |
- Property: tham số phụ trợ để truyền thêm tham số trong message gửi đi
- body – thân: chứa nội dung message truyền đi. Có 5 dạng tất cả: Message, Text Message, Map Message, Byte Message, Stream Message, Object Message
- Ngoài ra API cũng hỗ trợ thêm thành phần để xử lý lỗi như JMSException
- Message được xử lý và phản hồi tín hiệu trở lại destination sau khi xử lý ở client hoàn tất phải trả qua 3 bước
- Client nhận message
- Client xử lý message
- Và tín hiệu acknowledge được gửi lại destination
- Cơ chế thiết lập gửi acknowledge bao gồm 3 cách
- AUTO_ACKNOWLEDGE: tự động gửi tín hiệu acknowledge sau vài giây nhận được message
- CLIENT_ACKNOWLEDGE: tín hiệu acknowledge được gửi khi người dùng hay ứng dụng gọi phương thức acknowledge()
- DUPS_OK_ACKNOWLEDGE: tín hiệu acknowledge được gửi tự động nhưng không được gửi liền như AUTO mà trì hoãn một khoảng thời gian mới thực hiện gửi đi
- Các JMS API được cung cấp để hỗ trợ các khái niệm thành phần của JMS
Interface |
Point-to-Point |
Publisher/Subscriber |
ConnectionFactory |
QueueConnectionFactory |
TopicConnectionFactory |
Connection |
QueueConnection |
TopicConnection |
Destination |
Queue |
Topic |
Session |
QueueSession |
TopicSession |
MessageProducer |
QueueSender |
TopicPublisher |
MessageConsumer |
QueueReceiver, QueueBrowser |
TopicSubscriber |
- Cơ chế transaction trong JMS
- JMS hỗ trợ nhiều transaction cùng lúc trong qua trình gửi nhận message thông qua hàm tạo session với tham số thứ nhất là kiểu luận lý: false là không hỗ trợ message, true là có hỗ trợ message
- Ví dụ
- Sender
- Khi message được gửi đi, message chưa được chuyển tới destination mà được nằm trong bộ đệm tạm, và khi có tín hiệu commit thì message mới được chuyển vào destination, ngược lại message sẽ bị hủy
- Receiver
- Cơ chế mặc định của JMS là tự động gửi message từ destination, do vậy, cơ chế commit là mặc định được thiết lập. Cho nên khi tính hiệu rollback xuất hiện thì message sẽ được đưa ngược trở lại destination
- Transaction của JMS và của mô hình J2EE/JavaEE nói chung đều được cung cấp cơ chế quản lý transaction thông qua đối tượng UserTransaction với thành phần API hỗ trợ javax.transaction.UserTransaction
JMS delop thực tế trên Application Server - JBoss
- JMS là một framework được deploy sẵn trong ứng dụng server JBOSS cụ thể với 02 thành phần topic và queue trong tập tin uil2-service.xml trong thư mục cài đặt JBOSS vào trong thư mục server/default/deploy/jms
- Các domain của JMS được định nghĩa trong tập tin jbossmq-destinations-service.xml cũng trong thư mục nêu trên
- Cơ chế hoạt động và phân quyền của JMS được định nghĩa trong tập tin hsqldb-jdbc-state-service.xml
- Các thư viện hỗ trợ cho client kết nối với JMS provider bao gồm concurrent.jar, jbossmq-client.jar, jboss-common-client.jar, jboss-system-client.jar, jnp-client.jar, jbossall-client.jar and log4j.jar. Tất cả tập tin này nằm trong thư mục client
Các bước để phát triển ứng dụng JMS
- Bước 1: Kết nối server nơi deploy JMS sử dụng JNDI. Tìm ConnectionFactory
- Bước 2: Tìm kiếm Destinations
- Step 3: Tạo kết nối từ Connection Factory
- Step 4: Tạo Session từ Connection
- Step 5: Tạo Sender hay Receiver – đăng ký listener nếu là dùng mô hình Pub/Sub
- Step 6: Tạo Message
- Step 7: Thực hiện gửi hay nhận Message
- Step 8: Đóng tất cả Connection
Xây dựng ứng dụng cho phép việc chat group của các nhóm liên kết
Yêu cầu
- Nắm vững các khái niệm cơ bản về JMS nêu trên
- Nắm vững các khái niệm về EJB 2.1 và các nguyên lý cơ bản về cài đặt các đối tượng trong EJB 2.1
- Nắm vững cú pháp và kiến thức về OOP
- Tools sử dụng ở đây là Netbeans 6.9.1
- JDK 6 update 22
- Server: JBoss 4.2.3 GA
Mô tả chức năng
- Giao diện đầu tiên yêu cầu người dùng đăng nhập với tên account
- Nếu đăng nhập thành công thì họ sẽ được chat trong ứng dụng, ngược lại ứng dụng sẽ bị lock lại
- Người dùng chat và message được đưa đến destination và ứng dụng cũng lấy message hay được destination deliver message đối với người chat khác để cập nhật màn hình trình bày kết quả
- Trong phần tutorial này chúng tôi sẽ thực hiện tạo ra ứng dụng desktop hỗ trợ cho chat và cấu hình destination phù hợp với việc trong đổi message thông qua ứng dụng chat
- Bước 1: Tạo ứng dụng Java Application
- Nhấn Next. Tạo Project có tên JMSChat
- Nhấn Finish để hoàn tất việc tạo ứng dụng
- Bước 2: Tạo tập tin cấu hình destination cho ứng dụng chúng ta
- Tạo tập tin xml bằng cách nhấn phải chuột trên Source Package, chọn New và chọn XML Document hay chọn menu File, chọn New File, chọn XML trong categories và chọn XML Document
- Đặt tên tập tin xml là jboss4-netbeans-destination-services (tên này có thể đặt tùy ý)
- Nhấn Next, Next cho đến nút Finish để tập xml được phát sinh
- Chỉnh sửa tập tin với nội dung bên dưới
- Tập tin này hướng tới cấu hình một destination mới có tên là Chat dựa trên Topic để làm nơi lưu trữ và trao đổi thông tin giữa các thành phần chat của chúng ta
- Chúng thực hiện start Server JBoss 4.2.3 GA
- Chép tập tin này vào thư mục deploy của server/default để cấu hình tên destination mới
- Bước 3: Tạo ra ứng dụng chat để có thể giao tiếp truy cập trên server
- Tạo một JFrame có tên là Chatter với giao diện như sau
- Thêm thư viện hỗ trợ của jboss để hỗ trợ client kết nối và sử dụng JMS API, JNDI
- Click phải chuột trên Library, chọn Add Jar/Folder
- Di chuyển đến thư mục cài đặt JBoss, thư mục clients để add chọn các gói jar bao gồm: concurrent, jbossall-client, jboss-common-client, jboss-j2ee, jboss-system-client, jbossmq-client, jnp-client, log4j
- Nhấn nút Open để Add vào project
- Tạo tập tin để kết nối đến server jboss từ client và tạo sự uyển chuyển khi kết nối, tập tin properties.
- Click phải chuột trên Source Package, chọn Others, chọn Others trong categories, chọn Properties files, đặt tên file là jndi
- Thay đổi nội dung tập tin jndi để xác định context và cách thức đặt tên thư mục và gói hỗ trợ ở server
- Phát sinh biến cố các nút lệnh trên giao diện của Chatter.java, chuyển sang source để code
- Khai báo các thành phần API của JMS liên quan để xử lý, ở đây chúng ta sẽ dùng các class và interface của Topic
- Vì ứng dụng tại mỗi thời điểm dùng độc lập và chạy nhiều instance khác nhau cùng một lúc, do vậy chúng ta phải implement class với thread sử dụng Runnable
- Khi cài đặt này, chúng ta bắt buộc phải implement một phương thức tên run trong ứng dụng của chúng ta
- Chúng ta chỉnh sửa code cho constructor của class Chatter là thiết lập nút send mặc định là mờ khi không kết nối thành công
- Viết code cho nút exit là đóng kết nối lại
- Chúng ta viết code cho nút connection để kết nối với server và JMS
- Code thực hiện xác định context của ứng dụng client qua dòng 139
- Thực hiện kết nối Datasource ConnectionFactory dòng 140 và 141
- Tạo Connection dòng 142
- Tạo Session dòng 143 và 144
- Tìm kiếm destination theo đúng tên deploy của chúng ta khi dùng tập tin cấu hình và nhận được thông tin từ server dòng 145
- Chúng ta tạo ra đối tượng gửi message là publisher dòng 146
- Chúng ta cũng tạo ra đối tượng nhận message vì một ứng dụng sẽ vừa gửi và nhận message của chat room. Ở đây chúng ta dùng DurableSubcriber để message vẫn còn lưu trữ trên server và phải truy cập thông qua account với tham số thứ 02 ở dòng 147
- Chúng ta mở kết nối để thực hiện chuẩn bị mở port trao đổi thông tin message
- Thực hiện một số thiết lập trên giao diện khi thao tác thành công
- Chúng ta bổ sung code cho nút Send để có thể send message đến destination
- Câu hỏi tiếp theo là message được gửi đồng bộ đến từng instance như thế nào
- Câu trả lời chính là phương thức run được kích hoạt để đón nhận thông tin chúng ta từ destination, method mà chúng ta có được do implement Runnable
- Chúng ta bổ sung code cho phương thức run để nối các lời chat từ server vào từng instance
- Chúng ta đã hoàn tất ứng dụng
- Bước 4: Thực thi ứng dụng
- Chúng ta không cần deploy gì cả, chỉ cần chạy ứng dụng trực tiếp từ desktop. Ở đây chúng tôi kích hoạt 3 ứng dụng khác nhau – 3 instance
- Chúng ta nhập tên username bất kỳ mình thích vào trong ô Name và nhấn Connect, chúng ta sẽ thấy nút Connect mờ đi và nút Send sáng lên
- Ở đây chúng tôi không validation password mà chỉ cần có account để làm tên truy cập vào destination là được vì đây là yêu cầu của Subcriber
- Bên cạnh đây là nội dung demo sử dụng và việc cấu hình destination chúng ta có trong tập tin xml vô cùng đơn giản và không cấu hình Security. (Chủ đề này sẽ đề cập ở topic khác)
- Tương tự chúng ta làm cho các cửa số còn lại
- Chúng ta nhập message gửi đi, nhấn Send
- Chúng ta có kết quả
- Tương tự, cho các cửa số còn lại
- Để thoát chúng ta nhấn Exit
- Bước 5: Undeploy destination sau khi sử dụng
- Đơn giản, chúng ta thực hiện xóa tập tin xml cấu hình dã được chép vào trong server trong bước 2. Server sẽ thông báo về việc undeploy destination như sau
Chúc mừng các bạn, chúng ta đã hoàn tất xong việc cài đặt ứng dụng sử dụng JMS. Ngoài ra, chúng ta tăng thêm kiến thức về trao đổi message. Rất mong bài viết sẽ giúp ích cho bạn trong việc sử dụng và làm quen đến các khái niệm JMS để làm nền tảng cho việc nghiên cứu component của EJB là Message Driven Bean – MDB
Trong bài này, chúng ta vẫn chưa làm các ví dụ tiếp cận với khái niệm của JMS. Các ví dụ tiếp cận sẽ được mô tả trong các chủ đề sau. Các bạn nhớ đón xem để nắm chắc được khái niệm cụ thể JMS và các khái niệm của nó để làm nền tảng cho việc áp dụng trong ứng dụng cụ thể.
Rất mong sự góp ý chân thành của các bạn và hẹn các bạn trong bài tiếp theo liên quan đến JMS và MDB
Không có nhận xét nào:
Đăng nhận xét