2012-03-02 15 views

Odpowiedz

1

Obiekt QueueBrowser może być tym, czego potrzebujesz. Myślę, że ma ona metodę usuwania (lub podobną)

+1

nie sądzę istnieje metoda usuwania w QueueBrowser miarę odczytać z docs Java ... Kolejka Browser jest tylko używany do odczytu kolejki – avikodak

+0

Masz rację - ale pamiętam, używając QueueBrowser w tej treści. Jeśli dobrze pamiętam, to dostałem wyliczenie wiadomości w kolejce, powtórzyłem to i pochłonąłem wiadomość, która mnie interesowała (i po prostu nic nie dodawam). – DaveH

+0

Ok, przejrzę to ... ale ja mam mała wątpliwość czy możemy zmienić nagłówki wiadomości, gdy są one w kolejce ... tak, że mogę zmienić właściwość "time_to_live" – avikodak

7

Brak bezpośredniego interfejsu API do usuwania wiadomości. Możesz wywołać metodę queueReceiver.receive(), aby usunąć komunikat z kolejki. QueueBrowser nie usuwa wiadomości z kolejki.

+0

Nie możemy zrobić bez metody Receiver.receive() ... – avikodak

2

Oto coś mogę dostać się do pracy:

jestem zakładając, że chcesz usunąć wiadomość dopasowanie konkretnego kryteria.

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

To jest coś, co faktycznie testowany z powodzeniem na WebLogic:

destinationJNDI powinno zawierać nazwę JNDI kolejki, jak „[email protected]_Notifications.NLNotificationReprocessQ”.

ctx powinien być ważny InitialContext jak:


    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); 

 

obiektu IDList powinna być lista CSV identyfikatorów wiadomość, którą chcesz usunąć

jest to kod:



    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 musiał dodatkowo zadzwonić pod numer session.commit(), aby konsument mógł usunąć wiadomości.

Ponadto interfejs API receivenowait nie działa; zadzwoń pod numer receive(1000).

Oto kawałek kodu działa pisałem, że pracował na 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(); 
} 
Powiązane problemy