2012-12-15 49 views
5

Giao dịch cơ sở dữ liệu là một khái niệm quen thuộc.Giao dịch JMS

try { 
    ... 
    .. 
    updateDB() 
    .. 
    ... 
    commit(); 
} catch error { 
    rollback(); 
} 

nếu có lỗi xảy ra bất kỳ thay đổi nào do updateDB thực hiện sẽ bị hủy.

Tôi muốn biết thông báo giao dịch hàng đợi thư sẽ hoàn tác như thế nào.

try{ 
    ... 
    ... 
    //EDIT: swapped the order of receive and send 
    Message m = queue1.receiveMessage(..) 
    .. 
    .. 
    queue2.sendMessage(..) 
    .. 
    .. 
    commit(); 
} catch error { 
    rollback(); 
} 

đặc biệt, điều gì sẽ rollback làm

  1. hủy việc gửi thông điệp
  2. un-nhận được thông báo tức là đặt lại nhận nhắn lại phải xếp hàng

hoặc là tôi kéo dài cơ sở dữ liệu tương tự tx quá xa.

nhờ

EDIT: tôi không ngụ ý gửi và nhận các hoạt động có liên quan. tôi chỉ muốn nói rằng có hai hoạt động thay đổi trạng thái của nhà môi giới tin nhắn - nhận sẽ đưa ra một thông điệp từ hàng đợi sẽ không có sẵn cho người tiêu dùng khác nếu có.

Trả lời

9

Rollback của gửi thẳng về phía trước, thông báo sẽ không được đưa vào hàng đợi2.

Rollback của nhận sẽ thường đưa thông điệp trở lại trên hàng đợi (queue1). Tùy thuộc vào cấu hình và thiết lập nhà cung cấp JMS của bạn, thông báo sẽ được gửi lại một số lần. Nếu giao dịch cuộn lại quá nhiều lần (quá nhiều cấu hình), nó sẽ được đặt vào hàng đợi "Backout" (hoặc hàng đợi chữ cái chết), để nó không chặn hàng đợi cho các tin nhắn khác. Thông báo được sao lưu thường cần xử lý lỗi thủ công.

0

Có, bạn đang kéo dài quá xa.

Ở chế độ đã giao dịch, queue.receiveMessage() của bạn sẽ không bao giờ trả lại (giả định rằng nó được đặt để chờ thư trả lời cụ thể và không chỉ là "bất kỳ thư nào"), đơn giản là vì queue.sendMessage() không thực sự gửi tin nhắn được gửi khi giao dịch được thực hiện).

Đó là một lỗi phổ biến, nhân tiện. Khi sử dụng JMS (giao thức không đồng bộ) cho truyền thông đồng bộ, việc xem chu trình gửi/nhận như một giao dịch là điều tự nhiên. Tuy nhiên, đó không phải là trường hợp. Khi bạn phát hành sendMessage() ở chế độ đã giao dịch, không có gì thực sự xảy ra; tin nhắn sẽ chỉ được gửi khi giao dịch được thực hiện.

+0

cảm ơn thông tin chi tiết của bạn. nhưng tôi đã không ngụ ý rằng tôi đã chờ đợi một thư trả lời của tin nhắn gửi, chỉ muốn chỉ ra hai thay đổi của nhà nước. tôi đã thêm giải thích cho câu hỏi của mình và đổi thứ tự nhận/gửi tin nhắn. – mzzzzb