2008-09-17 28 views
10

Tôi đang cố gắng thay thế một số hàng đợi tin nhắn riêng biệt bằng ActiveMQ và tôi cần nói chuyện với họ (rất nhiều) từ Perl. ActiveMQ cung cấp một giao diện Stomp và Perl có Net :: Stomp, do đó, điều này có vẻ như nó phải là tốt, nhưng nó không phải.Làm cách nào để sử dụng các giao dịch với Stomp và ActiveMQ (và Perl)?

Ngay cả khi tôi gửi lệnh BEGIN qua Stomp, tin nhắn được gửi kèm SEND được xuất bản ngay lập tức và nếu tôi KHÔNG PHẢI giao dịch, thì không có gì xảy ra.

Tôi không thể tìm thấy bất kỳ câu trả lời rõ ràng nào cho thấy điều đó không thể thực hiện được, điều đó là có thể hoặc có một chút cấu hình có liên quan. Ngoài ra, Stomp dường như không phải là một giao thức tuyệt vời để kiểm tra phản hồi lỗi từ máy chủ.

Tôi có gặp may không?

Trả lời

3

BTW nơi tốt nhất để đặt câu hỏi Perl/ActiveMQ/Stomp là ActiveMQ user forum khi nhiều người Perl-Stomp tham gia hangout ở đó.

Bí quyết với giao dịch STOMP là đảm bảo mỗi thư bạn gửi hoặc mỗi xác nhận bạn thực hiện bao gồm tiêu đề ID giao dịch. Xem transaction handling section of the STOMP protocol.

Lý do cho điều này là với STOMP bạn có thể có nhiều giao dịch diễn ra cùng một lúc nếu khách hàng của bạn đa luồng - cùng với một số hoạt động không giao dịch.

+0

Vâng, tôi đang theo các quy tắc giao thức Stomp và gửi tiêu đề giao dịch. (Tôi ước gì mình có thể nhận được tcpflow làm việc trên cỗ máy này; tcpdump hút cho xem stomp.) Tôi cũng sẽ thử diễn đàn đó, cảm ơn! – rjbs

1

Hãy xem Net::Stomp::Receipt. Đó là một lớp con của Net :: Stomp thực hiện "các biên nhận trả lại" từ giao thức Stomp và cho phép bạn đảm bảo việc nhận thư chính xác của mình và hủy bỏ giao dịch theo cách khác.

1

Bạn phải gửi xác nhận trong giao dịch.

Trong giả (hoặc giả STOMP) này sẽ là:

  • BEGIN [GIAO DỊCH-ID] -> gửi đến máy chủ
  • MESSAGE [THÔNG ĐIỆP-ID] (nhận) < - nhận được từ máy chủ
  • ACK [THÔNG ĐIỆP-ID] [GIAO DỊCH-ID] -> gửi đến máy chủ
  • COMMIT [GIAO DỊCH-ID] -> gửi đến máy chủ

tôi đã nhận được điều này làm việc với các trình điều khiển PHP (vá cuộc gọi hủy bỏ để sử dụng ID giao dịch khi tôi vượt qua trong một đối tượng khung để xác nhận).

Thật không may, sau khi gửi lại bốn tin nhắn mà khách hàng dừng. Ít nhất điều này xảy ra với tôi.

+0

nếu nói, tôi có một vòng lặp trong khi, sẽ giả mã được trong vòng lặp? hoặc BEGIN và ABORT có ở bên ngoài không? – obsessiveCookie

+1

Họ sẽ ở trong vòng lặp vì bạn cần mở một giao dịch cho mỗi tin nhắn được gửi và nhận. –

+0

liệu id giao dịch có được đặt thành một cái gì đó khác nhau mỗi lần? – obsessiveCookie

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