2013-08-12 49 views
7

Chúng tôi đang đối mặt với một vấn đề ngẫu nhiên với ActiveMQ và người tiêu dùng. Chúng tôi quan sát thấy rằng, rất ít người tiêu dùng không nhận được tin nhắn, mặc dù họ được kết nối với hàng đợi ActiveMQ. Nhưng nó hoạt động tốt sau khi người tiêu dùng khởi động lại.Người tiêu dùng không nhận được tin nhắn từ ActiveMQ

Chúng tôi có hàng đợi có tên testQueue ở phía ActiveMQ. Một người tiêu dùng đang cố gắng loại bỏ các tin nhắn từ hàng đợi này. Chúng tôi đang sử dụng DefaultMessageListenerContainer của Spring cho mục đích này. Thư đang được gửi đến nút người tiêu dùng từ ActiveMQ Broker. Từ tcpdump là tốt, nó đã được rõ ràng rằng, tin nhắn là đạt đến nút người tiêu dùng, Nhưng mã người tiêu dùng thực tế là không thể nhìn thấy tin nhắn. Nói cách khác, thông báo dường như bị kẹt trong mã người tiêu dùng ActiveMQ hoặc trong DefaultMessageListenerContainer của Spring.

Xem tham khảo hình bên dưới. để rõ ràng hơn về vấn đề này. Thông báo đạt đến nút Người tiêu dùng, nhưng nó không đạt đến “Lớp tiêu dùng thực tế”, có nghĩa là thông báo đã bị kẹt trong mã người tiêu dùng AMQ hoặc Spring DMLC.

enter image description here

Dưới đây là các chi tiết được chụp từ quản trị viên ActiveMQ.

Queue-Tên/Pending-tin-Count/Consumer-Count/Tin nhắn-enqueued/Tin nhắn-dequeued testQueue/9/1/9/0

Dưới đây là những chi tiết.

Connection-ID/sessionId/Selector/Enqueues/dequeues/cử đến/cử đến-Queue/Prefetch ID: bearsvir52-45176-1375519181268-3: 5/1// 9/0/9/9/250

Từ bảng thứ hai, rõ ràng là, các thông báo đang được gửi tới người tiêu dùng, nhưng người tiêu dùng không thừa nhận thông báo. Do đó các tin nhắn bị mắc kẹt trong Dispatched-Queue ở bên môi giới.

Ít điểm cho thông báo của bạn:

1) Không có chênh lệch thời gian b/w Nút môi giới và nút người tiêu dùng.

2) Quan sát tcpdump ở phía người tiêu dùng. Chúng ta có thể thấy gói tin MessageDispatch (Openwire) đang được chuyển tới nút người tiêu dùng, nhưng không thể tìm thấy MessageAck (Openwire) cho cùng một gói.

3) Đôi khi nó hoạt động trên một nút và đôi khi nó đang tạo ra sự cố trên cùng một nút.

+0

Bạn có thể gửi lên cấu hình mùa xuân cho thấy ConectionFactory, DMLC và lớp người nghe? –

+0

Tôi đang đối mặt với cùng một vấn đề. Bạn đã nhận được một giải pháp? –

+0

Mọi cập nhật? Tôi gặp vấn đề tương tự – Nereis

Trả lời

2

Mất nhiều thời gian để tìm ra giải pháp. Dường như có sự cố với lớp học org.apache.activemq.ActiveMQConnection.java, trong trường hợp AMQ bị lỗi. Đối tượng kết nối không bắt đầu ở phía người tiêu dùng trong những trường hợp như vậy.

Sau đây là bản sửa lỗi tôi đã thêm vào tệp ActiveMQConnection.java và biên dịch các nguồn để tạo activemq-core-x.x.x.jar

private final Object startMutex = new Object(); 

thêm một tấm séc trong phương pháp createSession

public Session createSession(boolean transacted, int acknowledgeMode) throws JMSException { 
    synchronized (startMutex) { 
     if(!isStarted()) { 
      start(); 
     } 
    } 
1

Một nguyên nhân của việc này có thể không chính xác khi sử dụng CachingConnectionFactory (với người tiêu dùng được lưu trong bộ nhớ cache) với hộp chứa người nghe điều chỉnh động người tiêu dùng (người tiêu dùng tối đa> người tiêu dùng). Bạn có thể kết thúc với một người tiêu dùng được lưu trong bộ nhớ cache chỉ cần ngồi trong hồ bơi và không được chủ động sử dụng. Bạn không bao giờ cần phải cache người tiêu dùng với một container listener.

Đối với các sự cố như vậy, tôi thường khuyên bạn nên chạy bằng ghi nhật ký TRACE và bạn có thể xem tất cả hoạt động của người tiêu dùng.

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