我将Jsch置于公共池(带有弹簧池支持)并取得初步成功
http://docs.spring.io/spring/docs/3.2.4.RELEASE/spring-framework-reference/htmlsingle/#aop-ts-pool
然而:
我们应该在会话中汇集频道而不是汇集会话吗?每个Jsch会话创建一个线程。池化Jsch会话将创建x个线程。汇集渠道,实际上只有一个Jsch线程。
(commons-pool)如果Jsch会话过时会发生什么?如何在commons-pool的上下文中重新生成会话或使用spring pool支持?如何检测它是否陈旧?
由于
答案 0 :(得分:5)
弄清楚我自己的问题。我将在第二天或第二天分享我的项目。
合并渠道更有效。实际上不需要创建多个会话(如果会话连接到同一个sftp端点)。
我实现了一个带有spring pool和commons-pool的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),第二组应用程序线程将成功完成操作,因为已断开连接已恢复。
答案 1 :(得分:1)
很抱歉花了一段时间......我绝不会忽略这一点的重要性。
https://bitbucket.org/adubflow/sftpconnectionpool/wiki/Home
期待您的意见和建议,以便我改进。
此致