4

问题

我对 Spring 集成邮件适配器设置有一个非常基本的配置(以下是相关示例):

<int:channel id="emailChannel">        
    <int:interceptors>
        <int:wire-tap channel="logger"/>
    </int:interceptors>
</int:channel> 

<mail:inbound-channel-adapter id="popChannel"
  store-uri="pop3://user:password@domain.net/INBOX"
  channel="emailChannel"
  should-delete-messages="true"
  auto-startup="true">
  <int:poller max-messages-per-poll="1" fixed-rate="30000"/>
</mail:inbound-channel-adapter>

<int:logging-channel-adapter id="logger" level="DEBUG"/>

<int:service-activator input-channel="emailChannel" ref="mailResultsProcessor" method="onMessage" />

这在大多数情况下工作正常,我可以看到显示轮询的日志(当有邮件时,它可以很好地连接到我的 mailResultsProcessor):

2013-08-13 08:19:29,748 [task-scheduler-3] DEBUG org.springframework.integration.mail.Pop3MailReceiver - opening folder [pop3://user:password@fomain.net/INBOX]
2013-08-13 08:19:29,796 [task-scheduler-3] INFO  org.springframework.integration.mail.Pop3MailReceiver - attempting to receive mail from folder [INBOX]
2013-08-13 08:19:29,796 [task-scheduler-3] DEBUG org.springframework.integration.mail.Pop3MailReceiver - found 0 new messages
2013-08-13 08:19:29,796 [task-scheduler-3] DEBUG org.springframework.integration.mail.Pop3MailReceiver - Received 0 messages
2013-08-13 08:19:29,893 [task-scheduler-3] DEBUG org.springframework.integration.endpoint.SourcePollingChannelAdapter - Received no Message during the poll, returning 'false'

我遇到的问题是轮询在白天停止,日志中没有说明它停止工作的原因。我能说的唯一原因是日志中不存在上面的调试,并且电子邮件建立在电子邮件帐户上。

问题

  • 有没有人见过这个并知道如何解决它?
  • 我可以在配置中进行更改以将问题捕获到日志中吗?我认为设置为调试的日志通道适配器会涵盖这一点。

在 Tomcat 7 上使用 Spring Integration 的 2.2.3.RELEASE 版本,日志输出默认为 catalina.out。部署在 AWS 标准 tomcat 7 实例上。

4

2 回答 2

3

轮询线程很可能挂在上游的某个地方。使用您的配置,在当前轮询完成之前不会进行下一次轮询。

您可以使用 jstack 或 VisualVM 来获取线程转储,以了解线程在做什么。

另一种可能性是您正遭受轮询线程饥饿的困扰——如果您的应用程序中有很多其他被轮询的元素,并且取决于它们的配置。默认taskSchedulerbean 只有 10 个线程。

您可以将任务执行器添加到,<poller/>以便将每个轮询移交给另一个线程,但请注意,如果轮询任务的执行时间比轮询速率长,这可能会导致并发轮询。

于 2013-08-13T12:48:18.683 回答
1

为了专门解决这个问题,我使用了以下配置:

<mail:inbound-channel-adapter id="popChannel"
      store-uri="pop3://***/INBOX"
      channel="emailChannel"
      should-delete-messages="true"
      auto-startup="true">
      <int:poller max-messages-per-poll="5" fixed-rate="60000" task-executor="pool"/>
</mail:inbound-channel-adapter>

<task:executor id="pool" pool-size="10" keep-alive="50"/>

一旦转向这种方法,我们就没有看到进一步的问题,并且使用任何池的优点是任何成为问题的线程都被清理并重新创建。

于 2014-10-08T17:31:28.797 回答