2012-01-18 13 views
5

Tôi có EJB A gọi EJB B. Giao diện người dùng không nên chờ quá 30 giây để trả lời. Nếu một số dữ liệu bị thiếu, nó sẽ trả về một phần phản hồi.Gọi EJB với thời gian chờ

Làm cách nào để xác định thời gian chờ (giới hạn thời gian 30 giây) trên EJB B?

Tôi có thể xác định EJB BAsynchronous trả về Future và sau đó thực hiện Future.get(30, TimeUnit.SECONDS). Nhưng nó là giải pháp tốt nhất?

cảm ơn bạn

P.S. Tôi sử dụng glassfish 3.1

Trả lời

0

Để định cấu hình thời gian chờ cho một bean áp dụng cho tất cả các phương pháp của nó, bạn phải định cấu hình thuộc tính cmt-timeout-in-seconds trong glassfish-ejb-jar.xml.

Giá trị hết giờ này được sử dụng bởi tất cả các phương pháp của bean khởi tạo giao dịch mới, không áp dụng khi chúng tham gia giao dịch đang diễn ra khác.

Cũng có thể tham khảo link để biết thêm chi tiết về thời gian chờ.

2

Không có cách nào để làm gián đoạn EJB đích. Tùy chọn thực sự duy nhất là cho EJB mục tiêu hợp tác và định kỳ kiểm tra xem nó có vượt quá thời gian phản hồi mục tiêu dự kiến ​​hay không.

Ngay cả khi bạn sử dụng @Asynchronous và số Future.get lần nữa, bạn vừa bỏ chặn khách hàng chờ kết quả; EJB đích sẽ tiếp tục thực hiện và tiêu thụ tài nguyên. Tuy nhiên, với các phương pháp không đồng bộ, bạn có lợi ích của một số hủy hợp tác tích hợp sẵn bằng cách sử dụng Future.cancelSessionContext.wasCancelCalled.

+0

Tôi không có nghĩa là làm gián đoạn EJB. Ý tưởng là trả lại phản hồi (hoặc "lỗi hết thời gian chờ") cho giao diện người dùng sau 30 giây. – lili

+2

Chắc chắn, nhưng thời gian ra khỏi front-end mà không có thời gian ra back-end có vẻ không khôn ngoan. Cuối cùng, các chủ đề back-end của bạn sẽ được tiêu thụ và các giao diện front-end của bạn sẽ phải chờ đợi. Với những gì bạn đã nói, sử dụng '@ Không đồng bộ' có lẽ là tốt nhất. –

5

Tôi khuyên bạn nên sử dụng thời gian chờ giao dịch cho việc này.

Tôi không nghĩ rằng có một cách tiêu chuẩn để cấu hình nó để nó sẽ phụ thuộc vào máy chủ ứng dụng. Tôi giả sử bạn muốn đặt nó cụ thể cho mỗi lớp hoặc phương pháp.

Đối với WebLogic, bạn có thể chỉ định nó trong "weblogic-ejb-jar.xml" trong "bộ mô tả giao dịch" hoặc sử dụng chú thích "@TransactionTimeoutSeconds".

http://docs.oracle.com/cd/E12839_01/web.1111/e13719/ejb_jar_ref.htm#i1506703

http://docs.oracle.com/cd/E21764_01/web.1111/e13720/annotations.htm#i1438354

Đối với JBoss AS bạn có thể đặt thời gian chờ giao dịch bằng cách sử dụng chú thích "@TransactionTimeout" hoặc trong "jboss.xml".

https://community.jboss.org/wiki/TransactionTimeout

Tôi chắc chắn có những lựa chọn cấu hình tương tự trong mỗi máy chủ ứng dụng.