Java 如何在activemq中使用springframe工作在ApacheCamel中实现回滚

Java 如何在activemq中使用springframe工作在ApacheCamel中实现回滚,java,activemq,apache-camel,Java,Activemq,Apache Camel,我将apachecamel与activemq一起使用。我已经配置了运行exe文件的消费者。此exe文件将运行应用程序 我希望消息一直在队列中,直到此过程发生。因此,如果我的exe崩溃/orexe被重命名等,我希望消息在队列中。类似地说,如果exe工作正常,它调用了应用程序,并且应用程序发生了一些事情,那么我需要将消息保留在队列中。如果这两个进程成功执行,则我的消息可以退出队列 我使用简单的java代码编写了这个逻辑,使用会话和重新交付策略。但是我想用spring框架重写(camel是用这个框架集

我将apachecamel与activemq一起使用。我已经配置了运行exe文件的消费者。此exe文件将运行应用程序

我希望消息一直在队列中,直到此过程发生。因此,如果我的exe崩溃/orexe被重命名等,我希望消息在队列中。类似地说,如果exe工作正常,它调用了应用程序,并且应用程序发生了一些事情,那么我需要将消息保留在队列中。如果这两个进程成功执行,则我的消息可以退出队列

我使用简单的java代码编写了这个逻辑,使用会话和重新交付策略。但是我想用spring框架重写(camel是用这个框架集成的),我不知道该怎么做。PS我不是在寻找错误,比如消息没有传递到exe,而是在上面解释的可能情况下如何保留消息

activemqcamel.xml配置如下所示。我之所以发布这篇文章,是因为config没有连接工厂等,所以apachecamel应该以某种方式创建会话

<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"/>

阅读以下有关交易的文档:

我已经阅读了此文档。我认为这更多的是处理事务性错误。from(activeMqURI).to(“bean:activemqProcessor?method=processMessage”);此事务正在正常进行,但在processmessage中我正在调用一个exe。如果这个exe由于某种原因没有执行,那么我希望我的消息被回滚。如果我错了,请纠正我understanding@ClausIbsen在旧代码中,我们使用了
会话
。在应用程序完成之前,此会话不会结束。我们在最后使用了
session.commit()
,所以一旦应用程序完成,它的执行消息将从挂起列表传递到出列列表。如果在运行应用程序时发生任何错误,我们将执行会话。回滚(),以便消息仍在挂起列表中,供使用者再次使用和处理。@ClausIbsen在我们的新代码(camel与activemq的集成)中,我们不使用会话,因为camel本身会处理此问题。我们不知道在执行.exe/应用程序时发生错误时如何回滚消息。
package PackageName;
import java.io.File;
import java.io.IOException;
import javax.jms.*;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.activemq.ActiveMQConnectionFactory;
import org.apache.activemq.RedeliveryPolicy;
 public class FirstConsumer extends HttpServlet {
@Override
protected void service(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException{
try {
//creating connectionfactory object for way
ActiveMQConnectionFactory connectionFactory=new ActiveMQConnectionFactory("admin","admin","tcp://localhost:61617?jms.prefetchPolicy.queuePrefetch=1");
//creating object for RedeliveryPolicy clas
RedeliveryPolicy policy = new RedeliveryPolicy();
policy.setInitialRedeliveryDelay(1000L);
policy.setMaximumRedeliveries(RedeliveryPolicy.NO_MAXIMUM_REDELIVERIES);
connectionFactory.setRedeliveryPolicy(policy);
connectionFactory.setUseRetroactiveConsumer(true);
//establishing the connection b/w this Application and Activemq
Connection connection=connectionFactory.createConnection();
//connection.setClientID("Testing");
final Session session=connection.createSession(true, Session.CLIENT_ACKNOWLEDGE);
Queue queue=session.createQueue("ThermalMap");
javax.jms.MessageConsumer consumer=session.createConsumer(queue);
//Creating FunctionNames class object for calling integration method.
final FunctionNames functionNamesObject=new FunctionNames();
//Listening queues from Activemq
MessageListener listener = new MessageListener() {
    @Override
    public void onMessage(Message msg) {
        //getting message, and converting message object to Textmessage object
        TextMessage msg1=(TextMessage)msg;
        try {
            functionNamesObject.Integration(
                                            ".txt",
                                            getServletContext().getRealPath("/Copy"),
                                            getServletContext().getRealPath("/Rod1"),
                                            "ThMapInfratab1-2.exe",
                                            "TMapInput.txt"
            );
            //Triggering MMA Application
            //functionNamesObject.executeHttp("http://localhost:8080/SlicerApp/index.jsp");
            session.commit();
        }
        catch (IOException e) {
            try {
                session.rollback();
            } catch (JMSException e1) {
                // TODO Auto-generated catch block
                e1.printStackTrace();
            }
        }
        catch (InterruptedException e) {
            try {
                session.rollback();
            } catch (JMSException e1) {
                // TODO Auto-generated catch block
                e1.printStackTrace();
            }
        } catch (JMSException e) {
            try {
                session.rollback();
            } catch (JMSException e1) {
                // TODO Auto-generated catch block
                e1.printStackTrace();
            }
        }       
    }
};
consumer.setMessageListener(listener);
connection.start();    
//session.rollback();
}
catch (Exception e) {
e.printStackTrace();
}
   }
}