【问题标题】:concurrency in a single Processor instance and concurrentConsumers单个处理器实例和 concurrentConsumers 中的并发
【发布时间】:2023-04-03 09:30:01
【问题描述】:

如果我有这样的代码:

Processor myProcessor = new MyProcessor();
CamelContext cContext = new DefaultCamelContext();
cContext.addComponent("jms", new MyJmsComponent());
cContext.addRoutes(new RouteBuilder() {
    @Override
    public void configure() throws Exception {
            from("jms://my-jms-endpoint?concurrentConsumers=5").process(myProcessor);
        }
    });

这段代码是并发的吗?我假设消息被竞争消费者同时消费,但在 myProcessor 实例中会发生什么?它是由骆驼自动克隆的吗?或者 myProcessor 是否假定为线程安全的,并且消息由单个实例同时处理?还是在这个 sn-p 中消息同步以按顺序访问 myProcessor?如果是后者,如何实现并发?

【问题讨论】:

  • 如果骆驼路由同时消费多条消息,处理器被认为是线程安全的。如果您觉得这会对性能影响太大,也许您可​​以创建一个处理器池
  • 谢谢安东尼。如果处理器被假定为线程安全的,那么创建处理器池将如何提高性能?
  • 线程安全类通常嵌入一些锁定机制。在某些情况下,使用工人池会有所帮助。并非所有工作人员都可以从池中受益(甚至工作),这完全取决于处理器的作用以及需要线程安全的事情是什么
  • 好的,所以我知道潜在的性能影响只会来自处理器的某些特定实现。请发表您的评论作为答案,我会接受。
  • 没问题 ;) 很高兴它有帮助

标签: java apache-camel


【解决方案1】:

如果骆驼路由同时消费多条消息,Processor 被认为是线程安全的,因为多个消费者可能同时使用它。

如果您觉得这会对性能产生太大影响(由于可能的锁定机制),那么您可以创建一个处理器池。尽管并非所有工作人员都能从池中受益(甚至工作),但这一切都取决于处理器做什么以及需要线程安全的事情是什么。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多