将Jsch放入连接池中的详细信息

时间:2013-10-31 16:34:39

标签: java multithreading spring jsch apache-commons-pool

我将Jsch置于公共池(带有弹簧池支持)并取得初步成功

http://docs.spring.io/spring/docs/3.2.4.RELEASE/spring-framework-reference/htmlsingle/#aop-ts-pool

然而:

  1. 我们应该在会话中汇集频道而不是汇集会话吗?每个Jsch会话创建一个线程。池化Jsch会话将创建x个线程。汇集渠道,实际上只有一个Jsch线程。

  2. (commons-pool)如果Jsch会话过时会发生什么?如何在commons-pool的上下文中重新生成会话或使用spring pool支持?如何检测它是否陈旧?

  3. 由于

2 个答案:

答案 0 :(得分:5)

弄清楚我自己的问题。我将在第二天或第二天分享我的项目。

  1. 合并渠道更有效。实际上不需要创建多个会话(如果会话连接到同一个sftp端点)。

  2. 我实现了一个带有spring pool和commons-pool的JSch连接池(池化通道)。我将在第二天或第二天发布到github。最重要的问题是,如果连接失效会怎样。

  3. 我发现基于我的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)

很抱歉花了一段时间......我绝不会忽略这一点的重要性。

Da da ...介绍

https://bitbucket.org/adubflow/sftpconnectionpool/wiki/Home

期待您的意见和建议,以便我改进。

此致

相关问题