gpt4 book ai didi

java - Spring 集成 : Inbound Channel Adapter configuration via annotations

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:37:58 24 4
gpt4 key购买 nike

如何通过注释而不是常规配置文件来配置入站 channel 适配器?我能够为 session 工厂定义 bean,如下所示:

@Bean
public DefaultFtpSessionFactory ftpSessionFactory() {
DefaultFtpSessionFactory ftpSessionFactory = new
DefaultFtpSessionFactory();
ftpSessionFactory.setHost(host);
ftpSessionFactory.setPort(port);
ftpSessionFactory.setUsername(username);
ftpSessionFactory.setPassword(password);
return ftpSessionFactory;
}

如何配置通过注释给出的入站 channel 适配器?

<int-ftp:inbound-channel-adapter id="ftpInbound"
channel="ftpChannel"
session-factory="ftpSessionFactory"
filename-pattern="*.xml"
auto-create-local-directory="true"
delete-remote-files="false"
remote-directory="/"
local-directory="ftp-inbound"
local-filter="acceptOnceFilter">

<int:poller fixed-delay="60000" max-messages-per-poll="-1">
<int:transactional synchronization-factory="syncFactory" />
</int:poller>

</int-ftp:inbound-channel-adapter>

@Artem Bilan修改后的代码如下

@EnableIntegration
@Configuration
public class FtpConfiguration {
@Value("${ftp.host}")
private String host;
@Value("${ftp.port}")
private Integer port;
@Value("${ftp.username}")
private String username;
@Value("${ftp.password}")
private String password;
@Value("${ftp.fixed.delay}")
private Integer fixedDelay;
@Value("${ftp.local.directory}")
private String localDirectory;

private final static Logger LOGGER = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());

@Bean
public SessionFactory<FTPFile> ftpSessionFactory() {
DefaultFtpSessionFactory sessionFactory = new DefaultFtpSessionFactory();
sessionFactory.setHost(host);
sessionFactory.setPort(port);
sessionFactory.setUsername(username);
sessionFactory.setPassword(password);
return new CachingSessionFactory<FTPFile>(sessionFactory);
}

@Bean
public FtpInboundFileSynchronizer ftpInboundFileSynchronizer() {
FtpInboundFileSynchronizer fileSynchronizer = new FtpInboundFileSynchronizer(ftpSessionFactory());
fileSynchronizer.setDeleteRemoteFiles(false);
fileSynchronizer.setRemoteDirectory("/");
fileSynchronizer.setFilter(new FtpSimplePatternFileListFilter("*.xml"));
return fileSynchronizer;
}

@Bean
@InboundChannelAdapter(value = "ftpChannel",
poller = @Poller(fixedDelay = "60000", maxMessagesPerPoll = "-1"))
public MessageSource<File> ftpMessageSource() {
FtpInboundFileSynchronizingMessageSource source =
new FtpInboundFileSynchronizingMessageSource(ftpInboundFileSynchronizer());
source.setLocalDirectory(new File(localDirectory));
source.setAutoCreateLocalDirectory(true);
source.setLocalFilter(new AcceptOnceFileListFilter<File>());
return source;
}

在运行这个时,我得到一个异常如下 没有定义名为“ftpChannel”的 bean

请注意,在连接入站 channel 适配器时,“ channel ”关键字不可用,取而代之的是它的“值”。

我尝试用 PollableChannel 连接 channel ,但也没有成功。如下所示:

@Bean
public MessageChannel ftpChannel() {
return new PollableChannel() {
@Override
public Message<?> receive() {
return this.receive();
}

@Override
public Message<?> receive(long l) {
return null;
}

@Override
public boolean send(Message<?> message) {
return false;
}

@Override
public boolean send(Message<?> message, long l) {
return false;
}
};
}

我收到错误消息“未能在超时内发送消息:-1”。我是否还做错了什么?

我正在寻找的是在应用程序启动时连接所有 beans,然后公开一些方法来开始轮询服务器,处理它们然后从本地删除它们,就像这样

public void startPollingTheServer() {
getPollableChannel().receive();
}

其中 getPollableChannel() 为我提供了为轮询连接的 bean。

最佳答案

有一个@InboundChannelAdapter 适合您。

@Bean
public FtpInboundFileSynchronizer ftpInboundFileSynchronizer() {
FtpInboundFileSynchronizer fileSynchronizer = new FtpInboundFileSynchronizer(ftpSessionFactory());
fileSynchronizer.setDeleteRemoteFiles(false);
fileSynchronizer.setRemoteDirectory("/");
fileSynchronizer.setFilter(new FtpSimplePatternFileListFilter("*.xml"));
return fileSynchronizer;
}

@Bean
@InboundChannelAdapter(channel = "ftpChannel")
public MessageSource<File> ftpMessageSource() {
FtpInboundFileSynchronizingMessageSource source =
new FtpInboundFileSynchronizingMessageSource(ftpInboundFileSynchronizer());
source.setLocalDirectory(new File("ftp-inbound"));
source.setAutoCreateLocalDirectory(true);
source.setLocalFilter(new AcceptOnceFileListFilter<File>());
return source;
}

另外看看 Reference Manual .

另请注意,对于Java DSL for Spring Integration ,其中可能看起来像:

@Bean
public IntegrationFlow ftpInboundFlow() {
return IntegrationFlows
.from(s -> s.ftp(this.ftpSessionFactory)
.preserveTimestamp(true)
.remoteDirectory("ftpSource")
.regexFilter(".*\\.txt$")
.localFilename(f -> f.toUpperCase() + ".a")
.localDirectory(this.ftpServer.getTargetLocalDirectory()),
e -> e.id("ftpInboundAdapter").autoStartup(false))
.channel(MessageChannels.queue("ftpInboundResultChannel"))
.get();
}

关于java - Spring 集成 : Inbound Channel Adapter configuration via annotations,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38380851/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com