Spring Integration, supprimez le fichier dans l'adaptateur de canal sortant
-
13-12-2019 - |
Question
J'utilise Spring Integration pour interroger un répertoire pour un fichier, traiter ce fichier dans une classe de service, écrire ce fichier dans un répertoire de sortie, puis supprimer le fichier d'origine.
J'ai la configuration XML suivante :
<int-file:inbound-channel-adapter id="filesInChannel"
directory="file:${java.io.tmpdir}/input"
auto-create-directory="true" >
<int:poller id="poller" fixed-delay="1000" />
</int-file:inbound-channel-adapter>
<int:service-activator id="servicActivator"
input-channel="filesInChannel"
output-channel="filesOut"
ref="my_file_processing_service">
</int:service-activator>
<int-file:outbound-channel-adapter id="filesOut" auto-create-directory="true" delete-source-files="true" directory="file:${java.io.tmpdir}/output"/>
Cela interroge le fichier, le transmet à mon service_traitement et le copie dans le répertoire sortant.Cependant, le fichier d'origine n'est pas supprimé.Quelqu'un a-t-il une idée de pourquoi pas ?
La solution
Je sais que la question a été posée il y a longtemps mais peut-être que la réponse sera utile à quelqu'un d'autre.
La raison pour laquelle le fichier d'entrée n'est pas supprimé est indiquée dans le Référence d'intégration Spring:
Le
delete-source-files
L'attribut n'aura un effet que si le message entrant a une charge utile de fichier ou si leFileHeaders.ORIGINAL_FILE
La valeur d'en-tête contient soit l'instance de fichier source ou une chaîne représentant le chemin d'origine du fichier.
Votre message ne contient pas cet en-tête particulier.Si vous utilisez l'un des transformateurs de fichiers standard (FileToStringTransformer
et FileToByteArrayTransformer
) il sera réglé automatiquement.Vous pouvez également le définir manuellement à l'aide d'un enrichisseur d'en-tête.
Dans les coulisses quelque chose comme ceci se produit dans les transformateurs de fichiers :
...
Message<?> transformedMessage = MessageBuilder.withPayload(result)
.copyHeaders(message.getHeaders())
.setHeaderIfAbsent(FileHeaders.ORIGINAL_FILE, file)
.setHeaderIfAbsent(FileHeaders.FILENAME, file.getName())
.build();
...
Autres conseils
de la documentation http://static.springsource.org/spring-Integration / référence / html / fichiers.html
<int-file:outbound-gateway id="mover" request-channel="moveInput"
reply-channel="output"
directory="${output.directory}"
mode="REPLACE" delete-source-files="true"/>
Je ne sais pas comment faire cela sur l'adaptateur de canal entrant (que je pense est logique)