队列未清除消耗的消息

时间:2015-07-06 09:52:19

标签: java jms deque advanced-queuing

我正在使用以下代码。我能够创建,浏览,发送和接收消息。但是当我从队列中消费消息时,它不会从队列中清除。

import java.util.ArrayList;
import java.util.Enumeration;
import java.util.List;

import javax.jms.JMSException;
import javax.jms.MessageConsumer;
import javax.jms.MessageProducer;
import javax.jms.Queue;
import javax.jms.QueueBrowser;
import javax.jms.QueueConnection;
import javax.jms.QueueConnectionFactory;
import javax.jms.Session;
import javax.jms.TextMessage;

import oracle.AQ.AQDequeueOption;
import oracle.AQ.AQQueueTable;
import oracle.AQ.AQQueueTableProperty;
import oracle.jdbc.aq.AQDequeueOptions;
import oracle.jms.AQjmsDestination;
import oracle.jms.AQjmsDestinationProperty;
import oracle.jms.AQjmsException;
import oracle.jms.AQjmsFactory;
import oracle.jms.AQjmsSession;

public class OracleAQClient {

    public static QueueConnection getConnection() {

        String hostname = "xx.xxx.xxx.xxx";
        String oracle_sid = "CIPSOE";
        int portno = 1521;
        String userName = "priyo";
        String password = "priyo";
        String driver = "thin";
        QueueConnectionFactory QFac = null;
        QueueConnection QCon = null;
        try {
            // get connection factory , not going through JNDI here
            QFac = AQjmsFactory.getQueueConnectionFactory(hostname, oracle_sid, portno, driver);
            // create connection
            QCon = QFac.createQueueConnection(userName, password);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return QCon;
    }

    public static void createQueue(String user, String qTable, String queueName) {
        try {
             //Create Queue Tables 
            System.out.println("Creating Queue Table...");
            QueueConnection QCon = getConnection();
            Session session = QCon.createQueueSession(false, Session.CLIENT_ACKNOWLEDGE);

            AQQueueTableProperty qt_prop;
            AQQueueTable q_table = null;
            AQjmsDestinationProperty dest_prop;
            Queue queue = null;
            qt_prop = new AQQueueTableProperty("SYS.AQ$_JMS_TEXT_MESSAGE");
            try
            {
                q_table = ((AQjmsSession) session).createQueueTable(user, qTable, qt_prop); //why db username is required
                System.out.println("Qtable created");
                dest_prop = new AQjmsDestinationProperty();
                 //create a queue 
                queue = ((AQjmsSession) session).createQueue(q_table, queueName, dest_prop);
                System.out.println("Queue created");
                 //start the queue 
                ((AQjmsDestination) queue).start(session, true, true);
            }
            catch (AQjmsException e) {  //new queue to be added to existing qtable
                if(e.getErrorCode().equals("24001"))
                {
                    System.out.println("Qtable Already exists");
                    q_table=((AQjmsSession) session).getQueueTable(user,  qTable);
                    dest_prop = new AQjmsDestinationProperty();
                     //create a queue 
                    queue = ((AQjmsSession) session).createQueue(q_table, queueName, dest_prop);
                    System.out.println("Queue created");
                     //start the queue 
                    ((AQjmsDestination) queue).start(session, true, true);
                }
                else
                {
                    throw e;
                }
            }        
        }
        catch (AQjmsException e) {  //new queue to be added to existing qtable
            if(e.getErrorCode().equals("24006"))
            {
                System.out.println("Queue already present in Queue Table");
            }
            else
            {
                e.printStackTrace();
            }
        }
        catch (Exception e) {  //Error 24006 to be handled
            e.printStackTrace();
            return;
        }
    }

    public static void sendMessage(String user, String queueName,String message) {

        try 
        {
            QueueConnection QCon = getConnection();
            Session session = QCon.createQueueSession(false, Session.CLIENT_ACKNOWLEDGE);
            QCon.start();
            Queue queue = ((AQjmsSession) session).getQueue(user, queueName);
            MessageProducer producer = session.createProducer(queue);
            TextMessage tMsg = session.createTextMessage(message);

            //set properties to msg since axis2 needs this parameters to find the operation
            tMsg.setStringProperty("SOAPAction", "getQuote");
            producer.send(tMsg);
            System.out.println("Sent message = " + tMsg.getText());

            session.close();
            producer.close();
            QCon.close();

        } 
        catch (JMSException e) 
        {
            e.printStackTrace();
            return;
        }
    }

    public static void browseMessage(String user, String queueName) {
        Queue queue;
        try {
            QueueConnection QCon = getConnection();
            Session session = QCon.createQueueSession(false, Session.CLIENT_ACKNOWLEDGE);

            QCon.start();
            queue = ((AQjmsSession) session).getQueue(user, queueName);
            QueueBrowser browser = session.createBrowser(queue);
            Enumeration enu = browser.getEnumeration();
            List list = new ArrayList();
            while (enu.hasMoreElements()) {
                TextMessage message = (TextMessage) enu.nextElement();
                list.add(message.getText());
            }
            for (int i = 0; i < list.size(); i++) {
                System.out.println("Browsed msg " + list.get(i));
            }
            browser.close();
            session.close();
            QCon.close();

        } catch (JMSException e) {
            e.printStackTrace();
        }

    }

    public static void consumeMessage(String user, String queueName) {
        Queue queue;
        try {
            QueueConnection QCon = getConnection();
            Session session = QCon.createQueueSession(false, Session.CLIENT_ACKNOWLEDGE);
            QCon.start();
            queue = ((AQjmsSession) session).getQueue(user, queueName);
            MessageConsumer consumer = session.createConsumer(queue);
            TextMessage msg = (TextMessage) consumer.receive();
            msg.acknowledge();
            //consumeMessage(user, queueName);
            System.out.println("MESSAGE RECEIVED " + msg.getText());

            consumer.close();
            session.close();
            QCon.close();
        } catch (JMSException e) {
            e.printStackTrace();
        }
    }

}

我有什么遗漏的吗?

1 个答案:

答案 0 :(得分:1)

创建会话时,您已指定Session.CLIENT_ACKNOWLEDGE;这意味着您必须明确发送确认,msg.acknowledge()。但如果您希望自动更改确认

Session session = QCon.createQueueSession(false, Session.CLIENT_ACKNOWLEDGE);

Session session = QCon.createQueueSession(false, Session.AUTO_ACKNOWLEDGE);

link