你好,我的基本要求是创建一个路由(route),使得我能够将消息发送到 JMS 队列中。Camel 上下文运行在 JavaEE 6 容器中,即 JBoss AS 7.1.1,所以它使用的是随之提供的 HornetQ 作为 JMS;我通过引导(bootstrap)单例启动上下文,但我不使用 camel-cdi。迄今为止,我一直在使用 camel-jms 组件,但现在如果可能的话,我想迁移到 camel-sjms,因为它不需要 spring。
我的问题是:在这种 JavaEE 场景下,配置 camel-sjms 的 ConnectionFactory 的正确方法是什么?
对于 camel-jms,我可以把这个配置放在端点 URL 中,就像
我有以下代码,针对 camel-jms 和 camel-sjms 进行了比较,我想知道是否已经正确地迁移了 ConnectionFactory 的设置。谢谢。
对于
这段代码在两种情况下似乎都能正常工作,但是据我所知,如果连接工厂的配置不正确,性能问题会比较严重。因此,我更倾向于询问是否已正确地迁移到了
我的问题是:在这种 JavaEE 场景下,配置 camel-sjms 的 ConnectionFactory 的正确方法是什么?
对于 camel-jms,我可以把这个配置放在端点 URL 中,就像
.to("jms:myQueue?connectionFactory=#ConnectionFactory")
这样简单。但是对于 camel-sjms,似乎我需要自己创建 SJMSComponent 的实例、设置 connectionFactory,并在启动 camel 上下文之前将此实例设置到 camel 上下文中。我有以下代码,针对 camel-jms 和 camel-sjms 进行了比较,我想知道是否已经正确地迁移了 ConnectionFactory 的设置。谢谢。
@Singleton
@Startup
public class CamelBootstrap {
private CamelContext camelContext;
private ProducerTemplate producerTemplate;
public CamelContext getCamelContext() {
return camelContext;
}
public ProducerTemplate getProducerTemplate() {
return producerTemplate;
}
@PostConstruct
public void init() throws Exception {
camelContext = new DefaultCamelContext();
camelContext.addRoutes(new MyCamelRoutes());
camelContext.start();
producerTemplate = camelContext.createProducerTemplate();
}
}
没什么特别的,我可以在MyCamelRoutes
中使用路由配置:
.to("jms:myQueue?connectionFactory=#ConnectionFactory")
对于
camel-sjms
,现在我需要使用以下内容修改引导单例:
@Singleton
@Startup
public class CamelBootstrap {
@Resource(mappedName="java:/ConnectionFactory")
private ConnectionFactory connectionFactory;
private CamelContext camelContext;
private ProducerTemplate producerTemplate;
public CamelContext getCamelContext() {
return camelContext;
}
public ProducerTemplate getProducerTemplate() {
return producerTemplate;
}
@PostConstruct
public void init() throws Exception {
camelContext = new DefaultCamelContext();
SjmsComponent sjms = new SjmsComponent();
sjms.setConnectionFactory(connectionFactory);
camelContext.addComponent("sjms", sjms);
camelContext.addRoutes(new MyCamelRoutes());
camelContext.start();
producerTemplate = camelContext.createProducerTemplate();
}
}
请注意,对于连接工厂,需要使用@Resource
注解。这将作为一个引用传递给SjmsComponent实例,然后再传递给camelContext。然后,在MyCamelRoutes
中,我可以使用sjms进行路由配置:
.to("sjms:myQueue")
这段代码在两种情况下似乎都能正常工作,但是据我所知,如果连接工厂的配置不正确,性能问题会比较严重。因此,我更倾向于询问是否已正确地迁移到了
camel-sjms
,以适应我的JavaEE场景。再次感谢。
@Resource
并使其指向java:/JmsXA
,或者我必须一定要编写自己的ConnectionResource来进行包装。我倾向于前者,但听起来太简单了 :) - tarilabs