我正在编写一个SshConnectionPool,它存储并返回SshConnections。这个想法是用户应该做这样的事情:
SshConnection sc = SshPool.getInstance().getConnection(server, user, password, port);
// use connection in some way
SshPool.getInstance().release(sc);
之后我希望sc
引用无法使用。我知道在release()
方法的实现中我无法将其设置为null。但是我该怎么做呢?
答案 0 :(得分:2)
不知道你将如何“重用”SshConnection
个对象,但无论如何,我的建议是你:
SshPool
本身; SshConnection
对象工具Closeable
,并在.close()
中将对象返回池中。如:
private final SshPool pool;
SshConnection(final SshPool pool, other parameters)
{
this.pool = pool;
// etc
}
@Override
public void close()
throws IOException
{
pool.release(this);
// other instructions here
}
这意味着您可以在try-with-resources语句中使用这些对象;并且对API用户的唯一要求是他们.close()
一旦使用,他们应该为任何Closeable
对象做任何事情。
答案 1 :(得分:0)
答案 2 :(得分:0)
对于那些将来会跟随我的脚步的勇者:
我最终做的是:我将SshSession
声明为接口,并创建了3个实现:真实/实时/工作会话(RealSession
),它具有所有功能,变量设置实际值和方法做实际工作(例如exec(String command)
将在远程机器上执行命令),虚拟会话(DummySession
)具有所有ivars,但在"做&时会抛出异常#34;调用方法(例如,它在ssh.hostname()
上返回实际主机名,但在ssh.exec(command)
上抛出异常,并在其中具有SshSession
实现的会话包装器以及其中的所有方法session wrapper调用包装会话上的相应方法。
SshPool
会在其中存储RealSession
s的地图,但会返回SessionWrapper
并包含RealSession
。因此,在池外,您只能处理SessionWrapper
s。因此,当您调用pool.release(sessionwrapper)
时,池会将包装器中的会话返回到池中,并将DummySession
放入包装器中。这样你仍然可以访问有关会话的信息(例如主机,用户等),但不能调用任何方法。
我知道一些代码不会出错,但我希望描述很清楚。