JMS事务管理器不在camel客户端代码中工作

时间:2014-08-20 11:44:50

标签: spring apache-camel jms-topic

我有简单的代码,使用TCP连接到代理URL。当我设置事务管理器时,我的代码毫无例外地完成,并且没有消息被消耗,但是当我没有设置牵引管理器时,它工作正常。

以下是代码,我没有得到缺少的内容,或者是否需要在代理主机上进行任何配置。

    import org.apache.activemq.ActiveMQConnectionFactory;
import org.apache.camel.CamelContext;
import org.apache.camel.ConsumerTemplate;
import org.apache.camel.builder.RouteBuilder;
import org.apache.camel.component.jms.JmsComponent;
import org.apache.camel.component.jms.JmsConfiguration;
import org.apache.camel.impl.DefaultCamelContext;
import org.springframework.jms.connection.JmsTransactionManager;


public class JmsCamelComponent {
    public void getMessage() {
        CamelContext context = new DefaultCamelContext();
        ActiveMQConnectionFactory jmsConnectionFactory = new ActiveMQConnectionFactory(
                "tcp://10.10.3.140:61616?jms.redeliveryPolicy.maximumRedeliveries=10");
        JmsTransactionManager jmsTransactionManager = new JmsTransactionManager(jmsConnectionFactory);
        JmsConfiguration config = new JmsConfiguration(jmsConnectionFactory);
        config.setConnectionFactory(jmsConnectionFactory);
        JmsComponent jms = new JmsComponent(config);
        jms.setTransactionManager(jmsTransactionManager);
        jms.setTransactionTimeout(1000000);
        try {
            System.out.println("Creating and adding route...");
            context.addComponent("jms", jms);
            context.addRoutes(new RouteBuilder() {
                public void configure() {
                    System.out.println("Inside configure...");
                    from("jms:topic:prathamq?clientId=411&durableSubscriptionName=parag").to("file://test2");
                    System.out.println("after getting message");
                }
            });
            ConsumerTemplate template = context.createConsumerTemplate();
            context.start();
            System.out.println("Context started...");
            Thread.sleep(1000);
            System.out.println(" " + template.toString());
        } catch (Exception e) {
            // TODO Auto-generated catch block
            System.out.println("In catch block");
            e.printStackTrace();
        }
    }

    public static void main(String[] args) {
        (new JmsCamelComponent()).getMessage();
    }
}

以下行我设置或取消设置" jms.setTransactionManager(jmsTransactionManager);" 请帮忙。 谢谢你, Sohan

1 个答案:

答案 0 :(得分:0)

我重新制作了这个问题(经过一些错误的启动后)并得到了一个有效的版本:

public void getMessage() throws Exception {
    ActiveMQConnectionFactory jmsConnectionFactory = new ActiveMQConnectionFactory("tcp://localhost:61616");
    JmsTransactionManager jmsTransactionManager = new JmsTransactionManager(jmsConnectionFactory);

    SimpleRegistry registry = new SimpleRegistry();
    registry.put("transactionManager", jmsTransactionManager);

    JmsConfiguration config = new JmsConfiguration(jmsConnectionFactory);
    config.setConnectionFactory(jmsConnectionFactory);

    CamelContext context = new DefaultCamelContext(registry);

    JmsComponent jms = new JmsComponent();
    jms.setTransactionManager(jmsTransactionManager);

    context.getRegistry();
    context.addComponent("jms", jms);

    context.addRoutes(new RouteBuilder() {
        public void configure() {
            from("activemq:topic:matt?clientId=411&durableSubscriptionName=matt")
            .log("GOT A MESSAGE");
        }
    });
    context.start();
    System.out.println("Context started...");
    Thread.sleep(10000000);
}

除了增加线程休眠时间以确保应用程序在其有机会做任何事情之前不退出,根本原因是注册表中缺少平台事务管理器。您需要创建/获取注册表并向其添加事务管理器。

如果您正在使用Spring,则可以使用Spring上下文。在这个例子中,我只是创建一个SimpleRegistry来使代码工作。

如果您使用失败的代码并在路由中添加显式的.transacted(),您可以看到它抱怨没有找到平台事务管理器。为什么没有明确的.transacted()调用就不会抱怨我不知道,但这似乎是潜在的问题。