gpt4 book ai didi

java - 使用 spring 框架在 apache camel 中回滚消息

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:16:48 26 4
gpt4 key购买 nike

我的应用程序的工作流程: 我已经设置了 activemq 并编写了 spring 框架来监听 activemq 的队列。每当队列中有消息时,监听器都会收到消息,然后将消息出列并执行我的业务逻辑。

现在在测试用例中,如果我的业务逻辑中有任何运行时错误,消息应该回滚到队列中。这样消费者就可以再次消费消息并再次执行我的业务逻辑。

如何使用 spring-camel 实现这一点?

我为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 block 。在 catch block 中,我应该编写代码来回滚消息。那里应该有什么代码来回滚消息?

最佳答案

如果您在路由中使用 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 章。

关于java - 使用 spring 框架在 apache camel 中回滚消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18873430/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com