【问题标题】:Set ConnectionFactory for Camel JMS Producer: camel-jms Vs camel-sjms为 Camel JMS Producer 设置 ConnectionFactory:camel-jms 与 camel-sjms
【发布时间】:2014-10-02 18:43:42
【问题描述】:

Ciao,我的基本要求是有一条可以发送消息的路由,并将其放在 JMS 队列中。 Camel 上下文在 JavaEE 6 容器中运行,即 JBoss AS 7.1.1,所以它是 HornetQ for JMS 附带的;我通过引导单例启动上下文,但我不使用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 的配置很容易出现性能问题,因此我更愿意询问我是否为我的 JavaEE 场景正确迁移到 camel-sjms。再次感谢

【问题讨论】:

    标签: jms apache-camel


    【解决方案1】:

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

    Camel SJMS 包括内置池。但是,如果您有一个容器管理的资源来处理 JMS 连接,您可能应该考虑使用它。 SJMS 有一些设施可以解决这个问题,ConncetionResource instead of ConnectionFactory

    【讨论】:

    • 感谢您的反馈,这确实也是我对 SJMS 文档的理解,我面临的困难是将它归结为我的实际场景 - 开箱即用的 JBoss AS 7.1.1 with HornetQ根据标准提供的standalone-full.xml。所以,我想知道是否足以更改@Resource 并使其指向java:/JmsXA,或者我是否必须 以某种方式必须通过编写自己的ConnectionResource 来包装它。我会反对前一种选择,但听起来太容易了:)
    猜你喜欢
    • 2023-03-16
    • 2013-01-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-27
    • 2022-01-13
    • 2023-03-05
    相关资源
    最近更新 更多