我用的是 FileReadingMessageSource
有一个习惯 FileLocker
:
@Component
public class JdbcFileLocker implements FileLocker {
...
@Autowired
JdbcFileLocker jdbcFileLocker;
@Bean
@InboundChannelAdapter(value = "fileInputChannel", poller = @Poller(fixedDelay = "1000"))
public MessageSource<File> fileReadingMessageSource() {
FileReadingMessageSource source = new FileReadingMessageSource();
source.setDirectory(new File("/workspace/in"));
source.setFilter(new SimplePatternFileListFilter("input"));
source.getScanner().setLocker(jdbcFileLocker);
return source;
}
现在我想用 FileLocker jdbcFileLocker
在 FileWritingMessageHandler
:
@Bean
@ServiceActivator(inputChannel = "fileInputChannel")
public MessageHandler fileWritingMessageHandler() {
FileWritingMessageHandler fileWritingMessageHandler =
new FileWritingMessageHandler(new File("/workspace/out"));
我必须自己解锁文件吗 @ServiceActivator
或者我可以把我的 FileLocker
以某种方式发送到filewritingmessagehandler?
1条答案
按热度按时间0tdrvxhp1#
首先考虑使用
fileWritingMessageHandler.setExpectReply(false)
. 因为默认情况下FileWritingMessageHandler
作为一个网关,将尝试产生一个在流中没有处理的回复,因此一些错误将被抛出到轮询器。为了你的
FileLocker
用例参见ExpressionEvaluatingRequestHandlerAdvice
在你的fileWritingMessageHandler
服务激活器。它onSuccessExpression
可以做一个解锁,这是真正要做的后FileWritingMessageHandler
完成它的过程。有关详细信息,请参阅文档:https://docs.spring.io/spring-integration/docs/current/reference/html/messaging-endpoints.html#message-处理建议链另一个是有一个
fileInputChannel
作为一个PublishSubscribeChannel
不更改当前服务器的配置fileWritingMessageHandler
. 但是您将另一个服务激活器订户添加到将要执行的通道FileLocker.unlock()
逻辑。要确保在第一个用户之后调用第二个用户,请考虑添加@Order(100)
为您的解锁服务激活。另见文件:https://docs.spring.io/spring-integration/docs/current/reference/html/core.html#channel-实现publishsubscribechannel