2010-01-19 27 views
10

Trong hầu hết các dự án tôi đã tham gia, lựa chọn giải pháp không đồng bộ đã là một nguồn của nhiều cuộc thảo luận ...Tại sao chọn JMS cho giải pháp không đồng bộ? Tại sao nó tốt hơn đậu thực thể đơn giản?

Mỗi khi một đơn thực hiện đủ để quản lý hàng đợi: chúng tôi chỉ lưu trữ một tin nhắn (vé) trong một bảng và một cron xử lý unstacks hàng đợi. Giải pháp đơn giản này có lợi thế là rất đơn giản, nó dựa trên bối cảnh giao dịch của cơ sở dữ liệu và chúng ta có thể quản lý trạng thái của thông báo nhận được trong quá trình thực hiện nó.

do đó tôi hỏi những câu hỏi sau đây:

1) lợi ích gì chúng ta phải sử dụng JMS? Những lợi ích của JMS là gì?

2) Trong trường hợp nào thích JMS so với đậu thực thể?

Cảm ơn bạn đã trả lời và phản hồi!

+0

Vì đôi khi mọi người không muốn sử dụng EJB –

+0

Vì vậy, bạn quyết định tự mình kết hợp hàng đợi thư dựa trên cơ sở dữ liệu thay vì sử dụng hệ thống nhắn tin hiện có. Chắc chắn nó sẽ hoạt động, nhưng tôi sẽ hỏi tại sao bạn thậm chí làm phiền với bean thực thể, bạn không có trạng thái duy trì, hoặc cập nhật để thực hiện cho bảng, vì vậy bạn có thể thực hiện cuộc gọi db trực tiếp từ một servlet (nếu dựa trên web) hoặc một bean phiên không trạng thái. Tất cả đều là những sản phẩm thay thế kém cho một hệ thống nhắn tin thực tế. – Robin

Trả lời

13

1) Quan tâm nào chúng tôi phải sử dụng JMS? Các lợi ích của JMS là gì? 2) Trong tình huống nào thích JMS so với đậu thực thể?

Bạn tiếp cận hoạt động tốt miễn là có chỉ một người tiêu dùng. Nếu không, nó sẽ yêu cầu lược đồ khóa để cùng một thông điệp không được gửi hai lần, vv Đây là những gì JMS đưa ra khỏi hộp: sản xuất và tiêu thụ giao dịch với nhà môi giới JMS quản lý tất cả các vấn đề giao hàng với nhiều người tiêu dùng/nhà sản xuất.

Các ưu điểm khác của JMS là chất lượng dịch vụquản lý, ví dụ: nỗ lực phân phối lại, hàng đợi thông báo đã chết, quản lý tải, khả năng mở rộng, phân cụm, giám sát, v.v.

JMS cũng hỗ trợ xuất bản-subsribe hoặc point-to-point.

Giống như so sánh câu lệnh JDBC để chèn một hàng vào cơ sở dữ liệu so với ORM toàn bộ. Cả hai đều làm việc để chèn một hàng vào db, nhưng ORM sẽ cung cấp nhiều hơn nữa, cộng với bạn không tái phát minh ra bánh xe để đối phó với các vấn đề cấp thấp ... (tương tự không phải là tuyệt vời nhưng tốt)

Tôi đề nghị bạn xem FAQ.

+0

Cảm ơn bạn đã phản hồi. Tôi đồng ý với bạn về việc phải phát minh lại bánh xe bằng một bean thực thể và phải quản lý mẫu khóa trong môi trường đa luồng. Ok, hãy đọc Câu hỏi thường gặp! – ajeanson

+0

Lưu ý rằng tôi không nói rằng JMS là * giải pháp * không. Sử dụng JMS có thể phức tạp một số khía cạnh của giải pháp (ví dụ: xử lý các giao dịch phân tán, định cấu hình hàng đợi, quản lý lỗi tin nhắn, v.v.). Nếu bạn có * một * người tiêu dùng trên mỗi hàng đợi và các vấn đề * không chức năng * không phải là một mối quan ngại, thì một bảng và một chủ đề có thể thực hiện tốt công việc. Tôi đã nhìn thấy cả hai cách tiếp cận và cả hai đã làm việc. – ewernli

8

Trong Java EE về cơ bản có 3 cơ chế để đối phó với asynchronicity:

  1. JMS
  2. CDI xe buýt kiện
  3. phương pháp chú thích @Asynchronous đậu stateless session

ewernli đã đưa ra một lời giải thích rất tốt về những lợi thế mà JMS có. Đó là một hệ thống rất đầy đủ tính năng, nhưng tất cả các tính năng này đều có chi phí một chút ở trên cao và phức tạp, ví dụ: quản lý các đối tượng hành chính có liên quan.

Ngoài ra, đặc điểm kỹ thuật của JMS chưa được cập nhật trong gần một thập kỷ. Nó vẫn đang được thực sự hữu ích cho thấy rất nhiều tầm nhìn xa mà đi vào thiết kế của API, nhưng đôi khi nó có thể cảm thấy một chút phức tạp. Cách thức mà các đối tượng quản trị như đích phải được xác định, cách mà bạn cần để có được kết nối, tạo một phiên, v.v., tất cả đều cảm thấy một chút thấp, cũ và phức tạp. Nhận tin nhắn mặc dù đã được đơn giản hóa rất nhiều với các tin nhắn điều khiển đậu, nhưng gửi có không.

Sau đó, vì một số lý do kỳ lạ kế thừa, các mô-đun web bị cấm nghe các điểm đến của JMS. Tất nhiên không có lý do gì cho điều đó nữa, nhưng nó nằm trong J2EE 1.3 và các thông số kỹ thuật sau này. Các máy chủ ứng dụng tương thích vẫn duy trì quy tắc này, nhưng tất cả chúng đều cung cấp cấu hình cụ thể cho nhà cung cấp để cho phép nó. Tuy nhiên điều này làm cho ứng dụng của bạn kém di động hơn.

Một tập con của các trường hợp sử dụng mà JMS đã được sử dụng trong lịch sử là lập trình dựa trên sự kiện rất đơn giản trong một ứng dụng duy nhất. Cho rằng xe buýt sự kiện CDI được cho là phù hợp hơn bây giờ, vì nó là một cách tiếp cận trọng lượng nhẹ hơn, hiện đại hơn và tổng thể nhẹ hơn.

Một nhóm nhỏ các trường hợp sử dụng khác mà JMS đã được sử dụng chỉ đơn giản là làm bất kỳ công việc nào một cách không đồng bộ. Đối với những người đó đôi khi được sử dụng để thực hiện một MDB mà sau đó sẽ chỉ unwrap các thông số từ tin nhắn và gọi một số phương pháp đậu phiên không trạng thái trực tiếp đi qua trong các thông số đó. Trong trường hợp này, mô hình nhắn tin là hoàn toàn không cần thiết và chỉ cần gọi một phương thức chú thích @Asynchronous là một cách tiếp cận đơn giản và trực tiếp hơn.

+0

Xe buýt sự kiện CDI không đồng bộ. – Luke

+0

@Luke bạn nói đúng. Câu trả lời của tôi như đã nêu không chính xác. Điều tôi muốn nói là bus sự kiện CDI là một sự thay thế đơn giản cho JMS cho những trường hợp nó được sử dụng cho sự kiện (không thực sự không đồng bộ) và '@ Asynchronous' là cho những trường hợp chỉ cần một số hành vi không đồng bộ. Hãy xem cách cập nhật tốt nhất nó;) –

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