我使用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=****&consumer.delay=60000&disconnect=false&closeFolder=false&peek=false&delete=true&fetchSize=1&maxMessagesPerPoll=1&mapMailMessage=false&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
}
}
答案 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