Spring 与 Spring Boot 集成 SFTP 示例

2024-01-12

我们正在为 Spring 应用程序使用最新的 Spring Boot,并为 SFTP 使用最新的 Spring Integration。我访问过 Spring Integration SFTP 文档站点,并按原样采用了 Spring Boot 配置:

 @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);
    return new CachingSessionFactory<LsEntry>(factory);
}

@Bean
public SftpInboundFileSynchronizer sftpInboundFileSynchronizer() {
    SftpInboundFileSynchronizer fileSynchronizer = new SftpInboundFileSynchronizer(sftpSessionFactory());
    fileSynchronizer.setDeleteRemoteFiles(false);
    fileSynchronizer.setRemoteDirectory("/");
    fileSynchronizer.setFilter(new SftpSimplePatternFileListFilter("*.xml"));
    return fileSynchronizer;
}

@Bean
@InboundChannelAdapter(channel = "sftpChannel")
public MessageSource<File> sftpMessageSource() {
    SftpInboundFileSynchronizingMessageSource source =
            new SftpInboundFileSynchronizingMessageSource(sftpInboundFileSynchronizer());
    source.setLocalDirectory(new File("ftp-inbound"));
    source.setAutoCreateLocalDirectory(true);
    source.setLocalFilter(new AcceptOnceFileListFilter<File>());
    return source;
}

@Bean
@ServiceActivator(inputChannel = "sftpChannel")
public MessageHandler handler() {
    return new MessageHandler() {

        @Override
        public void handleMessage(Message<?> message) throws MessagingException {
            System.out.println(message.getPayload());
        }

    };
}

让我澄清一下,剪切和粘贴后,会运行一些单元测试。但是,在加载应用程序上下文时出现错误消息,因为轮询不存在。

当我用 google 搜索该错误时,StackOverflow 上的其他帖子说我还必须在加载应用程序上下文时添加以删除此错误消息。

@Bean(name = PollerMetadata.DEFAULT_POLLER)
public PollerMetadata defaultPoller() {

    PollerMetadata pollerMetadata = new PollerMetadata();
    pollerMetadata.setTrigger(new PeriodicTrigger(60));
    return pollerMetadata;
}

当我添加此代码时,至少我的构建可以工作并且测试可以运行,因为应用程序上下文现在已正确加载。

现在我正在寻找有关如何使其工作和移动文件的代码示例? GitHub 上的 Spring Integration SFTP 示例还可以,但还不是很好......远非如此。

基本 Spring 集成示例展示了如何从 SFTP 服务器读取文件(如果使用 application-context.xml 文件配置数据)。使用 Spring Boot 配置的示例在哪里,然后是从该服务器读取的代码以及测试代码?

据我所知,无论您使用 Java 类进行 Spring Boot 配置还是 application-context.xml 文件...对于自动连接的 SFTP 通道和某些入站通道适配器,工作代码都应该以相同的方式工作。

所以这是代码,我正在努力工作:

@Component
@Profile("sftpInputFetch")
public class SFTPInputFetcher implements InputFetcher
{
    // The PollableChannel seems fine
    @Autowired
    PollableChannel sftpChannel;

    @Autowired
    SourcePollingChannelAdapter sftpChannelAdapter;

@Override
public Stream<String> fetchLatest() throws FileNotFoundException
{
    Stream<String> stream = null;
    sftpChannelAdapter.start();
    Message<?> received = sftpChannel.receive();
    File file = (File)received.getPayload();
    // get Stream<String> from file
    return stream;
}

目前,“sftpChannelAdapter.start();”是我遇到麻烦的部分。 此实现未找到“SourcePollingChannelAdapter”类。

如果这是在经典 XML 应用程序上下文中使用“id”定义的,那么此代码可以很好地自动装配。使用 Spring Boot 配置,您似乎无法为 bean 定义“id”。

这只是因为我缺乏关于如何从使用带有代码中注释的传统应用程序上下文 XML 文件转换为使用完整的 Spring Boot 应用程序上下文配置文件的知识。

非常感谢任何对此的帮助。谢谢!


我不明白这个问题;你说

我必须添加...才能使其正常工作

and then

现在我正在寻找有关如何使其工作的代码示例?

什么不起作用?

您还可以使用

@InboundChannelAdapter(value = "sftpChannel", poller = @Poller(fixedDelay = "5000"))

而不是添加默认轮询器定义。

We will 修复缺少轮询器配置的文档 https://jira.spring.io/browse/INT-4184.

EDIT

我刚刚将代码复制到新的启动应用程序中(使用轮询器配置),它按预期工作。

@SpringBootApplication
public class SftpJavaApplication {

    public static void main(String[] args) {
        new SpringApplicationBuilder(SftpJavaApplication.class).web(false).run(args);
    }

    @Bean
    public SessionFactory<LsEntry> sftpSessionFactory() {
        DefaultSftpSessionFactory factory = new DefaultSftpSessionFactory(true);
        factory.setHost("...");
        factory.setPort(22);
        factory.setUser("...");
        factory.setPassword("...");
        factory.setAllowUnknownKeys(true);
        return new CachingSessionFactory<LsEntry>(factory);
    }

    @Bean
    public SftpInboundFileSynchronizer sftpInboundFileSynchronizer() {
        SftpInboundFileSynchronizer fileSynchronizer = new SftpInboundFileSynchronizer(sftpSessionFactory());
        fileSynchronizer.setDeleteRemoteFiles(false);
        fileSynchronizer.setRemoteDirectory("foo");
        fileSynchronizer.setFilter(new SftpSimplePatternFileListFilter("*.txt"));
        return fileSynchronizer;
    }

    @Bean
    @InboundChannelAdapter(channel = "sftpChannel", poller = @Poller(fixedDelay = "5000"))
    public MessageSource<File> sftpMessageSource() {
        SftpInboundFileSynchronizingMessageSource source = new SftpInboundFileSynchronizingMessageSource(
                sftpInboundFileSynchronizer());
        source.setLocalDirectory(new File("ftp-inbound"));
        source.setAutoCreateLocalDirectory(true);
        source.setLocalFilter(new AcceptOnceFileListFilter<File>());
        return source;
    }

    @Bean
    @ServiceActivator(inputChannel = "sftpChannel")
    public MessageHandler handler() {
        return new MessageHandler() {

            @Override
            public void handleMessage(Message<?> message) throws MessagingException {
                System.out.println(message.getPayload());
            }

        };
    }

}

Result:

16:57:59.697 [task-scheduler-1] WARN  com.jcraft.jsch - Permanently added '10.0.0.3' (RSA) to the list of known hosts.
ftp-inbound/bar.txt
ftp-inbound/baz.txt
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Spring 与 Spring Boot 集成 SFTP 示例 的相关文章

  • 如何测试 JUnit 测试的 Comparator?

    我需要测试 Compare 方法 但我对如何测试感到困惑 我可以看看该怎么做吗 public class MemberComparator implements Comparator
  • 在数据流模板中调用 waitUntilFinish() 后可以运行代码吗?

    我有一个批处理 Apache Beam 作业 它从 GCS 获取文件作为输入 我的目标是根据执行后管道的状态将文件移动到两个 GCS 存储桶之一 如果管道执行成功 则将文件移动到存储桶 A 否则 如果管道在执行过程中出现任何未处理的异常 则
  • 如何为 Gson 编写自定义 JSON 反序列化器?

    我有一个 Java 类 用户 public class User int id String name Timestamp updateDate 我收到一个包含来自 Web 服务的用户对象的 JSON 列表 id 1 name Jonas
  • hibernate总是自己删除表中的所有数据

    您好 我正在开发一个 spring mvc 应用程序 它使用 hibernate 连接到存储文件的 mysql 数据库 我有两个方法 一个方法添加我选择的特定文件路径中的所有文件 另一种方法调用查询以返回从 mysql 存储的文件列表 问题
  • Microsoft Graph 身份验证 - 委派权限

    我可以使用 Microsoft Graph 访问资源无需用户即可访问 https developer microsoft com en us graph docs concepts auth v2 service 但是 此方法不允许我访问需
  • Prim 的迷宫生成算法:获取相邻单元格

    我基于 Prim 算法编写了一个迷宫生成器程序 该算法是 Prim 算法的随机版本 从充满墙壁的网格开始 选择一个单元格 将其标记为迷宫的一部分 将单元格的墙壁添加到墙壁列表中 While there are walls in the li
  • 迁移到 java 17 后有关“每个进程的内存映射”和 JVM 崩溃的 GC 警告

    我们正在将 java 8 应用程序迁移到 java 17 并将 GC 从G1GC to ZGC 我们的应用程序作为容器运行 这两个基础映像之间的唯一区别是 java 的版本 例如对于 java 17 版本 FROM ubuntu 20 04
  • Clip 在 Java 中播放 WAV 文件时出现严重延迟

    我编写了一段代码来读取 WAV 文件 大小约为 80 mb 并播放该文件 问题是声音播放效果很差 极度滞后 你能告诉我有什么问题吗 这是我的代码 我称之为doPlayJframe 构造函数内的函数 private void doPlay f
  • 反思 Groovy 脚本中声明的函数

    有没有一种方法可以获取 Groovy 脚本中声明的函数的反射数据 该脚本已通过GroovyShell目的 具体来说 我想枚举脚本中的函数并访问附加到它们的注释 Put this到 Groovy 脚本的最后一行 它将作为脚本的返回值 a la
  • Java直接内存:在自定义类中使用sun.misc.Cleaner

    在 Java 中 NIO 直接缓冲区分配的内存通过以下方式释放 sun misc Cleaner实例 一些比对象终结更有效的特殊幻像引用 这种清洁器机制是否仅针对直接缓冲区子类硬编码在 JVM 中 或者是否也可以在自定义组件中使用清洁器 例
  • 将多模块 Maven 项目导入 Eclipse 时出现问题 (STS 2.5.2)

    我刚刚花了最后一个小时查看 Stackoverflow com 上的线程 尝试将 Maven 项目导入到 Spring ToolSuite 2 5 2 中 Maven 项目有多个模块 当我使用 STS 中的 Import 向导导入项目时 所
  • Tomcat 6找不到mysql驱动

    这里有一个类似的问题 但关于类路径 ClassNotFoundException com mysql jdbc Driver https stackoverflow com questions 1585811 classnotfoundex
  • 使用 SAX 进行 XML 解析 |如何处理特殊字符?

    我们有一个 JAVA 应用程序 可以从 SAP 系统中提取数据 解析数据并呈现给用户 使用 SAP JCo 连接器提取数据 最近我们抛出了一个异常 org xml sax SAXParseException 字符引用 是无效的 XML 字符
  • 将 JSON 参数从 java 发布到 sinatra 服务

    我有一个 Android 应用程序发布到我的 sinatra 服务 早些时候 我无法读取 sinatra 服务上的参数 但是 在我将内容类型设置为 x www form urlencoded 之后 我能够看到参数 但不完全是我想要的 我在
  • 如何在 Maven 中显示消息

    如何在 Maven 中显示消息 在ant中 我们确实有 echo 来显示消息 但是在maven中 我该怎么做呢 您可以使用 antrun 插件
  • Keycloak - 自定义 SPI 未出现在列表中

    我为我的 keycloak 服务器制作了一个自定义 SPI 现在我必须在管理控制台上配置它 我将 SPI 添加为模块 并手动安装 因此我将其放在 module package name main 中 并包含 module xml 我还将其放
  • Android JNI C 简单追加函数

    我想制作一个简单的函数 返回两个字符串的值 基本上 java public native String getAppendedString String name c jstring Java com example hellojni He
  • 将 JTextArea 内容写入文件

    我在 Java Swing 中有一个 JTextArea 和一个 提交 按钮 需要将textarea的内容写入一个带有换行符的文件中 我得到的输出是这样的 它被写为文件中的一个字符串 try BufferedWriter fileOut n
  • KeyPressed 和 KeyTyped 混淆[重复]

    这个问题在这里已经有答案了 我搜索过之间的区别KeyPressedand KeyTyped事件 但我仍然不清楚 我发现的一件事是 Keypressed 比 KeyTyped 首先被触发 请澄清一下这些事件何时被准确触发 哪个适合用于哪个目的
  • JAVA - 如何从扫描仪读取文件中检测到“\n”字符

    第一次海报 我在读取文本文件的扫描仪中读取返回字符时遇到问题 正在读取的文本文件如下所示 test txt start 2 0 30 30 1 1 90 30 0 test txt end 第一行 2 表示两个点 第二行 位置索引 0 xp

随机推荐

  • Vue:在组件中使用自定义库(pdf.js)

    如何在 Vue 组件中使用供应商库 特别是我想使用 PDF js 我只想为这个特定组件加载它 因为它们是相当大的文件 我正在构建一个需要加载 pdf 的编辑器 所以我将 pdf js 和 pdf worker js 放在 src asset
  • 使用 python 运行 crontab

    Python crontab 脚本似乎不起作用 当我手动运行它时 python home ec2 user code1 py 它工作正常 但当放入 crontab 的 cron txt 文件时 却不起作用 我的 crontab 文件是 ho
  • 控制声音的速度 xcode

    我想知道是否可以减慢 xcode 中的声音 我的意思是我将在 xcode 中的支持文件中添加一些 mp3 文件 并且我将创建能够加快或减慢速度的应用程序 例如使用滑块 有可能吗 如果是 有人可以帮我出点主意吗 谢谢 AVAudioPlaye
  • Firebase - 在互联网离线时上传图像

    Firebase 有很好的选择 即使您处于离线状态 也可以使用其数据库并将数据发送到数据库 然后当连接再次建立时 它会自动将数据发送到数据库 是否也可以使用 Firebase 存储来做到这一点 例如即使互联网关闭也发送图像 然后当互联网再次
  • 如何在我自己的函数中使用给定包的内部函数

    我想使用给定 R 包 例如 httr 的内部函数编写一个函数 而不必将这些方法引用为httr method of httr package in the body我的功能 我不想使用 我尝试改变我的函数的环境 例如 enviroment m
  • 如何下载 Android 版谷歌源代码

    如您所知 有数百个项目的清单https android googlesource com https android googlesource com 我想将它们全部下载到 Windows 机器中 根据谷歌的文件 To install in
  • 更新到 dotnet 6 后 dotnet run 不起作用

    我昨天从 Net 5 更新到 Net 6 现在我的项目无法启动dotnet run 然后我得到错误 Building warn Microsoft AspNetCore Server Kestrel Core KestrelServer 5
  • C++ fstream 从选定点擦除文件内容

    我需要删除文件内容从选定的点 C fstream 我应该使用哪个函数 我已经写了objects 我需要删除这些objects在文件的中间 C 没有在给定点截断文件的标准机制 您要么必须重新创建该文件 使用以下命令打开ios trunc并写入
  • 正则表达式至少匹配一个字符或一个空格

    我正在使用以下正则表达式来找出检测至少一个字符 b a zA Z0 9 1 现在我还需要探测空间 我怎样才能做到这一点 您可以使用以下方法检测正则表达式中的空格 s 该标记将捕获字符串中的任何空格 在您的正则表达式中 您可以包含此标记 s括
  • 会话/实体管理器已关闭

    我有这个 Hibernate dao 在我的本地机器上测试时它运行良好 但对于某些交易它会抛出IllegalStateException 我相信这是因为多个用户同时点击它 我可能是错的 更新支付道 Repository public cla
  • 修改PIN中的申请指令

    我正在使用英特尔 PIN 来修改我的应用程序中的指令 我使用此链接中的 Safecopy 示例作为参考 https software intel com sites landingpage pintool docs 81205 Pin ht
  • Prolog列表有未实例化的尾部,需要去掉它

    我正在开发 Prolog 程序 它产生正确的输出 一个列表 但该列表末尾有一个未实例化的变量 我做错了事 并且不知道如何摆脱它 这是代码 plaatsingen plaatsingen Prod Hoev Rest Order Plaats
  • 使用 awk sed 解析更新 puppet 文件

    我有一个包含多行代码的木偶文件 其中有一个部分如下所示 defaultrepo myrepo defaultbranch mybranch gitmod pullstuff othergitcode gitcommit gt b54123b
  • 为什么 C++20 中 unique_ptr 不是 equal_comparable_with nullptr_t ?

    使用 C 20concept我注意到std unique ptr似乎无法满足std equality comparable with
  • 转置 data.table

    数据计算结束后有效转换 data table 的好方法是什么 nrow 500e3 ncol 2000 m lt matrix rnorm nrow ncol nrow nrow colnames m lt c foo seq ncol 1
  • 还原并反应不需要的效果

    大家好 我正在尝试使用 redux 来制作购物车功能 2 问题描述 问题是 一旦我想从我的购物篮中删除不是最后一个的产品 Redux 确实从商店中删除了所需的产品 但在前端我仍然可以看到该产品 并且 React 会从列表中删除最后一个产品
  • 用于语义相似性的 BERT 嵌入

    我之前发布过这个question https stackoverflow com questions 60767089 bert get sentence level embedding after fine tuning 我想获得与此类似
  • 为什么要使用 Mockito? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我是 Mockito 的新手 我已经开始学习它了 但我有一些问题 为什么我们需要使用 Mockito 据我所知 它用于模拟 创建虚拟对
  • 我可以指望这个 ASP.NET 事件日志源始终被注册吗?

    未处理的异常导致基于 ASP NET 的应用程序在 NET Framework 2 0 中意外退出 http support microsoft com id 911816让我认为使用以下约定命名的事件日志源将始终在安装了 NET Fram
  • Spring 与 Spring Boot 集成 SFTP 示例

    我们正在为 Spring 应用程序使用最新的 Spring Boot 并为 SFTP 使用最新的 Spring Integration 我访问过 Spring Integration SFTP 文档站点 并按原样采用了 Spring Boo