我在这里查看过,无法使列表文件正常工作:
@Bean
public SessionFactory<LsEntry> sftpSessionFactory() {
DefaultSftpSessionFactory factory = new DefaultSftpSessionFactory(true);
factory.setHost("localhost");
factory.setPort(port);
factory.setUser("foo");
factory.setPassword("foo");
factory.setAllowUnknownKeys(true);
factory.setTestSession(true);
return new CachingSessionFactory<LsEntry>(factory);
}
@MessagingGateway
public interface MyGateway {
@Gateway(requestChannel = "sftpChannel")
List<File> listFiles();
}
@Bean
@ServiceActivator(inputChannel = "sftpChannel")
public MessageHandler handler() {
return new SftpOutboundGateway(ftpSessionFactory(), "ls", "'my_remote_dir/'");
}
在@component类中,我有:
@Autowired
MyGateway gateway;
public void list(){
List<File> files = gateway.listFiles();
}
当我运行这个,我得到一个错误 receive is not supported, because no pollable reply channel has been configured
我认为这与我对整合渠道的了解有关。也许我缺少了一个bean,但我的主要目标是替换我当前使用的inboundchannel适配器来请求临时文件,而不是连续轮询文件服务器
1条答案
按热度按时间gfttwv5a1#
是的,SpringIntegrationGateway中提到的没有任何参数的故事肯定与您的问题有关。
你错过了一个事实
List<File> listFiles()
契约是没有争议的,所以框架不清楚用什么来发送给它sftpChannel
. 所以它试着呼叫receive
. 但是自从你sftpChannel
不是PollableChannel
,你犯了那个错误。无论如何,这是一个不同的故事,而不是你想要得到的答复,从发送一条消息到sftpChannel
就像你试图处理网关合同一样。您只需要更明确地说什么作为no-arg网关契约的有效负载。
在文档中查看更多信息:https://docs.spring.io/spring-integration/docs/current/reference/html/messaging-endpoints.html#gateway-不调用参数方法。这个
@Payload
是你的答案。或者您可以指定payloadExpression
在那上面@Gateway
注解或defaultPayloadExpression
上@MessagingGateway
.