com.jcraft.jsch.JSchException: verify: false

article/2025/10/29 8:26:35

背景

高并发下,SFTP上传偶现com.jcraft.jsch.JSchException: verify: false,网上有说升级版本什么的修复了这个bug,然而升级版本后事实证明这个bug还是会出现,大概上传几百次会出现一次。但是项目不可能允许文件丢失,需要百分百的正确率。

SFTP工具类

package util;import com.jcraft.jsch.*;
import org.springframework.util.StringUtils;import java.io.InputStream;
import java.util.*;public class SFTPUtil {private ChannelSftp sftp;private Session session;/*** SFTP 登录用户名*/private String username;/*** SFTP 登录密码*/private String password;/*** SFTP 服务器地址IP地址*/private String host;/*** SFTP 端口*/private int port;/*** 构造基于密码认证的sftp对象*/public SFTPUtil(String username, String password, String host, int port) {this.username = username;this.password = password;this.host = host;this.port = port;}public SFTPUtil() {}/*** 连接sftp服务器*/public void login() {try {JSch jsch = new JSch();session = jsch.getSession(username, host, port);if (password != null) {session.setPassword(password);}Properties config = new Properties();config.put("StrictHostKeyChecking", "no");session.setConfig(config);session.connect();Channel channel = session.openChannel("sftp");channel.connect();sftp = (ChannelSftp) channel;} catch (Exception e) {e.printStackTrace();}}/*** 关闭连接 server*/public void logout() {if (sftp != null) {if (sftp.isConnected()) {sftp.disconnect();}}if (session != null) {if (session.isConnected()) {session.disconnect();}}}/*** 将输入流的数据上传到sftp作为文件。文件完整路径=basePath+directory** @param directory    上传到该目录* @param sftpFileName sftp端文件名* @param is 文件输入流*/public boolean upload(String directory, String sftpFileName, InputStream is){try {if (!StringUtils.isEmpty(directory)) {sftp.cd(directory);}sftp.put(is, sftpFileName);  //上传文件return true;} catch (Exception e) {e.printStackTrace();return false;}}}

测试代码


import util.SFTPUtil;import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.util.UUID;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicInteger;/*** @description:* @author:wanzh* @date:2022/3/29*/
public class TestSFTPUtils {private static ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(128, 128, 5, TimeUnit.SECONDS, new ArrayBlockingQueue<>(500));public static void main(String[] args) throws InterruptedException {testSFTP(500);}private static void testSFTP(int num) throws InterruptedException {long startTime = System.currentTimeMillis();AtomicInteger successNum = new AtomicInteger();CountDownLatch countDownLatch = new CountDownLatch(num);for(int i = 0; i < num; i++){threadPoolExecutor.execute(()->{boolean flag = false;try {File file = new File("D:\\work.jpg");InputStream is = new FileInputStream(file);String directName = "/upload/nvrm/20220107/";SFTPUtil sftpUtil = new SFTPUtil("xxx", "xxx", "xxx", 22);sftpUtil.login();flag = sftpUtil.upload(directName,  UUID.randomUUID()+ ".jpg", is);sftpUtil.logout();}catch (Exception e){e.printStackTrace();}if(flag){successNum.incrementAndGet();}countDownLatch.countDown();});}countDownLatch.await();threadPoolExecutor.shutdown();long endTime = System.currentTimeMillis();System.out.println(String.format("总文件数量:%s,成功传输文件数量:%s,花费时间: %s秒",num,successNum.get(),(endTime - startTime)/1000));}
}

测试效果

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

解决方案

大概思路,首先是上传失败后重试,其次为了提升传输速度,每个线程只登录一次即可,不需要每传输一个文件登录退出。

public class TestSFTPUtils2 {private static ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(128, 128, 5, TimeUnit.SECONDS, new ArrayBlockingQueue<>(500));private static ThreadLocal<SFTPUtil> sftpUtilThreadLocal = new ThreadLocal<>();public static void main(String[] args) throws InterruptedException {testSFTP(500);}private static void testSFTP(int num) throws InterruptedException {long startTime = System.currentTimeMillis();AtomicInteger successNum = new AtomicInteger();CountDownLatch countDownLatch = new CountDownLatch(num);for(int i = 0; i < num; i++){threadPoolExecutor.execute(()->{boolean flag = false;try {File file = new File("D:\\work.jpg");InputStream is = new FileInputStream(file);String directName = "/upload/nvrm/20220107/";flag = upload(  UUID.randomUUID()+ ".jpg", directName,is,1);}catch (Exception e){e.printStackTrace();}if(flag){successNum.incrementAndGet();}countDownLatch.countDown();});}countDownLatch.await();threadPoolExecutor.shutdown();long endTime = System.currentTimeMillis();System.out.println(String.format("总文件数量:%s,成功传输文件数量:%s,花费时间: %s秒",num,successNum.get(),(endTime - startTime)/1000));}/*** 传输文件* @param fileName 文件名* @param directName 目录* @param inputStream 文件流* @param num 传输次数* @return*/public static boolean upload(String fileName, String directName,InputStream inputStream, int num) {if(num > 1){System.out.println(String.format("重新上传,文件名:%s,次数:%s",fileName,num));}SFTPUtil sftpUtil = sftpUtilThreadLocal.get();if(sftpUtil == null){sftpUtil = new SFTPUtil("xxx", "xxx", "xxxx", 22);sftpUtil.login();sftpUtilThreadLocal.set(sftpUtil);}if(num > 3){return false;}boolean upload = sftpUtil.upload(directName, fileName, inputStream);if(upload){return true;}sftpUtil.logout();sftpUtilThreadLocal.remove();sftpUtil = new SFTPUtil("xxx", "xxx", "xxxx", 22);sftpUtil.login();sftpUtilThreadLocal.set(sftpUtil);return upload(fileName,directName,inputStream,num+1);}}

测试效果

在这里插入图片描述
在这里插入图片描述

总结

若文件个数越多,提升速度越明显,项目中解决方案大致如上,这里只是简单模拟测试一下,希望对您有帮助。


http://chatgpt.dhexx.cn/article/m7aTypa0.shtml

相关文章

java jsch jar_使用JSch从Java在远程计算机上执行命令

SSH是任何一种every-day工具Linux系统管理工作。这是访问网络上的远程计算机&#xff0c;传输数据和执行远程命令的一种简单而安全的方法。除了交互模式之外&#xff0c;还有许多工具可以使依赖于现有技术的远程任务实现自动化ssh服务器/客户端架构。对于这样一种工具&#xff…

java jsch执行脚本_JSch远程执行脚本

JSch远程执行脚本 2017-02-24 在自动化测试的时候&#xff0c;需要远程操控服务器做一些操作&#xff0c;比如切日、起服务器、执行某些脚本。如何实现&#xff1f; 我们可以利用JSch&#xff0c;远程执行脚本。JSch是Java Secure Channel的缩写&#xff0c;是一个SSH2功能的纯…

JSch基本使用

欢迎支持笔者新作&#xff1a;《深入理解Kafka:核心设计与实践原理》和《RabbitMQ实战指南》&#xff0c;同时欢迎关注笔者的微信公众号&#xff1a;朱小厮的博客。 欢迎跳转到本文的原文链接&#xff1a;https://honeypps.com/java/jsch-quick-start/ JSch 是SSH2的一个纯Ja…

基于 JSch 实现服务的自定义监控解决方案

一、基于 JSch 实现服务的自定义监控 JSch 是 SSH2 的一个纯 Java 实现。它允许你连接到一个 sshd 服务器&#xff0c;使用端口转发&#xff0c;X11转发&#xff0c;文件传输等等。你可以将它的功能集成到你自己的 程序中。 既然可以通过 SSH 连接到服务器&#xff0c;那就可…

java jsch_java - 使用JSch在远程计算机上执行命令

SSH是访问远程计算机,传输数据和执行远程命令的一种简单而安全的方法。除了基础的交互模式外,还有许多依赖于ssh Client/Server架构的工具可以实现自动化执行远程任务。我们可以找到ssh客户端的许多实现,但是如何从代码编程访问ssh提供的功能呢?本文介绍JAVA语言中使用ssh功…

使用JSCH连接Linux系统并执行命令

一、关于JSCH技术的简单描述 JSCH是SSH的一个纯Java实现。说直白点&#xff0c;就是一个远程连接你其他Linux或者Unix服务器的一个java代码包。其实就是我们使用jsch这个jar包来方便我们编写代码来连接自己linux系统的。 SSH&#xff1a;是目前较可靠&#xff0c;专为远程登录…

【实用技巧篇】JSch使用介绍,实用JSch实现文件传输

文章目录 JSch使用介绍1. jar包下载2. 引入依赖3. 代码实现4. 验证 JSch使用介绍 JSch 是SSH2的一个纯Java实现。它允许你连接到一个sshd 服务器&#xff0c;使用端口转发&#xff0c;X11转发&#xff0c;文件传输等等。你可以将它的功能集成到你自己的程序中。 1. jar包下载…

Jsch网络工具包的使用及源码简析

一、背景 最近&#xff0c;导师安排了些看论文文献并整理论文至文件服务器的工作&#xff0c;在实验的过程中&#xff0c;我们知道常见的上传文件至服务器有以下方式。 ftp/sftp协议进行上传ssh连接&#xff0c;并通过scp命令进行上传通过xftp、xshell、ftplina等图形化工具上…

JSch学习笔记

JSch笔记 第 1 章 JSch简介 1.1 简述 1&#xff09;jsch是ssh2的一个纯Java实现。它允许你连接到一个sshd服务器&#xff0c;使用端口转发、X11转发、文件传输等。 2&#xff09;SSH 是较可靠&#xff0c;专为远程登录会话和其他网络服务提供安全性的协议。 3&#xff09;…

OrmLite For Android 学习笔记 之一 Ormlite 介绍及使用

Android 自带的数据库是SQLite&#xff0c;这种数据库适合用于于小型设备中。在实际使用数据库的应用中&#xff0c;我们经常需要把数据库记录转换为 业务对象实体。在桌面应用或者web应用中我们有很多成熟的ORM工具。Android本身没有提供这么一种工具。 Ormlite 是一种ORM工具…

OrmLite 数据库使用大全

本文介绍OrmLite的数据库表的使用以及在项目中选择他的原因。 1. 选用 OrmLite 数据库的原因 目前用的最多的就是GreenDAO 和 OrmLite 了&#xff0c;两者各有优缺点。 GreenDAO 性能高&#xff0c;号称Android最快的关系型数据库&#xff1b;内存占用较小&#xff1b;支持数…

Android ORM数据库之OrmLite使用框架及源码分析

一、简介 OrmLite是一个数据库框架&#xff0c;这个可以让我们快速实现数据库操作&#xff0c;避免频繁手写sql&#xff0c;提高我们的开发效率&#xff0c;减少出错的机率。  首先可以去它的官网看看www.ormlite.com&#xff0c;它的英文全称是Object Relational Mapping&am…

ORMLite完全解析(一)通过实例理解使用流程

在android中使用原始的SQLiteOpenHelper操作数据库显得过于繁琐&#xff0c;而且对于不是很熟悉数据库操作的人来说比较容易出现一些隐藏的漏洞。所以一般都会想到使用相关的ORMLite框架完成开发&#xff0c;类似于J2EE开发中的Hibernate和Mybatis等等&#xff0c;在提高开发效…

Android数据库ORMlite框架

前言 由于第二章是整个文档的核心&#xff0c;内容也很多&#xff0c;所以分次翻译。下一章的内容会继续本章接着翻译。 ------------------------------------------------------------------------------------- 2 如何使用 这一章进入到更多详细地使用ORMLite的各种功能。 2…

Ormlite 介绍 一

概述 ORMlite是类似hibernate的对象映射框架,主要面向java语言,同时,是时下最流行的android面向数据库的的编程工具。 官方网站:http://ormlite.com/ 如果需要开发android,只需要下载core和android两个jar包: ORMlite的使用 1,建立映射关系 Ormlite与数据库…

ormlite介绍一

概述 ORMlite是类似hibernate的对象映射框架&#xff0c;主要面向java语言&#xff0c;同时&#xff0c;是时下最流行的android面向数据库的的编程工具。 官方网站&#xff1a;http://ormlite.com/ 如果需要开发android&#xff0c;只需要下载core和android两个jar包&#xff…

Lite-Orm数据库

1. 初步认识 GItHub库 自动化且比系统自带数据库操作快1倍&#xff01; LiteOrm是android上的一款数据库&#xff08;ORM&#xff09;框架库。速度快、体积小、性能高。开发者基本一行代码实现数据库的增删改查操作&#xff0c;以及实体关系的持久化和自动映射。 2.导入orm相…

Android 数据库框架ormlite 使用精要

Android 数据库框架ormlite 使用精要 前言 本篇博客记录一下笔者在实际开发中使用到的一个数据库框架&#xff0c;这个可以让我们快速实现数据库操作&#xff0c;避免频繁手写sql&#xff0c;提高我们的开发效率&#xff0c;减少出错的机率。 ormlite是什么&#xff1f; 首…

ormlite 的简单应用

在android开发中还有哪些技术可以方便的操作数据库&#xff0c;我不大清楚&#xff0c;今天学习了一下 ormlite&#xff0c;觉得还不错&#xff0c;非常方便。 ormlite官网下载&#xff1a;http://ormlite.com/releases/ 1、引入jar包 2、写实体类 package com.example.aandr…

OrmLite for android--Ormlite的大概介绍

Ormlite 是一种ORM工具&#xff0c;并且是一种轻量级别的工具。我们可以使用它来对Android中内嵌的sqlite数据库进行相关的操作。Android 的应用程序应使用 Ormlite for android 版本来进行相关的开发。Ormlite for android 提供两个jar库&#xff1a;ormlite-android-4.22.j…