gpt4 book ai didi

jms - 为 Camel JMS 生产者设置 ConnectionFactory : camel-jms Vs camel-sjms

转载 作者:行者123 更新时间:2023-12-01 19:36:21 27 4
gpt4 key购买 nike

再见,我的基本要求是有一个可以发送消息的路由,并将其放在 JMS 队列中。 camel 上下文在 JavaEE 6 容器中运行,即 JBoss AS 7.1.1,因此它是 HornetQ for 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-jms 与 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,现在我必须修改 bootstrap 单例:

@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();
}
}

请注意connectionFactory 的@Resource 这是作为对SjmsComponent 实例的引用传递的,该实例传递给camelContext。然后在 MyCamelRoutes 中,我可以在使用 sjms 进行路由配置时使用:

.to("sjms:myQueue")


代码似乎在这两种情况下都能正常工作,但据我所知,如果配置不正确,ConnectionFactory 的配置很容易受到性能问题的影响,因此我更愿意问我是否迁移到了 camel-sjms正确适用于我的 JavaEE 场景。再次感谢

最佳答案

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

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

关于jms - 为 Camel JMS 生产者设置 ConnectionFactory : camel-jms Vs camel-sjms,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25217846/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com