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?

Foi útil?

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 o FileHeaders.ORIGINAL_FILEO 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)

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top