为Camel-JMS生产者设置ConnectionFactory:Camel-JMS与Camel-sjms
再见,我的基本要求是要有一个路由,在那里我可以发送一条消息,这是放在一个JMS队列上的。camel上下文在JavaEE6容器中运行,即JBossAS 7.1.1,因此它附带了HornetQ for JMS;我通过引导单例启动上下文,但我不使用camelcdi。到目前为止,我一直在使用为Camel-JMS生产者设置ConnectionFactory:Camel-JMS与Camel-sjms,jms,apache-camel,Jms,Apache Camel,再见,我的基本要求是要有一个路由,在那里我可以发送一条消息,这是放在一个JMS队列上的。camel上下文在JavaEE6容器中运行,即JBossAS 7.1.1,因此它附带了HornetQ for JMS;我通过引导单例启动上下文,但我不使用camelcdi。到目前为止,我一直在使用camel-jms组件,但现在我希望尽可能迁移到camel-sjms,因为springless 我的问题是:在这个JavaEE场景中,为camel sjms配置ConnectionFactory的正确方法是什么 使用
camel-jms
组件,但现在我希望尽可能迁移到camel-sjms
,因为springless
我的问题是:在这个JavaEE场景中,为camel sjms
配置ConnectionFactory的正确方法是什么
使用驼峰jms,我可以将其放入端点URL中,非常简单,如.to(“jms:myQueue?connectionFactory=#connectionFactory”)
。相反,对于camel-sjms,在我看来,我需要自己创建一个SJMSComponent实例,设置connectionFactory,并在启动它之前在camel上下文中设置这个实例
下面是camel jms Vs camel sjms案例的代码,我想知道我是否正确地“迁移”了ConnectionFactory的设置。谢谢
对于
camel jms
,这是通过以下方式完成的:
@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")
.to("sjms:myQueue")
对于
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
对于connectionFactory,这是作为对SJMComponent实例的引用传递的,SJMComponent实例被传递到上下文。然后在MyCamelRoutes
中,我可以使用sjms进行路由配置,使用:
.to("jms:myQueue?connectionFactory=#ConnectionFactory")
.to("sjms:myQueue")
代码似乎在这两种情况下都正常工作,但据我所知,如果没有正确执行,ConnectionFactory的配置很容易出现性能问题,因此我更愿意询问我是否正确迁移到JavaEE情况下的
camel sjms
。再次感谢如果不缓存/池化JMS资源,性能问题很可能会发生。缓存通常是通过在某些缓存ConnectionFactory库中包装ConnectionFactory来配置的,或者通过将控件移交给应用程序服务器来配置的
Camel SJMS包括内置池。但是,如果您有一个容器管理的资源来处理JMS连接,那么您应该考虑使用它。SJMS有一些设施来处理这一问题。感谢您的反馈,这也是我从SJMS文档中了解到的,我所面临的困难是将其固定到我的实际场景中-开箱即用JBoss AS 7.1.1,HornetQ符合标准的standalone-full.xml。因此,我想知道是否足以更改
@Resource
并将其指向java:/JmsXA
,或者我是否必须用编写自己的ConnectionResource来包装它。我倾向于前两种选择,但听起来太简单了:)