-1

我有简单的代码,它使用 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

4

1 回答 1

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() 调用它不会抱怨我不知道,但这似乎是根本问题。

于 2014-08-21T20:34:48.400 回答