我把Jsch放入了公共池(带有弹簧池支持)并取得了初步成功
然而:
>我们应该在会话中汇集频道而不是汇集会话吗?每个Jsch会话创建一个线程.池化Jsch会话将创建x个线程.汇集渠道,实际上只有一个Jsch线程.
>(commons-pool)如果Jsch会话变得陈旧会发生什么?如何在commons-pool的上下文中重新生成会话或使用spring pool支持?如何检测它是否陈旧?
谢谢
解决方法:
弄清楚我自己的问题.我将在第二天或第二天分享我的项目.
>汇集渠道更有效.实际上不需要创建多个会话(如果会话连接到同一个sftp端点).
>我实现了一个带弹簧池和公共池的JSch连接池(池化通道).我将在第二天或第二天发布到github.最重要的问题是,如果连接失效会怎样.
我发现基于我的1个Session的实现 – 多个通道,如果连接过时,池化对象(在这种情况下,通道)将是陈旧的.池化对象应该无效并从池中删除.当连接恢复时,当新的应用程序线程从池中“借用”时,将创建新的池对象.
为了验证我的观察,我的不那么自动化的测试:
a)创建一组(例如10个)app线程,从池中检出信道资源.
b)让线程睡20秒
c)创建另一组应用程序线程,从池中检出通道资源.
在a),当i == 7时设置断点,通过“iptable drop(linux)或pfctl -e; pfctl -f /etc/pf.conf(mac,google how to do!)”来断开连接.第一组应用程序线程将因为通道中断而异常.
在b),重新启动连接
在c),第二组应用程序线程将成功完成操作,因为已断开连接已恢复.
标签:java,multithreading,spring,jsch,apache-commons-pool
来源: https://codeday.me/bug/20190517/1121132.html