2011-12-31 31 views
8

Cách tốt nhất để thực hiện những điều sau đây là gì?@MessageDriven giao dịch và ngữ nghĩa phân phối lại

  • @MessageDriven đậu làm một số công việc trên cơ sở dữ liệu
  • trên thất bại, tôi muốn quay trở lại giao dịch DB
  • nhưng tôi cũng muốn thông điệp JMS KHÔNG được redelivered, tức là, không tái thử.

Tôi có thể nghĩ ra một số cách mà có thể hoạt động. Có người nào khác, và đó là tốt nhất?

  • sử dụng @TransactionManagement(type=BEAN)UserTransaction và quay trở lại sau khi bắt ngoại lệ. ví dụ .:

    catch (Exception e) { e.printStackTrace(); utx.rollback(); }

  • Sử dụng giao dịch container quản lý, xác định @TransactionAttribute(value=NOT_SUPPORTED) trên onMessage và sau đó ủy thác hoạt động DB đến một phương pháp riêng biệt với @TransactionAttribute(value=REQUIRED).

  • Chỉ để xử lý giao dịch và định cấu hình lại thuộc tính thử lại trong máy chủ. Tôi đang sử dụng Glassfish 3.1.1, và tôi không chắc chắn làm thế nào để thiết lập này.

  • Để mọi thứ một mình và kiểm tra rõ ràng thư để gửi lại trong cơ thể onMessage và thoát ra nếu được phân phối lại. (message.getJMSRedelivered()?)

Điều gì đã làm việc tốt trên mạng? Có cách nào tiêu chuẩn/thực hành tốt nhất để giải quyết vấn đề này không?

Trả lời

8

đơn giản nhất và hầu hết các di động tiếp cận là sử dụng @TransactionAttribute(value=NOT_SUPPORTED) trên onMessage() như bạn nêu và để di chuyển các công trình DB để đậu khác với @TransactionAttribute(REQUIRES_NEW)

Hãy cẩn thận về cách tiếp cận phương pháp riêng biệt như thế này sẽ không hoạt động. Trong phương pháp JMS MDB, phương pháp onMessage() là phương pháp duy nhất có thể sử dụng @TransactionAttribute.

+1

Cảm ơn, điều này đã hoạt động hoàn hảo. Lưu ý về @TransactionAttribute trong MDBs là chìa khóa - bạn nói đúng, bạn chỉ có thể chú thích 'onMessage'. Tôi không chú thích 'onMessage' ở cuối nhưng đã chuyển logic sang EJB khác bằng' REQUIRES_NEW'. – wrschneider

+0

Cũng giống như một lưu ý, nó hoạt động với EJB con được chú thích bằng "REQUIRED". – apetrelli

2

Cá nhân tôi không bao giờ thực hiện bất kỳ công việc nào trong MDB, nhưng gửi ngay đến bean phiên (được tiêm).

Đậu này sau đó thực hiện công việc DB. Nó hoặc là bắt đầu một giao dịch mới, hoặc tôi bắt bất kỳ ngoại lệ từ đậu và đăng nhập nó (nhưng không để cho nó propogate, do đó, không có phân phối lại).

Điều này cũng có lợi thế là logic kinh doanh dễ dàng sử dụng lại từ những nơi khác.

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