2012-11-15 43 views
8

Tôi liệt kê các hàng đợi và thông điệp từ mỗi hàng đợi. Sau đây là mã của tôi. Tuy nhiên, QueueBrowser không truy xuất thư một cách chính xác.QueueBrowser không trả lại tất cả các tin nhắn

Giả sử, tôi có hàng đợi có tên là TestQueue có 1000 thư.

lần đầu tiên tôi chạy chương trình của mình, chương trình chỉ hiển thị 200 thư. giây - 400 thứ ba - 600 ra - 800 thứ năm - 1000

Bạn có thể cho tôi biết cách khắc phục sự cố này không?

ConnectionFactory out = new ActiveMQConnectionFactory("tcp://localhost:61616?jms.prefetchPolicy.all=10000"); 
ActiveMQConnection connection = (ActiveMQConnection) out.createConnection(); 

connection.start(); 
Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE); 

Set<ActiveMQQueue> amqs = connection.getDestinationSource().getQueues(); 
Iterator<ActiveMQQueue> queues = amqs.iterator(); 

while (queues.hasNext()) 
{ 
    ActiveMQQueue queue_t = aqueues.next(); 
    String q_name = queue_t.getPhysicalName(); 
    List<ActiveMQMessage> msgList = ((ActiveMQSession) session).getUnconsumedMessages(); 

    System.out.println("\nQueue = " + q_name); 

    QueueBrowser queueBrowser = session.createBrowser(queue_t); 
    Enumeration e = queueBrowser.getEnumeration(); 

    int numMsgs = 0; 
    while(e.hasMoreElements()) 
    { 
     Message message = (Message) e.nextElement(); 
     numMsgs++; 
    } 
    System.out.println("No of messages = " + numMsgs); 
    queueBrowser.close(); 
}      
session.close(); 
connection.close(); 
+0

Bạn đã giải quyết được sự cố này chưa? – rdmueller

+0

@Ralf, Chưa. Tôi cũng nhận thấy rằng ngay cả Web Console cũng có thể truy xuất 200 thư lúc đầu. Sau đó, vào lần thứ hai cố gắng duyệt lại, số lượng thư đã tăng lên 400. 600, 800 tiếp theo. Tôi đã kiểm tra mã Web Console và thấy rằng nó cũng đã sử dụng QueueBrowser. –

+0

giải pháp hiện tại của tôi là tiêu thụ tất cả tin nhắn mà không cần xác nhận. Vì vậy, tôi có thể nhận được tất cả các tin nhắn và vẫn có thể duy trì chúng trong hàng đợi. nhưng, tôi cảm thấy nó không đáng tin cậy. giải pháp tiếp theo là duyệt hàng đợi một lần nữa và một lần nữa cho đến khi số lượng tin nhắn tối đa được đáp ứng. –

Trả lời

3

Từ javax.jms.QueueBrowser API:

tin nhắn có thể được đến và hết hạn trong khi quá trình quét được thực hiện. API JMS không yêu cầu nội dung của một liệt kê là ảnh tĩnh của nội dung hàng đợi. Cho dù những thay đổi này có thể nhìn thấy hay không phụ thuộc vào nhà cung cấp JMS.

Bạn đã thử chỉ định prefetch policy?

+0

cảm ơn câu trả lời nhưng hành vi là như nhau sau khi thêm chính sách tìm nạp trước. Tôi đã chỉnh sửa mã được đề cập. –

0

Chỉ cần kết nối bằng JMX với Người môi giới (ví dụ như sử dụng jconsole). Trên hàng đợi cụ thể thiết lập các thuộc tính MaxPageSize hơn 200 thì bạn có thể liệt kê nhiều tin nhắn hơn.

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