JSch线上出现com.jcraft.jsch.JSchException: channel is not opened.问题分析
文章目录
- JSch线上出现com.jcraft.jsch.JSchException: channel is not opened.问题分析
- 1. 背景
- 1.系统使用jsch这个框架做文件发送以及远程命令执行的操作,系统一直运行正常,直到某一个环境发现
- 2.分析
- 1.bug堆栈,具体问题
1. 背景
1.系统使用jsch这个框架做文件发送以及远程命令执行的操作,系统一直运行正常,直到某一个环境发现
com.jcraft.jsch.JSchException: channel is not opened.
at com.jcraft.jsch.Channel.sendChannelOpen(Channel.java:768)
at com.jcraft.jsch.Channel.connect(Channel.java:151)
at com.jcraft.jsch.Channel.connect(Channel.java:145)
at com.SeTest.executeShell(SeTest.java:134)
at com.SeTest$1.run(SeTest.java:31)
at java.util.concurrent.CompletableFuture$AsyncRun.run(CompletableFuture.java:1626)
at java.util.concurrent.CompletableFuture$AsyncRun.exec(CompletableFuture.java:1618)
at java.util.concurrent.ForkJoinTask.doExec(ForkJoinTask.java:289)
at java.util.concurrent.ForkJoinPool$WorkQueue.runTask(ForkJoinPool.java:1056)
at java.util.concurrent.ForkJoinPool.runWorker(ForkJoinPool.java:1692)
at java.util.concurrent.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:157)
2.分析
因为出现比较少,初步觉得是网络波动导致,但是在系统繁忙的时候频繁出现,此处写了个demo具体分析一下
1.bug堆栈,具体问题
SSH_MSG_CHANNEL_OPEN_FAILURE
ssh通道打开失败
关于channel,首先要了解
在SSH协议的会话(session)中,channel是一个用于在客户端和服务器之间建立通信通道的概念。Channel的主要目的是在SSH连接中提供一种安全、加密和可靠的数据传输机制。
通道的创建:当一个SSH会话建立时,可以创建多个channel。Channel是逻辑上的概念,用于在客户端和服务器之间传输数据。每个channel都有一个唯一的ID标识符。
追踪channel的创建过程,确实是这样,框架中也是这样保存的
jsch会维护一个channel的连接池
篇幅太长,看原文吧
原文地址