为Camel-JMS生产者设置ConnectionFactory:Camel-JMS与Camel-sjms

为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的正确方法是什么 使用

再见,我的基本要求是要有一个路由,在那里我可以发送一条消息,这是放在一个JMS队列上的。camel上下文在JavaEE6容器中运行,即JBossAS 7.1.1,因此它附带了HornetQ for JMS;我通过引导单例启动上下文,但我不使用camelcdi。到目前为止,我一直在使用
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来包装它。我倾向于前两种选择,但听起来太简单了:)