为Camel JMS生产者设置ConnectionFactory:camel-jms与camel-sjms比较

3
你好,我的基本要求是创建一个路由(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 中,就像 .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场景。再次感谢。

1个回答

0

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

Camel SJMS包括内置的池化功能。但是,如果您有一个容器管理的资源来处理JMS连接,则应该考虑使用它。SJMS具有一些处理此类情况的工具,使用ConnectionResource而不是ConnectionFactory


感谢您的反馈,这也是我从SJMS文档中了解到的。我面临的挑战是将其落实到我的实际场景中——使用标准的standalone-full.xml和HornetQ作为JBoss AS 7.1.1的默认设置。因此,我想知道是否足够改变@Resource并使其指向java:/JmsXA,或者我必须一定要编写自己的ConnectionResource来进行包装。我倾向于前者,但听起来太简单了 :) - tarilabs

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接