Spring Integration, excluir arquivo no adaptador de canal de saída
-
13-12-2019 - |
Pergunta
Estou usando o Spring Integration para pesquisar um diretório em busca de um arquivo, processar esse arquivo em uma classe de serviço, gravar esse arquivo em um diretório de saída e excluir o arquivo original.
Tenho a seguinte configuração XML:
<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"/>
Isso pesquisa o arquivo, passa-o para meu processamento_service e copia-o para o diretório de saída.No entanto, o arquivo original não está sendo excluído.Alguém tem alguma idéia de por que não?
Solução
Eu sei que a pergunta foi feita há muito tempo, mas talvez a resposta seja útil para outra pessoa.
A razão pela qual o arquivo de entrada não é excluído é fornecida no Referência de integração Spring:
O
delete-source-files
atributo só terá um efeito se a mensagem de entrada tiver uma carga útil de arquivo ou se oFileHeaders.ORIGINAL_FILE
O valor do cabeçalho contém a instância do arquivo de origem ou uma string representando o caminho do arquivo original.
Sua mensagem não contém este cabeçalho específico.Se você usar um dos transformadores de arquivo padrão (FileToStringTransformer
e FileToByteArrayTransformer
) será definido automaticamente.Alternativamente, você pode configurá-lo manualmente usando um enriquecedor de cabeçalho.
Por trás das cenas algo assim está acontecendo nos transformadores de arquivo:
...
Message<?> transformedMessage = MessageBuilder.withPayload(result)
.copyHeaders(message.getHeaders())
.setHeaderIfAbsent(FileHeaders.ORIGINAL_FILE, file)
.setHeaderIfAbsent(FileHeaders.FILENAME, file.getName())
.build();
...
Outras dicas
Da documentação http://static.springsource.org/spring-integration/reference/html/files.html
<int-file:outbound-gateway id="mover" request-channel="moveInput"
reply-channel="output"
directory="${output.directory}"
mode="REPLACE" delete-source-files="true"/>
Não sei como fazer isso no adaptador de canal de entrada (o que acho que faz sentido)