Transactions 如何使cusor在事务回滚后向前移动?

Transactions 如何使cusor在事务回滚后向前移动?,transactions,jms,activemq,Transactions,Jms,Activemq,我想从基于ActiveMQ的队列中获取消息,如果消息不是预期的,我想回滚事务以保留消息 但问题是,一旦我回滚该事务,并尝试再次从队列中获取下一条消息,我总是获取第一条消息(即我回滚的消息) 所以我的问题是:当我执行回滚时,如何使消息的焦点向前移动 代码如下所示 public void removeMessageFromQuenu(String queueName) throws JMSException { String user = this.conf.getProperty("act

我想从基于ActiveMQ的队列中获取消息,如果消息不是预期的,我想回滚事务以保留消息

但问题是,一旦我回滚该事务,并尝试再次从队列中获取下一条消息,我总是获取第一条消息(即我回滚的消息)

所以我的问题是:当我执行回滚时,如何使消息的焦点向前移动

代码如下所示

public void removeMessageFromQuenu(String queueName) throws JMSException {
    String user = this.conf.getProperty("activemq.user");
    String passwd = this.conf.getProperty("activemq.pwd");
    String url = this.conf.getProperty("activemq.url");

    try {

        mq = new ActiveMQFactory(user, passwd, url);
        conn = mq.getConn();
        mq.setTrans(true);
        mq.setAckMode("AUTO_ACKNOWLEDGE");


        ses = mq.getSec();
        destination = ses.createQueue(queueName);

        MessageConsumer consumer = ses.createConsumer(destination);
        System.out
                .println("++++++++++++++++ Summary Info For Message Queue ++++++++++++++++");
        while (true) {
            TextMessage message = (TextMessage) consumer.receive(1000);
            if (null != message) {
                String branch;
                String build_bit;
                String build_type;
                String build_num;
                String cn_url;
                String kr_url;
                branch = message.getStringProperty("BUILD_SVN_BRANCH");
                build_bit = message.getStringProperty("BUILD_BIT");
                build_type = message.getStringProperty("BUILD_TYPE");
                build_num = message.getStringProperty("BUILD_ID");
                cn_url = message.getStringProperty("BUILD_URLS");
                kr_url = message.getStringProperty("BUILD_URLS_KR");
                String key = branch + "_" + build_bit + "bit_" + build_type;

                if (maxVersionList.containsKey(key)
                        && build_num.equals(maxVersionList.get(key))) {
                    System.out.println("Max version of " + key + ":");
                    System.out.println("ID: " + build_num);
                    System.out.println(cn_url);
                    System.out.println(kr_url);
                    System.out
                            .println("------------------------------------------------------ ");
                    ses.rollback();
                } else {
                    ses.commit();
                }

            } else {
                break;
            }
        }

    } catch (Exception e) {
        e.printStackTrace();
    } finally {
        if (ses != null){
            ses.rollback();
            ses.close();}
        if (conn != null)
            conn.close();
        System.out
        .println("==============================================================================================");
        // System.out.println("Remove Done!");
    }

}    

我认为,如果不做一些疯狂的事情,比如使用a遍历队列中消息的枚举,就无法完成您特别要求的操作。QueueBrowser不会从队列中提取消息,我们可能不想开始讨论如何处理竞争条件

ActiveMQ在其应用程序中确实可以选择延迟重新交付等操作。如果可能的话,我会尽量走那条路