2017-09-26 1 views
1

Je me demandais si quelqu'un sait si je pourrais utiliser le service de surveillance dans un FileInboundChannelAdapter avec un LastModifiedFileListFilter?Printemps Poller File d'intégration avec Watch Service et LastModifiedFileListFilter

Le code exemple ci-dessous me donne des résultats assez contradictoires. Parfois, le fichier se trouve simplement dans le dossier et reste non traité.

Je soupçonne que le service de surveillance pourrait être incompatible avec le LastModifiedFileListFilter. Par exemple

  • Si le LastModifiedFileListfilter est configuré pour rechercher des fichiers au moins 5 secondes vieux et le Poller est réglé sur une interrogation toutes les 10 secondes.
  • A la 9ème seconde, un fichier a pu être créé dans le dossier surveillé.
  • A 10 secondes, le Poller interroge le service de surveillance pour savoir ce qui a changé au cours des 10 dernières secondes.
  • Il trouve le fichier nouvellement créé. Le nouveau créé a un temps de dernière modification de -1 seconde, donc ne le traite pas.

  • À 20 secondes, le scrutateur interroge une seconde fois le service de surveillance , cette fois il ne voit pas le fichier non traité comme il a été créé il y a plus de 10 secondes.

Est-ce que quelqu'un d'autre a une expérience avec cela? Y aurait-il une façon recommandée de contourner ce problème et de me permettre de vérifier que le dossier a été entièrement écrit avant de continuer?

@Bean 
public IntegrationFlow ftpInputFileWatcher() 
{ 
    return IntegrationFlows.from(ftpInboundFolder(), filePoller()) 
      .handle() 
      /*abbreviated*/ 
      .get(); 
} 

private FileInboundChannelAdapterSpec ftpInboundFolder() { 
    LastModifiedFileListFilter lastModifiedFileListFilter = new LastModifiedFileListFilter(); 
    lastModifiedFileListFilter.setAge(5); 

    return Files.inboundAdapter(inboundFolder) 
      .preventDuplicates(false) 
      .useWatchService(true) 
      .filter(fileAgeFilterToPreventPrematurePickup()); 
} 

protected Consumer<SourcePollingChannelAdapterSpec> filePoller(){ 
    return poller -> poller.poller((Function<PollerFactory, PollerSpec>) p -> p.fixedRate(2000)); 
} 

Merci!

Répondre

0

Oui, c'est une bonne prise!

À droite, ils ne sont pas compatibles. WatchService est basé sur les événements et stocke les fichiers des événements dans la file d'attente interne. Lorsque l'interrogateur déclenche son action, il interroge les fichiers de cette file d'attente et applique ses filtres. Puisque LastModifiedFileListFilter rejette le fichier et qu'il n'y a plus aucun événement, nous ne verrons plus ce fichier.

S'il vous plaît, soulever une JIRA sur la question et nous penserons à être.

Pendant ce temps comme une solution de contournement ne pas utiliser WatchService pour ce genre de logique.

+0

Merci Artem, J'ai connecté INT-4351. – yfl

+0

Hi Artem, il semble qu'il ne soit pas possible d'utiliser un scanner de répertoire différent de celui par défaut. S'il vous plaît voir bug: INT-4352. – yfl

+0

Juste pour clarifier, la raison pour laquelle j'avais besoin du service de surveillance est que je peux ramasser les modifications apportées aux fichiers dans les sous-répertoires. Je suis allé avec le service de surveillance comme c'était la recommandation par les docs de printemps. Cependant, après avoir rencontré le problème ci-dessus, je voulais passer à un RecursiveLeafOnlyDirectoryScanner. C'est alors que j'ai remarqué que vous ne pouvez pas utiliser un scanner différent. – yfl