2013-08-13 2 views
3

ProblèmeSpring Integration Pop3MailReceiver arrête silencieusement polling sans vous connecter pourquoi

J'ai une configuration très basique pour une configuration de l'adaptateur de messagerie d'intégration de printemps (ci-dessous est l'échantillon concerné):

<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:[email protected]/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" /> 

Cela fonctionne bien la majorité du temps et je peux voir les journaux montrant l'interrogation (et cela fonctionne bien accrocher dans mon mailResultsProcessor quand un mail est là):

2013-08-13 08:19:29,748 [task-scheduler-3] DEBUG org.springframework.integration.mail.Pop3MailReceiver - opening folder [pop3://user:[email protected]/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' 

Le problème que j'ai est que l'interrogation s'arrête pendant la journée, sans indication dans les journaux pourquoi il a cessé de fonctionner. La seule raison pour laquelle je peux dire est que le débogage ci-dessus n'est pas présent dans les journaux et que les E-Mails se construisent sur le compte E-Mail.

Questions

  • Quelqu'un at-il vu cela avant et de savoir comment le résoudre?
  • Y a-t-il une modification que je peux apporter à ma configuration pour capturer le problème dans le journal? Je pensais que l'adaptateur de canal de journalisation réglé au débogage aurait ce couvert.

En utilisant la version 2.2.3.RELEASE de Spring Integration sur Tomcat 7, consignation la sortie par défaut catalina.out. Déployé sur une instance AWS standard tomcat 7.

+0

Cela s'est-il avéré être un problème dans votre code ou au printemps? – Jason

+0

@Jason c'est difficile à dire. Ce qui semblait être quand le thread faisait la connexion s'il rencontrait un problème il y aurait un échec silencieux et ce thread serait tué/suspendu/suspendu. Passer à l'utilisation d'une approche basée sur un pool a résolu le problème, car les pools suppriment généralement les threads disparus, etc. Mon point de vue est un thread ne devrait pas échouer/se bloquer comme il le faisait silencieusement, mais j'aurais probablement dû utiliser un pool. Je posterai la config mise à jour ci-dessous. – Jim

Répondre

2

Il est très probable que le fil d'interrogation soit suspendu quelque part en amont. Avec votre configuration, le prochain sondage n'aura pas lieu tant que le sondage en cours ne sera pas terminé.

Vous pouvez utiliser jstack ou VisualVM pour obtenir un vidage de thread pour savoir ce que fait le thread.

Une autre possibilité est que vous souffriez de la famine du thread d'interrogation - si vous avez beaucoup d'autres éléments interrogés dans votre application, et en fonction de leur configuration. Le bean taskScheduler par défaut a seulement 10 threads.

Vous pouvez ajouter un exécuteur de tâche au <poller/> afin que chaque interrogation soit transmise à un autre thread, mais sachez que cela peut entraîner des interrogations simultanées si une tâche interrogée prend plus de temps à s'exécuter que le taux d'interrogation.

+0

Merci pour la réponse Gary, le premier sonne certainement comme il pourrait être dans le bon sens. Je vais faire le réglage du code de mon côté et accepter la réponse si cela résout le problème. – Jim

1

Pour résoudre ce problème spécifiquement j'ai utilisé la configuration ci-dessous:

<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"/> 

Une fois de passer à cette approche, nous avons vu plus aucun problème, et est toute utilisation de la piscine, l'avantage est des threads qui deviennent un problème sont nettoyé et recréé.

+1

Merci - J'avais le même problème avec le protocole IMAP. Maintenant, j'essaie l'approche inactive IMAP (décrite dans Spring Integration) et je suis encore à voir si cela échoue à nouveau. Je garderai cette solution à l'esprit si c'est le cas. – Jason