我可以为filewritingmessagehandler提供自定义filelocker吗?

1wnzp6jl  于 2021-07-26  发布在  Java
关注(0)|答案(1)|浏览(319)

我用的是 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 jdbcFileLockerFileWritingMessageHandler :

@Bean
@ServiceActivator(inputChannel = "fileInputChannel")
  public MessageHandler fileWritingMessageHandler() {
    FileWritingMessageHandler fileWritingMessageHandler = 
      new FileWritingMessageHandler(new File("/workspace/out"));

我必须自己解锁文件吗 @ServiceActivator 或者我可以把我的 FileLocker 以某种方式发送到filewritingmessagehandler?

0tdrvxhp

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

相关问题