2012-03-02 20 views
7

से एक संदेश को कैसे हटाएं मॉनिटरिंग एडमिन टूल का उपयोग किये बिना जेएमएस कतार से संदेश हटाने के लिए कोई एपीआई है।जेएमएस कतार

उत्तर

1

एक QueueBrowser ऑब्जेक्ट आपको जो चाहिए वह हो सकता है। मुझे लगता है कि इसमें एक डिलीट विधि (या समान)

+1

मुझे लगता है कि QueueBrowser में एक हटाने विधि है जहाँ तक जावा डॉक्स से पढ़ने के रूप में न ... कतार ब्राउज़र ही है कतार – avikodak

+0

पढ़ने के लिए उपयोग किया जाता है आप सही हैं - लेकिन मुझे इस सामग्री में एक QueueBrowser का उपयोग याद है। अगर मुझे सही याद है कि मुझे कतार में संदेशों की गणना मिली है, उस पर पुनरावृत्त किया गया है, और उस संदेश को खपत किया जिसकी मुझे रूचि थी (और इसके साथ कुछ भी नहीं) – DaveH

+0

ठीक है, मैं इसे देख लूंगा ... लेकिन मेरे पास छोटे दोगुनी हम कतार में होने पर संदेश के शीर्षलेखों को बदल सकते हैं ... ताकि मैं संपत्ति को "time_to_live" – avikodak

7

संदेश हटाने के लिए कोई प्रत्यक्ष API नहीं है। आप कतार से संदेश निकालने के लिए queueReceiver.receive() विधि को कॉल कर सकते हैं। QueueBrowser कतार से संदेशों को नहीं हटाएगा।

मैं तुम्हें एक संदेश किसी विशेष मापदंड से मेल खाते को हटाना चाहते संभालने हूँ:

+0

के माध्यम से संदेश का उपभोग कैसे किया जाए क्या हम Receiver.receive() विधि के बिना करते हैं ... – avikodak

2

यहाँ कुछ मैं काम करने के लिए हो सकता है।

destinationJNDI "[email protected]_Notifications.NLNotificationReprocessQ" की तरह, कतार के JNDI नाम शामिल करना चाहिए:

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 पर सफलतापूर्वक परीक्षण किया है।



    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

मैं:


    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 संदेश आईडी कि आप हटाना चाहते हैं की एक सीएसवी सूची होना चाहिए

इस कोड है:

ctx की तरह एक वैध InitialContext होना चाहिए उपभोक्ता को संदेश हटाने के लिए अतिरिक्त रूप से session.commit() पर कॉल करना पड़ा।

इसके अतिरिक्त, receivenowait एपीआई काम नहीं करता है; इसके बजाय 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(); 
} 
संबंधित मुद्दे