Camel IMAPS和TIMER组件 - 排除冗余线程

时间:2014-04-25 07:02:53

标签: java multithreading apache-camel

我使用Camel IMAPS和Timer组件。

成功收到电子邮件,我可以使用MailboxConsumer处理它们。

Timer正在使用MyConsumer bean开始一些处理。

问题是我只需要为我使用的每个消费者提供单线程。

但Camel框架为我在项目中使用的每个消费者提供了两个线程。

它会导致对我的业务逻辑有害的相同对象的双重处理。

我需要建议如何配置camel以单线程模式(不同时)使用邮箱。

我的camel-context.xml片段:

<camelContext id="camel-mailbox" xmlns="http://camel.apache.org/schema/spring">
    <package>my.package</package>
    <endpoint id="mailboxEndpoint" uri="imaps://host?password=****&amp;consumer.delay=60000&disconnect=false&amp;closeFolder=false&amp;peek=false&amp;delete=true&amp;fetchSize=1&amp;maxMessagesPerPoll=1&amp;mapMailMessage=false&amp;unseen=true"/>
    <route>
        <from uri="timer://myTimer?period=180000"/>
        <setBody><constant></constant></setBody>
        <to uri="bean:myConsumer?method=process"/>
    </route>
</camelContext>
<bean class="my.package.MyConsumer" name="myConsumer"/>
<bean class="my.package.MailboxConsumer"/>

MyConsumer课程:

public class MyConsumer {
    public synchronized void process(){
        // here my code runs
    }
}

inputMialboxEndpoint使用者:

public class MailboxConsumer {
    @Consume(ref="mailboxEndpoint")
    public synchronized void process(Exchange exchange) {
        // here my code do runs
    }
}

1 个答案:

答案 0 :(得分:2)

它有两个线程,因为你有2条路线。一个是直接定义的,第二个是使用@Consume注释定义的。

为什么你只需要使用一个线程?原因是什么?也许你应该尝试将应用程序重构为线程安全?

但如果你真的需要单线程,那么你应该尝试类似的东西:

<from uri="timer://myTimer?period=180000"/>
<setBody><constant></constant></setBody>
<setHeader headerName="componentType"><constant>timer</constant></setBody>
<to uri="seda:componentQueue">

<from endpoint="mailboxEndpoint"/>
<setHeader headerName="componentType"><constant>mail</constant></setBody>
<to uri="seda:componentQueue">


<from uri="seda:componentQueue?concurrentConsumers=1">
<choice //here choose component by header and proceed