Ciao,我的基本要求是有一个我可以发送消息的路由,这是放在JMS队列上的。驼峰上下文在JavaEE 6容器中运行,即JBoss AS 7.1.1,所以它随JMS的HornetQ一起发布;我通过bootstrap单例启动上下文,但我没有使用camel-cdi。到目前为止,我一直在使用camel-jms
组件,但现在我希望尽可能迁移到camel-sjms
因为无弹性。
我的问题是:在这个JavaEE场景中,为camel-sjms
配置ConnectionFactory的正确的方式是什么?
使用camel-jms,我可以将其放在端点URL中,就像.to("jms:myQueue?connectionFactory=#ConnectionFactory")
一样简单。使用camel-sjms而不是在我看来,我需要自己创建一个SJMSComponent实例,设置connectionFactory,并在启动它之前在驼峰上下文中设置此实例。
我有以下代码用于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")
<小时/> 对于
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,它作为对SjmsComponent实例的引用传递,该实例传递给camelContext。然后在MyCamelRoutes
我可以使用sjms,同时使用:
.to("sjms:myQueue")
<小时/> 代码似乎在两种情况下都能正常工作,但据我所知,如果没有正确完成,ConnectionFactory的配置很容易出现性能问题,因此我更愿意问我是否正确迁移到
camel-sjms
我的JavaEE场景。再次感谢
答案 0 :(得分:0)
如果您没有对JMS资源进行缓存/池化,则可能会出现性能问题。缓存通常通过将ConnectionFactory包装在某个Caching ConnectionFactory库中来配置 - 或者通过将控件移交给应用程序服务器来配置。
Camel SJMS包含内置池。但是,如果您有一个容器管理资源来处理JMS连接,您应该考虑使用它。 SJMS有一些处理这个问题的工具,ConncetionResource instead of ConnectionFactory。