2012-03-02 60 views

Respuesta

1

Un objeto QueueBrowser puede ser lo que necesita. Creo que tiene un método de eliminación (o similar)

+1

Creo que no es un método de eliminación en el QueueBrowser por lo que lee de la documentación de Java ... cola Browser es solamente usado para leer la cola – avikodak

+0

Tiene razón, pero recuerdo haber usado un QueueBrowser en este contenido. Si mal no recuerdo recibí la enumeración de los mensajes en la cola, repetí sobre eso, y consumí el mensaje que me interesaba (y no hice nada con él) – DaveH

+0

Ok lo revisaré ... pero tengo un pequeña duda podemos cambiar los encabezados del mensaje cuando están en cola ... para que pueda cambiar la propiedad "time_to_live" – avikodak

7

No hay API directa para eliminar el mensaje. Puede llamar al método queueReceiver.receive() para eliminar un mensaje de una cola. QueueBrowser no eliminará los mensajes de la cola.

+0

No podemos prescindir del método Receiver.receive() ... – avikodak

2

Aquí es algo que podría llegar al trabajo:

estoy asumiendo que usted desea borrar un mensaje que coincida con un criterio particular.

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

Esto es algo que en realidad he probado con éxito en WebLogic:

destinationJNDI debe contener el nombre JNDI de la cola, como "[email protected]_Notifications.NLNotificationReprocessQ".

CTX debe ser un InitialContext válidos como:


    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 debe ser una lista CSV de identificadores de mensaje que desea eliminar

este es el código:



    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

I tuvo que llamar adicionalmente al session.commit() para que el consumidor elimine los mensajes.

Además, la API receivenowait no funciona; llame al receive(1000) en su lugar.

Aquí es una pieza de trabajo de código que he escrito que trabajé en 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(); 
} 
Cuestiones relacionadas