使用ActiveMQ服务器的Spring JMS:无法使Lister的onMessage成为跨国的
通过下面的课程,我从活动mq服务器获得消息:-使用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;
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
}