我的应用程序的工作流程:我已经设置了activemq并编写了spring框架来监听activemq的队列。只要队列中有消息,侦听器就会收到消息,然后将消息出列并执行业务逻辑。
现在处于测试用例中,如果我的业务逻辑中存在任何运行时错误,则该消息应该回滚到队列中。这样消费者可以再次使用消息并再次执行我的业务逻辑。
我怎样才能用春骆驼来实现这个目标?
我为ActiveMqConsumer编写的代码
public class ActiveMqConsumer {
public static void main(String[] args){
try {
PropertyConfigurator.configure("C:/Users/awsdemo/src/main/resources/log4j.properties");
ApplicationContext springcontext = new FileSystemXmlApplicationContext("C:/Users/awsdemo/src/main/resources/activecamel.xml");
CamelContext context = springcontext.getBean("activeContext", CamelContext.class);
//context.addComponent("activemq", activeMQComponent("tcp://localhost:61616?broker.persistent=false"));
context.start();
//Thread.sleep(1000);
//context.stop();
} catch ( Exception e ) {
System.out.println(e);
}
}
}
ActiveMQRouterBuilder的代码
public class ActiveMQRouterBuilder extends RouteBuilder {
@Override
public void configure() throws Exception {
String activeMqURI = "activemq:queue:ThermalMap";
System.out.print(activeMqURI);
from( activeMqURI).to("bean:activemqProcessor?method=processMessage");
}
}
ActiveMQProcessor的代码
public class ActiveMQProcessor{
public void processMessage(Exchange exchange) throws Exception{
System.out.println("\ninside processMessage :Consumer1");
//System.out.println(exchange.getIn().getBody());
Object object = exchange.getIn().getBody();
FunctionNames functionNamesObject=new FunctionNames();
//Call Intergration function to execute .exe file
try {
/* my business logic*/
} catch (IOException e) {
/* message should rollback here to activemq*/
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InterruptedException e) {
/* or message should rollback here to activemq*/
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("ActiveMQProcessor: finished");
}
}
以上三个文件结合起来作为消费者。这三个文件在activecamel.xml
文件中配置。 activecamel.xml
包含以下代码
<camelContext id="activeContext" xmlns="http://camel.apache.org/schema/spring">
<routeBuilder ref="activeMQRouter" />
</camelContext>
<bean id="activemq" class="org.apache.activemq.camel.component.ActiveMQComponent">
<property name="brokerURL" value="tcp://localhost:61616?jms.prefetchPolicy.queuePrefetch=1" />
</bean>
<bean id="activeMQRouter" class="main.java.com.aranin.activemq.ActiveMQRouterBuilder"/>
<bean id="activemqProcessor" class="main.java.com.aranin.activemq.ActiveMQProcessor"/>
在ActiveMQProcessor中我写了我的业务逻辑,如果有任何错误,它会抛出错误来捕获块。在catch块中,我应该编写代码来回滚消息。应该回滚消息的代码是什么?
答案 0 :(得分:4)
如果你在路由中使用transacted(),那么你应该从ActiveMQProcessor中抛出异常,Camel会自动回滚TX。
from( activeMqURI)
.transacted()
.to("bean:activemqProcessor?method=processMessage");
您还需要将ActiveMQ配置为事务处理
<bean id="activemq" class="org.apache.activemq.camel.component.ActiveMQComponent">
<property name="brokerURL" value="tcp://localhost:61616?jms.prefetchPolicy.queuePrefetch=1" />
<property name="transacted" value="true"/>
</bean>
并设置JMS事务管理器。有关详细信息,请参阅:http://camel.apache.org/transactional-client.html
虽然是后者,但是如果你有transacted = true,Camel应该默认设置一个。但最好在xml文件中定义事务管理器,并参考activemq配置中的事务管理器。上述链接的所有详细信息。
如果你有一本Camel in Action书的副本,那么请阅读第9章。