2012-03-02 45 views

Trả lời

1

Đối tượng QueueBrowser có thể là thứ bạn cần. Tôi nghĩ rằng nó có phương pháp xóa (hoặc tương tự)

+1

Tôi không nghĩ rằng có một phương pháp xóa trong QueueBrowser như xa như đọc từ các tài liệu java ... Queue trình duyệt duy nhất là được sử dụng để đọc hàng đợi – avikodak

+0

Bạn nói đúng - nhưng tôi nhớ sử dụng QueueBrowser trong nội dung này. Nếu tôi nhớ đúng, tôi đã đếm các thông điệp trong Hàng đợi, lặp lại điều đó, và tiêu thụ thông điệp mà tôi quan tâm (và chỉ là không có gì với nó) – DaveH

+0

Ok tôi sẽ xem xét nó ... nhưng tôi có một nhỏ doubht chúng ta có thể thay đổi tiêu đề của thông điệp khi chúng nằm trong hàng đợi ... để tôi có thể thay đổi thuộc tính "time_to_live" – avikodak

7

Không có API trực tiếp để xóa thư. Bạn có thể gọi phương thức queueReceiver.receive() để xóa một tin nhắn khỏi hàng đợi. QueueBrowser sẽ không xóa thư khỏi hàng đợi.

+0

Chúng ta không thể làm gì nếu không có phương thức Receive.receive() ... – avikodak

2

Đây là điều tôi có thể làm việc:

Tôi giả sử bạn muốn xóa thư phù hợp với tiêu chí cụ thể.

Queue destination = session.createQueue("your_q"); 

QueueBrowser browser = session.createBrowser(destination); 

Enumeration<?> enum1 = browser.getEnumeration(); 

while(enum1.hasMoreElements()) 
{ 
    TextMessage msg = (TextMessage)enum1.nextElement(); 
    if(msg.getStringProperty("any_prop").equals("some_prop")) 
    { 
     MessageConsumer consumer = session.createConsumer(destination, "id='" + msg.getStringProperty("id") + "'"); 
     consumer.receive(1000); 
    } 
} 
1

Đây là điều mà tôi đã thực sự thử nghiệm thành công trên WebLogic:

destinationJNDI nên chứa tên JNDI của hàng đợi, như "[email protected]_Notifications.NLNotificationReprocessQ".

ctx phải là một InitialContext hợp lệ như:


    Properties env = new Properties(); 
    env.put(javax.naming.Context.PROVIDER_URL, PROVIDER_URL); 
    env.put(Context.SECURITY_PRINCIPAL, WL_USER); 
    env.put(Context.SECURITY_CREDENTIALS, WL_PASSWORD); 
    env.put(Context.INITIAL_CONTEXT_FACTORY, WL_INITIAL_CONTEXT_FACTORY); 
    InitialContext ctx = new InitialContext(env); 

 

idlist phải là một danh sách CSV ID thông điệp mà bạn muốn xóa

này là mã:



    javax.jms.Queue queue = (javax.jms.Queue) ctx.lookup(destinationJNDI.toString()); 

    // lookup the queue connection factory 
    QueueConnectionFactory queueConnFactory = (QueueConnectionFactory) ctx.lookup(WEBLOGIC_JMS_XA_CONNECTION_FACTORY); 
    // create a queue connection 
    QueueConnection queueConn = queueConnFactory.createQueueConnection(); 
    queueConn.start(); 

    // create a queue session 
    Session queueSession = queueConn.createQueueSession(false, Session.AUTO_ACKNOWLEDGE); 
    for (String id : idlist.split(",")) { 
     if (id.startsWith("ID:")) { 
     MessageConsumer consumer = queueSession.createConsumer(queue, " JMSMessageID='" + id + "'"); 
     Message message = consumer.receive(1000); 
     out.write("message = " + message + " "); 
     out.write("deleted ID " + id + " "); 
     } 
    } 
    queueSession.close(); 
    queueConn.close(); 


 
3

tôi đã phải gọi thêm session.commit() để người tiêu dùng xóa tin nhắn.

Ngoài ra, API receivenowait không hoạt động; hãy gọi số receive(1000).

Đây là một mảnh làm việc mã tôi đã viết rằng làm việc trên jboss:

try { 
    connection = connectionFactory.createConnection(); 
    session = connection.createSession(true,-1); 
    Queue queue = (Queue) QueueConnectionFactory.getInitialContext().lookup("/queue/DLQ"); 
    QueueBrowser browser = session.createBrowser(queue); 
    Enumeration<?> enum1 = browser.getEnumeration(); 

    while(enum1.hasMoreElements()) { 
    TextMessage msg = (TextMessage)enum1.nextElement(); 
    MessageConsumer consumer = session.createConsumer(queue, "JMSMessageID='" + msg.getJMSMessageID() + "'"); 
    //You can try starting the connection outside while loop as well, I think I started it inside while loop by mistake, but since this code worked I am hence letting you know what worked 
    connection.start(); 
    Message message = consumer.receive(1000) ; 
    if (message != null) { 
     //do something with message 
    } 
    } 
} 
finally { 
    session.commit(); 
    consumer.close(); 
    browser.close(); 
    session.close(); 
    connection.close(); 
} 
Các vấn đề liên quan