使用ActiveMQ服务器的Spring JMS:无法使Lister的onMessage成为跨国的

使用ActiveMQ服务器的Spring JMS:无法使Lister的onMessage成为跨国的,jms,activemq,spring-transactions,Jms,Activemq,Spring Transactions,通过下面的课程,我从活动mq服务器获得消息:- package com.orange.obsit.sando.cibinternational.consumerqueue.impl; import javax.jms.JMSException; import javax.jms.ObjectMessage; import javax.jms.Session; import org.springframework.stereotype.Component;

通过下面的课程,我从活动mq服务器获得消息:-

 package com.orange.obsit.sando.cibinternational.consumerqueue.impl;

    import javax.jms.JMSException;
    import javax.jms.ObjectMessage;
    import javax.jms.Session;

    import org.springframework.stereotype.Component;

    import com.orange.obsit.sando.cibinternational.consumerqueue.ICibPublicationConsumer;
    import com.orange.obsit.sando.cibinternational.model.ProductEvent;

    @Component
    public class CibPublicationConsumerImpl implements ICibPublicationConsumer {

        private static int count = 0;


        @Override
        public void onMessage(ObjectMessage message, Session session) throws JMSException {
            if (message instanceof ObjectMessage) {

                ProductEvent event = (ProductEvent) message.getObject();

                System.out.println("EventId:" + event.getEventId());

                count++;

                if (count % 2 == 0) {

                    throw new IllegalStateException("Message type not supported");
                }


            } else {
                throw new IllegalStateException("Message type not supported");

            }

        }
    }
这是spring的applicationContext.xml文件,我用来配置JMS模板和JMS容器。

    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
        xmlns:p="http://www.springframework.org/schema/p" xmlns:context="http://www.springframework.org/schema/context"
        xmlns:tx="http://www.springframework.org/schema/tx" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xmlns:aop="http://www.springframework.org/schema/aop" xmlns:jdbc="http://www.springframework.org/schema/jdbc"
        xmlns:jpa="http://www.springframework.org/schema/data/jpa"
        xsi:schemaLocation="
                http://www.springframework.org/schema/beans
                http://www.springframework.org/schema/beans/spring-beans-4.1.xsd
                http://www.springframework.org/schema/aop
                http://www.springframework.org/schema/aop/spring-aop-4.1.xsd
                http://www.springframework.org/schema/tx
                http://www.springframework.org/schema/tx/spring-tx-4.1.xsd
                http://www.springframework.org/schema/jdbc
                http://www.springframework.org/schema/jdbc/spring-jdbc-4.1.xsd
                http://www.springframework.org/schema/context
                http://www.springframework.org/schema/context/spring-context-4.1.xsd
                http://www.springframework.org/schema/data/jpa 
                http://www.springframework.org/schema/data/jpa/spring-jpa.xsd">

        <bean id="connectionFactory" class="org.apache.activemq.ActiveMQConnectionFactory">
            <property name="brokerURL" value="tcp://localhost:61616" />
            <property name="trustAllPackages" value="true" />
        </bean>

        <bean id="jmsTemplate" class="org.springframework.jms.core.JmsTemplate">
            <constructor-arg name="connectionFactory" ref="connectionFactory"></constructor-arg>
            <property name="defaultDestinationName" value="myqueue"></property>
        </bean>

        <bean id="messageListener"
        class="com.orange.obsit.sando.cibinternational.consumerqueue.impl.CibPublicationConsumerImpl" />
        <bean id="jmsContainer"
            class="org.springframework.jms.listener.DefaultMessageListenerContainer">
            <property name="connectionFactory" ref="connectionFactory" />
            <property name="destinationName" value="myqueue" />
            <property name="messageListener" ref="messageListener" />
        </bean>

        <context:component-scan
            base-package="com.orange.obsit.sando.cibinternational.consumerqueue.impl"></context:component-scan>

    </beans>
我希望我的侦听器在抛出任何异常时保持消息。 这意味着,在侦听器读取队列之后,在进一步的流中会出现任何错误,而不是回滚事务,并且我的数据会保留在队列中

有人能帮我吗


多谢各位

我不确定界面
ICibPublicationConsumer
中的代码是什么。通常,要使消息侦听器具有事务性,您需要实现。本例中的onMessage方法为您提供会话对象的句柄。然后,您需要执行session.commit(){如果业务逻辑执行正确}或session.rollback(){如果出现错误;通常在catch块中完成}谢谢您的帮助。我已回滚会话,并且我还需要将SessionTransact属性设置为true,以使其具有跨国性,现在它对我来说工作正常。我不确定界面
ICibPublicationConsumer
中的代码是什么。通常,要使消息侦听器具有事务性,您需要实现。本例中的onMessage方法为您提供会话对象的句柄。然后,您需要执行session.commit(){如果业务逻辑执行正确}或session.rollback(){如果出现错误;通常在catch块中完成}谢谢您的帮助。我已经回滚了会话,我还需要将SessionTransact属性设置为true,以使其具有跨国性,现在它对我来说运行良好。
    import org.apache.xbean.spring.context.ClassPathXmlApplicationContext;
    import org.springframework.context.ApplicationContext;
    import org.springframework.context.support.AbstractApplicationContext;

    public class CibPublicationConsumerImplTest {

        public static void main(String[] args) {

            ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");

            try {
                // thread to sleep for 1000 milliseconds
                Thread.sleep(1000);
            } catch (Exception e) {
                System.out.println(e);
            }

            ((AbstractApplicationContext) ctx).close();

        }
        enter code here

    }