2012-03-02 31 views

回答

1

QueueBrowser对象可能是您需要的。我认为它有一个删除方法(或类似的)

+1

我不认为有在QueueBrowser删除方法尽可能从Java文档读取...队列浏览器是唯一用于读队列 – avikodak 2012-03-02 07:10:53

+0

你是对的 - 但我记得在这个内容中使用QueueBrowser。如果我没有记错的话,我可以列举队列中的消息,重复这些消息,并且消费我感兴趣的消息(并且只是对它不做任何处理) – DaveH 2012-03-02 07:54:44

+0

好吧,我会查看它,但是我有一个小的怀疑我们可以更改邮件的标题,当他们在队列中......这样我可以更改属性“time_to_live” – avikodak 2012-03-02 09:04:52

7

没有直接的API删除消息。您可以调用queueReceiver.receive()方法从队列中删除消息。 QueueBrowser不会从队列中删除消息。

+0

我们可以不用Receiver.receive()方法... – avikodak 2012-03-02 08:42:15

2

这里是我能得到工作:

我假设你要删除的消息相匹配的特定条件。

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

这是什么,其实我已经在WebLogic上成功测试:

destinationJNDI应包含队列的JNDI名称,如“[email protected]_Notifications.NLNotificationReprocessQ”。

CTX应该像一个有效的InitialContext:


    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应该是要删除的消息ID的CSV列表

这是代码:



    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

我不得不另外拨打session.commit()让消费者删除消息。

此外,receivenowait API不起作用;改为拨打receive(1000)

这里是代码工作的一块,我写了工作的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(); 
}