Java 是否可以禁用jms的createQueueBrowser的自动确认?

Java 是否可以禁用jms的createQueueBrowser的自动确认?,java,azure,jms,Java,Azure,Jms,我正在使用createQueueBrowser迭代队列的所有消息,它将在读取后从队列中删除所有消息,我希望在不删除队列中的消息的情况下迭代所有消息。怎么做 public class Receive { ConnectionFactory connectionFactory = null; Connection connection = null; void receivemsg() throws JMSException {

我正在使用createQueueBrowser迭代队列的所有消息,它将在读取后从队列中删除所有消息,我希望在不删除队列中的消息的情况下迭代所有消息。怎么做

    public class Receive {
        ConnectionFactory connectionFactory = null;
        Connection connection = null;

        void receivemsg() throws JMSException {
            connectionFactory = new JmsConnectionFactory("RootManageSharedAccessKey",
                    "Gkt0Egjp/5YTrqAf9z+f2+HoRungEOh4OMSRA69js6M=",
                    "amqps://amqpqpid.servicebus.windows.net?amqp.idleTimeout=-1");

            /*
             * connectionFactory = new
             * JmsConnectionFactory("RootManageSharedAccessKey",
             * "Gkt0Egjp/5YTrqAf9z+f2+HoRungEOh4OMSRA69js6M=",
             * "amqps://amqpqpid.servicebus.windows.net?amqp.idleTimeout=-1");
             */

            connection = connectionFactory.createConnection();
            connection.start();
            System.out.println("Receiving messages...");
            Session session = connection.createSession(false, Session.CLIENT_ACKNOWLEDGE);
            Destination replyQueue = session.createQueue("ackqueue");
            //MessageConsumer consumer = session.createConsumer(replyQueue);
            TextMessage message = session.createTextMessage();
            Queue recieve = session.createQueue("requestor");

            QueueBrowser browser = session.createBrowser(recieve);

            Enumeration msgs = browser.getEnumeration();


            if (!msgs.hasMoreElements()) {
                System.out.println("No messages in queue");
            } else {

                while (msgs.hasMoreElements()) {
                    Message tempMsg = (Message) msgs.nextElement();

                    System.out.println("Message: " + tempMsg.getJMSCorrelationID());
                    if(tempMsg.getJMSCorrelationID().equalsIgnoreCase("helloworld"))
                    {

                        System.out.println("matched and acked");
                        break;
                    }
                }
            }


        }

        public static void main(String args[]) throws JMSException {

            Receive receiver = new Receive();

            receiver.receivemsg();

            System.out.println("Received Messages");
        }
    }

我查看了ApacheQPID的文档,没有任何方法或选项支持AMQP客户端中的消费者是非破坏性的。Qpid的唯一方法是为Qpid代理服务器端的选项强制设置
true
,但它不适合您当前的场景
Azure服务总线队列

在Azure服务总线队列上,有一个RESTAPI可以满足您的需要。因此,您可以参考服务总线队列的官方教程中的一节,以便在下面的代码中进行设置

ReceiveMessageOptions opts = ReceiveMessageOptions.DEFAULT;
opts.setReceiveMode(ReceiveMode.PEEK_LOCK);

希望能有所帮助。

Peter如果没有它,我们不应该使用azure java sdk。我们应该能够实现这一点。我对队列浏览器从队列中删除消息感到惊讶。JMS队列浏览器用于浏览队列中的消息而不是删除消息的特定目的。声明符合JMS的消息传递提供程序库必须实现这一点。我想这是Azure JMS实现的一个问题。