2010-02-12 26 views
20

Tôi đang xem xét một ứng dụng client-server được viết bằng Java. Máy chủ nhận được các tin nhắn JMS và xử lý chúng nhưng các tin nhắn có thể đến theo thứ tự không mong muốn và việc hủy có thể đến trước một thông báo đơn đặt hàng. Làm thế nào để bạn xử lý một trường hợp như vậy? Bạn làm điều đó trong mdb?Làm cách nào để xử lý thứ tự các thư trong JMS?

Một số chiến lược hoặc mẫu cho loại kịch bản này là gì?

Trả lời

16

Cho đến nay tôi biết, điều này được coi là phân phối "không theo thứ tự" và là một phần của thuộc tính chất lượng dịch vụ (QoS) của hệ thống JMS. Tôi không nghĩ rằng đó là một phần của đặc tả JMS, nhưng một số nhà cung cấp có thể hỗ trợ nó. Điều đó sẽ phụ thuộc vào việc thực hiện JMS cụ thể mà bạn sử dụng.

Lưu ý rằng JMS có nghĩa là phân phối thư đến một số người tiêu dùng theo cách phân phối tải. Nếu thông báo phải được gửi theo kiểu thời gian đã đặt hàng thì điều này là không thể - về cơ bản nó dẫn đến việc tuần tự hóa việc gửi tin nhắn và tin nhắn không thể được xử lý đồng thời.

Các wikipedia nói nó tốt hơn so với tôi:

JMS đợi Một khu vực dàn dựng có chứa tin nhắn đã được gửi đi và chờ đợi để được đọc. Lưu ý rằng, trái với hàng đợi tên đề xuất, thư không phải là được gửi theo thứ tự được gửi. Nếu nhóm bean được điều khiển thông báo chứa nhiều hơn so với một trường hợp thì thư có thể được xử lý đồng thời và do đó, nó có thể là có thể thông báo sau được xử lý sớm hơn một lần trước đó. Hàng đợi JMS chỉ đảm bảo rằng mỗi thông báo chỉ được xử lý một lần.

Yêu cầu hủy băng thông không dễ dàng đạt được với JMS sau đó. Hai ý tưởng:

  • Lưu một vé tương ứng với từng thư trong cơ sở dữ liệu có thể được sử dụng để hủy thư dễ dàng. Khi tin nhắn được gửi, MDB sẽ kiểm tra xem vé tương ứng có còn hiệu lực hay không. Nếu có, tiến hành thêm, nếu không, hãy thả tin nhắn.
  • Cố gắng đặt kích thước nhóm MDB thành một. Có thể trong trường hợp này, giao hàng sẽ được đặt hàng. Thay đổi kích thước hồ bơi là ứng dụng. máy chủ cụ thể, nhưng hầu hết trong số họ hỗ trợ kích thước hồ bơi cho mỗi bean.

Nếu không, có thể xem mẫu message store. Dù sao thì nó cũng đáng để kiểm tra trang web EAI.

+0

Cảm ơn, tôi sẽ xem xét điều này – user271858

8

Hệ thống của bạn sẽ linh hoạt hơn nếu nó có thể đối phó với các thông báo không theo thứ tự. Mẫu mà tôi đã sử dụng để giải quyết điều này trong quá khứ là sử dụng hàng đợi trì hoãn (trên một hệ thống xử lý 8 triệu tin nhắn mỗi ngày trong thế giới tài chính).

Trong ví dụ của bạn, nếu tôi nhận được một đơn đặt hàng mà tôi chưa nhận được, tôi sẽ trì hoãn nó trong một khoảng thời gian và thử lại. Nếu tôi vẫn không biết gì về thứ tự mà tôi được yêu cầu xóa, tôi sẽ tăng một số lỗi (trả lời người gửi ban đầu, gửi tin nhắn đến hàng đợi lỗi đặc biệt, ...).

Khi triển khai hàng đợi trì hoãn, đây có thể là một hàng đợi JMS khác với dịch vụ có thể chấp nhận thư bị trì hoãn. Sau đó, nó định kỳ đọc các tin nhắn bị trì hoãn và kiểm tra nếu khoảng thời gian trễ đã hết hạn và gửi lại tin nhắn đến hàng đợi đích ban đầu.

+0

Cảm ơn, tôi sẽ xem xét điều này. – user271858

6

Tôi thứ hai là lời khuyên về việc kiểm tra trang EAI và cuốn sách dựa trên (văn bản tuyệt vời trên các mẫu MOM và MOM).

Cá nhân tôi sẽ điều tra theo số Resequencer.

+0

Cảm ơn, tôi sẽ xem xét điều này. – user271858

Các vấn đề liên quan