2012-02-01 32 views
6

Tôi biết tôi không phải tinker với luồng trong EJB Container, do đó tôi không biết làm thế nào để làm điều sau đây trong một môi trường EJB đúng cách:Có điều gì đó hoạt động như .wait() và .notify() trong môi trường EJB không?

Tham gia đang:

  • Stateless Session Bean "Client"
  • Stateless Session Bean "server"
  • MessageQueue "Queue"
  • Message Driven Bean "Mdb" mà xử lý thông điệp từ "Queue"
  • n Stateless Session Beans W1 qua Wn

Kịch bản là:

Khách hàng gọi là Phương pháp server, mà lần lượt gửi nhiều tin nhắn để Queue. Sau đó, Máy chủ sẽ thực hiện một số nội dung khác. Trong thời gian chờ đợi, Mdb tiêu thụ một tin nhắn, gọi Wi thực hiện một số phép tính khá dài và nhận kết quả. Bây giờ Mdb cho kết quả là Máy chủ. Khi Máy chủ nhận tất cả "kết quả" cho mọi thư được gửi, nó sẽ thực hiện một số phép tính khác với kết quả từ W s và trả về kết quả đó cho Khách hàng.

My Vấn đề:

Trong Java SE tôi sẽ chỉ cần làm .wait() để có server chờ đợi kết quả của cuộc W s, sau server đã làm việc sau khi gửi tin nhắn. Sau đó, mdb sẽ .notify() khi nó đã đặt kết quả. Vì tôi không phải tinker với luồng trong các thùng chứa EJB, như các đặc điểm kỹ thuật nói, tôi bị mất nguyên nhân tôi đã không tìm thấy bất kỳ cách thích hợp để đạt được cùng một hành vi trong môi trường EJB.

Bất kỳ trợ giúp nào về vấn đề đó sẽ thực sự được đánh giá cao, cảm ơn trước.

P .: Tôi đang làm việc với JBoss 5.1.0, trong trường hợp có bất kỳ biện pháp cụ thể nào của nhà cung cấp để giải quyết vấn đề đó.

Trả lời

4

Giải pháp thích hợp cho điều này là mẫu "yêu cầu/phản hồi" để nhắn tin. Tóm lại, bạn có thể thực hiện các thao tác "đồng bộ" thông qua các hệ thống nhắn tin bằng cách gửi một tin nhắn và chờ đợi một thông báo phản hồi (tất cả điều này là hợp pháp trong thế giới J2EE).có nhiều cách bạn có thể đạt được điều này trong thực tế, nhưng ý tưởng chung là bạn gửi thông báo yêu cầu với một số định danh duy nhất, sau đó chờ tin nhắn phản hồi bằng bộ lọc thông báo cho (các) id yêu cầu mà bạn được gửi (thường là những gì mà "correlationId" field được sử dụng cho). MDB sẽ nhận được các thông báo yêu cầu, xử lý chúng và gửi các thông báo phản hồi bằng cách sử dụng các mã định danh duy nhất được chỉ định từ các thông điệp yêu cầu. bạn có thể làm tất cả điều này với một hàng đợi hoặc bạn có thể sử dụng hàng đợi yêu cầu/phản hồi riêng biệt hoặc bạn có thể làm những việc điên rồ như tạo "temporary" response queues (theo yêu cầu). bạn có thể cho MDB biết nơi gửi tin nhắn yêu cầu bằng cách sử dụng phương thức Message.setJMSReplyTo.

Các mô hình chung là:

  1. khách hàng gọi máy chủ
  2. server:
    1. tạo bài viết, đặt correlationId và replyTo
    2. tạo QueueSender, gửi tin nhắn
  3. mdb (lặp lại cho mỗi tin nhắn):
    1. nhận thông điệp
    2. quá trình nhắn
    3. gửi tin nhắn trả lời với correlationId
  4. server:
    1. tạo bộ lọc thư với correlationId
    2. tạo QueueReceiver với selector nhắn
    3. cuộc gọi cho đến khi tất cả các thư được nhận và xử lý (hoặc hết thời gian)
    4. không xử lý cuối cùng, đáp ứng cho khách hàng

(Rõ ràng, máy chủ tiến hành trực tiếp từ bước 2 đến bước 4, tôi chỉ viết nó theo cách này để làm nổi bật dòng điều khiển.)

+0

Ok, đó là tương tự như những gì tôi nghĩ về, nhưng vấn đề lớn nhất của tôi là "sau đó chờ đợi cho tin nhắn phản ứng" -part. Đó là nơi tôi sẽ sử dụng thông báo chờ đợi trong SE. Vì vậy, tôi đang tìm kiếm cơ chế chờ đợi thực tế với MDB. Bạn có gợi ý về điều đó không? – Daniel

+1

@Daniel - bạn sẽ thiết lập một MessageConsumer và gọi 'receive()' trên đó. đó là phần "chờ" của phương trình. bạn không sử dụng MDB cho xử lý cuối cùng, chỉ có tác phẩm được phân phối. – jtahlborn

+0

Có điều kiện chủng tộc nào có thể xảy ra khi máy chủ bỏ lỡ thông báo từ MDB hoàn tất trước khi máy chủ gọi nhận()? –

-1

đối tượng nào hoạt động như Máy chủ mà MDB trả về tất cả thư? nó có thể cần một số loại CountDownLatch để chờ đợi, trong kích thước số lượng tin nhắn (được thay đổi bởi MDB cho đến khi đạt đến số không). Khi nó trở thành số không, nó sẽ thức dậy có thể chạy mã trả về cho máy khách. Xem tài liệu API cho CountDownLatch.

+1

bạn aren không được sử dụng những thứ như CountDownLatch trong thế giới J2EE, cùng một vấn đề như chờ đợi/thông báo. – jtahlborn

+0

Tôi đoán đó là một cuộc thảo luận với một chủ đề khác. Vì J2EE vẫn là Java - Có bạn có thể, và nếu bạn vẫn cần phải làm việc với các chủ đề, bạn phải thiết kế ứng dụng của bạn để nó có thể hỗ trợ mã đó. – breezee

+1

Thực ra, tùy thuộc vào máy chủ ứng dụng, không bạn không thể. spec không cho phép các công cụ như vậy và một số máy chủ ứng dụng thực sự thực thi điều này thông qua SecurityManager tùy chỉnh (trong phạm vi được hỗ trợ bởi jvm). – jtahlborn

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