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)
và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ênonMessage
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?
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
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