使用 Spring 集成时抛出不同的 JSchException
Different JSchException thrown when using Spring Integration
我不确定我的问题是出在 Spring Integration 还是 JCraft 的 Jsch 上。我在服务器上有一个应用程序,它使用 SFTP 和会话池接收文件并将它们放在另一台服务器上。我经常收到以以下开头的股份跟踪:
java.lang.IllegalStateException: failed to create SFTP Session
Caused by: java.lang.IllegalStateException: failed to create SFTP Session
Caused by: java.lang.IllegalStateException: failed to connect...
并以下列异常之一结束:
Caused by: com.jcraft.jsch.JSchException: session is down
at com.jcraft.jsch.Channel.sendChannelOpen(Channel.java:762)
或
Caused by: com.jcraft.jsch.JSchException: SSH_MSG_DISCONNECT: 11 This session would exceed your concurrent session limit. Please disconnect one or more of your existing sessions and try again.
at com.jcraft.jsch.Session.read(Session.java:996)
at com.jcraft.jsch.UserAuthPublicKey.start(UserAuthPublicKey.java:198)
at com.jcraft.jsch.Session.connect(Session.java:463)
at com.jcraft.jsch.Session.connect(Session.java:183)
at org.springframework.integration.sftp.session.SftpSession.connect(SftpSession.java:263)
或
Caused by: com.jcraft.jsch.JSchException: channel is not opened.
at com.jcraft.jsch.Channel.sendChannelOpen(Channel.java:765)
或
Caused by: com.jcraft.jsch.JSchException: SSH_MSG_DISCONNECT: 2 FlowSshPacketDecoder: received a higher-level packet before first key exchange is done
at com.jcraft.jsch.Session.read(Session.java:996)
at com.jcraft.jsch.Session.connect(Session.java:323)
at com.jcraft.jsch.Session.connect(Session.java:183)
at org.springframework.integration.sftp.session.SftpSession.connect(SftpSession.java:263)
... 45 more
这些异常通常是成群出现的。例如,我可能会在一分钟内连续三四次收到 Session is down。它们有时也是混合的,所以也许我会得到频道未打开且会话已关闭。有时,它可以完美运行而不会抛出异常。
我的豆子:
<bean id="cachingSessionFactory"
class="org.springframework.integration.file.remote.session.CachingSessionFactory">
<constructor-arg ref="sftpSessionFactory" />
</bean>
<bean id="sftpSessionFactory"
class="org.springframework.integration.sftp.session.DefaultSftpSessionFactory">
<constructor-arg name="isSharedSession" value="true"/>
<property name="host" value="${SERVER}" />
<property name="port" value="22" />
<property name="user" value="${USER}" />
<property name="privateKey" value="${KEYPATH}" />
<property name="sessionConfig" ref="props"/>
</bean>
它正在连接的服务器将 maxSessions 设置为 30,连接超时为 6 分钟。过去几天我一直在尝试调试错误,但似乎无法重现它们。
多线程是我遇到的问题。我的应用程序会收到一次推送多个文件的请求(比如 20 个以上)。问题是会话会过时,但现在有 20 多个线程正在尝试创建新会话。它所连接的服务器一次只允许 6 个 sftp 连接。
我的解决方案是通过添加
来防止会话断开
<property name="serverAliveInterval" value="60000" />
给我的豆子。这会阻止连接变得陈旧,缺点是它始终处于连接状态(占用资源)。我想如果我想解决线程问题,我将不得不删除 Spring 并直接使用 Jsch。
我不确定我的问题是出在 Spring Integration 还是 JCraft 的 Jsch 上。我在服务器上有一个应用程序,它使用 SFTP 和会话池接收文件并将它们放在另一台服务器上。我经常收到以以下开头的股份跟踪:
java.lang.IllegalStateException: failed to create SFTP Session
Caused by: java.lang.IllegalStateException: failed to create SFTP Session
Caused by: java.lang.IllegalStateException: failed to connect...
并以下列异常之一结束:
Caused by: com.jcraft.jsch.JSchException: session is down
at com.jcraft.jsch.Channel.sendChannelOpen(Channel.java:762)
或
Caused by: com.jcraft.jsch.JSchException: SSH_MSG_DISCONNECT: 11 This session would exceed your concurrent session limit. Please disconnect one or more of your existing sessions and try again.
at com.jcraft.jsch.Session.read(Session.java:996)
at com.jcraft.jsch.UserAuthPublicKey.start(UserAuthPublicKey.java:198)
at com.jcraft.jsch.Session.connect(Session.java:463)
at com.jcraft.jsch.Session.connect(Session.java:183)
at org.springframework.integration.sftp.session.SftpSession.connect(SftpSession.java:263)
或
Caused by: com.jcraft.jsch.JSchException: channel is not opened.
at com.jcraft.jsch.Channel.sendChannelOpen(Channel.java:765)
或
Caused by: com.jcraft.jsch.JSchException: SSH_MSG_DISCONNECT: 2 FlowSshPacketDecoder: received a higher-level packet before first key exchange is done
at com.jcraft.jsch.Session.read(Session.java:996)
at com.jcraft.jsch.Session.connect(Session.java:323)
at com.jcraft.jsch.Session.connect(Session.java:183)
at org.springframework.integration.sftp.session.SftpSession.connect(SftpSession.java:263)
... 45 more
这些异常通常是成群出现的。例如,我可能会在一分钟内连续三四次收到 Session is down。它们有时也是混合的,所以也许我会得到频道未打开且会话已关闭。有时,它可以完美运行而不会抛出异常。
我的豆子:
<bean id="cachingSessionFactory"
class="org.springframework.integration.file.remote.session.CachingSessionFactory">
<constructor-arg ref="sftpSessionFactory" />
</bean>
<bean id="sftpSessionFactory"
class="org.springframework.integration.sftp.session.DefaultSftpSessionFactory">
<constructor-arg name="isSharedSession" value="true"/>
<property name="host" value="${SERVER}" />
<property name="port" value="22" />
<property name="user" value="${USER}" />
<property name="privateKey" value="${KEYPATH}" />
<property name="sessionConfig" ref="props"/>
</bean>
它正在连接的服务器将 maxSessions 设置为 30,连接超时为 6 分钟。过去几天我一直在尝试调试错误,但似乎无法重现它们。
多线程是我遇到的问题。我的应用程序会收到一次推送多个文件的请求(比如 20 个以上)。问题是会话会过时,但现在有 20 多个线程正在尝试创建新会话。它所连接的服务器一次只允许 6 个 sftp 连接。
我的解决方案是通过添加
来防止会话断开<property name="serverAliveInterval" value="60000" />
给我的豆子。这会阻止连接变得陈旧,缺点是它始终处于连接状态(占用资源)。我想如果我想解决线程问题,我将不得不删除 Spring 并直接使用 Jsch。