SFTP默认会话工厂或SFTP普通连接,可将文件上传到多个远程服务器

时间:2018-08-28 04:08:36

标签: java spring spring-boot ssh spring-integration-sftp

我确实根据客户在我们的应用程序中配置了多个远程服务器。

当该特定客户的报告准备就绪时,我应该连接到该特定客户的远程服务器,并上传报告文件。

我面前有两个选择 a)使用Spring的默认会话工厂(为每个文件上传获取会话工厂)

    public SessionFactory<LsEntry> sftpSessionFactory() {
        DefaultSftpSessionFactory factory = new DefaultSftpSessionFactory(true);
        factory.setHost(sftpHost);
        factory.setPort(sftpPort);
        factory.setUser(sftpUser);
        if (sftpPrivateKey != null) {
            factory.setPrivateKey(sftpPrivateKey);
            factory.setPrivateKeyPassphrase(sftpPrivateKeyPassphrase);
        } else {
            factory.setPassword(sftpPasword);
        }
        factory.setAllowUnknownKeys(true);
        return factory;
    }

    @Bean
    @ServiceActivator(inputChannel = "toSftpChannel")
    public MessageHandler handler() {
        SftpMessageHandler handler = new SftpMessageHandler(sftpSessionFactory());
        handler.setRemoteDirectoryExpression(new LiteralExpression(sftpRemoteDirectory));
        handler.setFileNameGenerator(new FileNameGenerator() {
            @Override
            public String generateFileName(Message<?> message) {
                if (message.getPayload() instanceof File) {
                    return ((File) message.getPayload()).getName();
                } else {
                    throw new IllegalArgumentException("File expected as payload.");
                }
            }
        });
        return handler;
    }

b)使用普通的sftp连接

 try {
        JSch jsch = new JSch();
        Session session = jsch.getSession("sftpuser", "sftphost");
        session.setPassword("sftppassword");
        java.util.Properties config = new java.util.Properties();
        config.put("StrictHostKeyChecking", "no");
        config.put("PreferredAuthentications",
                "publickey,keyboard-interactive,password");

        session.setConfig(config);
        session.connect();
        Channel channel = session.openChannel("sftp");
        channel.connect();
        System.out.println("sftp channel opened and connected.");
        ChannelSftp channelSftp = (ChannelSftp) channel;

在该用例中哪个更合适?

1 个答案:

答案 0 :(得分:0)

第二个选项由第一个选项使用。因此,如果您使用的是Spring框架,请使用第一个选项。如果您不使用弹簧,请使用第二个选项。

使用Spring,您可以在用例中使用一些工具。