为Camel JMS Producer设置ConnectionFactory:camel-jms和camel-sjms

时间:2014-08-09 11:01:25

标签: jms apache-camel

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场景。再次感谢

1 个答案:

答案 0 :(得分:0)

如果您没有对JMS资源进行缓存/池化,则可能会出现性能问题。缓存通常通过将ConnectionFactory包装在某个Caching ConnectionFactory库中来配置 - 或者通过将控件移交给应用程序服务器来配置。

Camel SJMS包含内置池。但是,如果您有一个容器管理资源来处理JMS连接,您应该考虑使用它。 SJMS有一些处理这个问题的工具,ConncetionResource instead of ConnectionFactory