2016-09-19 6 views
1

FileWritingMessageHandlerを使用してファイルの名前を変更する簡単なテストを作成しようとしていますが、ターゲットの宛先ディレクトリを正しく指定する方法がわかりません。Spring統合を使用してインプレースでファイルの名前を変更FileWritingMessageHandler

私はディレクトリツリーを再帰的にスキャンしているので、最終的にファイルペイロードから親パスを読み込み、FileNameGeneratorを使用して名前を変更することができますが、動作するようには見えません。

DefaultFileNameGeneratorの 'payload.name'は正しく解決されますが、 'payload.path'は正しく解決されません。

ソースファイルの場所を正しく決定し、ハンドラでそのファイルを使用するにはどうすればよいですか?ここで

編集

は、ファイルをスキャンするチャネルアダプタです。再帰的スキャンを実現するには、.setUseWatchService(true)を使用しなければなりませんでした。

@Bean 
@InboundChannelAdapter(channel = "sourceFileChannel", poller =  @Poller(fixedRate = "5000", maxMessagesPerPoll = "-1")) 
public MessageSource<File> sourceFiles() { 

CompositeFileListFilter<File> filters = new CompositeFileListFilter<>(); 
filters.addFilter(new SimplePatternFileListFilter(sourceFilenamePattern)); 
filters.addFilter(persistentFilter()); 

FileReadingMessageSource source = new FileReadingMessageSource(); 
source.setAutoCreateDirectory(true); 
source.setDirectory(new File(sourceDirectory)); 
source.setFilter(filters); 
source.setUseWatchService(true); 

return source; 
} 

UPDATE

アルテム私は私のミスを理解して助けました。

私は、Artemで説明したようにSpelExpressionParserを使用して目的の結果を達成することができました。

キーピースビーイング: "payload.parentは" 適切にファイルの親パスに解決

new SpelExpressionParser().parseExpression("payload.parent")

@Bean 
@ServiceActivator(inputChannel = "processingFileChannel") 
public MessageHandler copyFileForProcessingOutboundChannelAdapter() { 

    FileWritingMessageHandler adapter = new FileWritingMessageHandler(new SpelExpressionParser().parseExpression("payload.parent")); 
    adapter.setDeleteSourceFiles(false); 
    adapter.setAutoCreateDirectory(true); 
    adapter.setExpectReply(false); 
    adapter.setFileNameGenerator(processingFileNameGenerator()); 

    return adapter; 
} 

@Bean 
public DefaultFileNameGenerator processingFileNameGenerator() { 
    DefaultFileNameGenerator defaultFileNameGenerator = new DefaultFileNameGenerator(); 
    defaultFileNameGenerator.setExpression("'p_' + payload.name"); 
    return defaultFileNameGenerator; 
} 
+0

「再帰的にスキャンする」方法を理解するために 'source'アダプタを共有してもよろしいですか? –

+0

多分あなたの問題はここにあります:https://jira.spring.io/browse/INT-832 –

答えて

2

DefaultFileNameGeneratorの 'payload.name' を適切に解決されますが、 'payload.path' をしません。

まあ、私はあなたのケースではどうあるべきかわからないんだけど、私にとっては、常にスキャンするルートディレクトリを含むソースファイルのフル、絶対パスを、返すこと。

processingFileNameGeneratorにはという名前がありますので、ターゲットからのルートディレクトリを切断するには、pathを使用してください。たとえば、私のルートディレクトリが/rootで、サブディレクトリ/root/foo/my_file.txtからファイルを取得した場合、私はpayload.path.replaceFirst('/root', '')を実行できます。ですから、私はちょうど/foo/my_file.txtを持っています。

directoryからの相対パスをFileHeaders.FILENAMEに入力するには、少なくともJIRAを実行します。

UPDATE

ああ!そうですか。いいえ、それはそのように動作しません。 FileWritingMessageHandlerを参照してください。 Stringは静的なターゲットディレクトリを一度受け入れます。私たちの場合、根。 new LiteralExpression("payload.path")のようなコードは、望ましい方法でも動作しません。 JavaDocs LiteralExpressionを参照してください。常に同じ静的値を返すのはExpressionです。あなたの場合はpayload.pathです。

Messageの入力に対して実際に評価する場合は、new SpeLexpressionParser().parseExpression("payload.path")を使用してください。しかし、前にも述べたように、サブディレクトリ内のファイルの絶対パスが返されます。

+0

ありがとうございましたArtem、私はそのアプローチを試みます。私はさらに、((File)message.getPayload())。getParent()に新しいPARENTヘッダーセットを追加するためにTransformerを導入しようとしましたが、ServiceActivator copyFileForProcessingOutboundChannelAdapter()の行でもFileWritingMessageHandlerアダプター= new FileWritingMessageHandler( "headers 。親");単に "headers.parent"という名前の新しいディレクトリを作成し、既存の親ディレクトリをヘッダ値から取得します。 – rcurrie

+1

私の答えに 'EDIT'を見つけてください。 –

+0

ありがとう、Artem、ちょうど私が必要なもの! – rcurrie

関連する問題