0

大家好,

在我正在开发的软件中,我有不同的骆驼路线处理数据,即(在这种情况下)使用骆驼邮件组件从 imap 服务器加载。
这些路由中的每一个都对数据进行处理,然后将数据提供给下一个路由。它们在运行时动态配置。
在这些路由之间是一个嵌入式 ActiveMQ 服务器,每个路由都使用它来加载数据并将数据保存到(以便下一个路由获取它)。

由于这种结构,我遇到了骆驼邮件消费者的特殊情况。
加载邮件并发送到第一个 ActiveMQ 队列时,立即将其删除/标记为已读(取决于邮件消费者的设置),但邮件的实际处理尚未结束,因为下一个路由仍有来处理它。

这是一个简化的视图:

from("imaps://imap.server.com?...")
  // Format mail in a way the other routes understand
  .to("activemq:queue1"); // After this the mail is delete on the imap server

from("activemq:queue1")
  // do some processing
  .to("activemq:queue2");

from("activemq:queue2")
  // Do some final processing
  .to("..."); // NOW the mail should be delete on the imap server

这个问题更是我做的错误处理的一个问题。
此“链”中的任何路由都会将失败的交换发送到 ActiveMQ 服务器上的 deadLetterQueue。这样,就有一个错误处理路径,它会拾取失败的交换并处理它们,无论它在哪里崩溃。
如果出现问题,我希望 imap 服务器上的电子邮件以不同方式处理(甚至可能什么都不做,在下一次投票时再试一次)

由于骆驼 InOut MEP 在路由结束时将交换返回给(邮件)消费者,即当交换被提供给队列时,我不能在整个过程结束后使用消费者删除邮件。
不幸的是,我也没有在邮件生产者上看到删除选项(我猜这是有道理的,因为它不是 imap 的工作方式)。
如果有必要,我也可以为此使用 smtp。

有谁知道我如何使用没有其他连接器来实​​现这一点,然后是骆驼组件来连接到邮件服务器?

提前问候和感
谢克里斯

编辑:
将参数“ exchangePattern=InOut ”添加到 jms 队列(.to("activemq:queue1?exchangePattern=InOut"))让邮件组件等待整个过程完成。
这样做的问题是,我们失去了 ActiveMQ 的巨大优势,即所有路由都是相互独立的。这很重要,因此当稍后的路由需要很长时间来处理时,我们不会遇到使用邮件的问题,这很可能会发生。
所以理想情况下,我们找到一个解决方案,在没有任何组件等待完成的情况下删除邮件

4

0 回答 0