题
我在寻找一个很好的方式运行Apache德比在服务器网络的模式。我使用的NetworkServerControl到启动服务器,以及它的伟大的工作。
我开始服务器像这样:
/**
* starts the network server
* @return true if sucessfull
*/
public boolean start()
{
try
{
// just to be sure that we don't start two servers
this.stop();
server = new NetworkServerControl();
server.start( null );
return true;
}
catch ( Exception ex )
{
this.logLogger.debug( ex );
return false;
}
}
并停止它这样的:
/**
* stops the server
*
* @return true if there were no problems stopping the server
*/
public boolean stop()
{
try
{
if ( server == null )
{
server = new NetworkServerControl();
}
server.shutdown();
return true;
}
catch ( Exception ex )
{
this.logLogger.debug( ex );
return false;
}
}
在主要()我有这个这样的进程不会死在服务器运行时
(...)
clsDB.start();
while( clsDB.testForConnection() )
{
Thread.sleep( 60000 );
}
testForConnection()看起来是这样的:
/**
* Try to test for a connection
*
* @return true if the server is alive
*/
public boolean testForConnection()
{
try
{
server.ping();
return true;
}
catch ( Exception ex )
{
this.logLogger.debug( ex );
return false;
}
}
我的问题是,当一个新的实例我的罐子里被称为古人会仍在运行(除非我真的真的很幸运和测试之前作出的新的服务器开始)。
我知道我可能只是测试,如果该服务器已经运行,然后我不会再次开始,但是我希望的开始工作就像一个重新启动,如果服务器已经存在。
解决方案 3
我们最终使用了一个在服务器被杀死时创建的文件,然后在服务器进程中我们定期检查文件是否存在,如果它存在,我们就会杀死服务器。
其他提示
我之前用derby做了一个项目(包括在网络模式下运行),我似乎记得你可以在服务器上执行一些关闭derby的SQL。
所以,假设情况就是这样(没时间谷歌为它抱歉)你可以在启动时查找你的网络实例。如果存在,请在其上运行此SQL。一旦你确定它最终被关闭(我认为轮询它存在),你就可以再次启动它。
编辑:哦,它不是SQL,它以'shutdown = true'作为参数连接到数据库。请参阅此处:
DriverManager.getConnection(
"jdbc:derby:sample;shutdown=true");
其他解决方案,我提出了不与你的罐子,你不可以享受。
一种替代方法是要有你的罐子启动德比例open a TCP port,它监测在启动时德比。然后你可以送你自己的关闭命令,从你的新罐的实例(显然之前开放自己的TCP port)。
启动的一个实例,德比你的罐子将是:
- 看看如果同意后,TCP端口是开放的。
- 如果是这样,发送的关闭命令。
- 罐子发送该命令将关闭德比使用
stop()
法。 - 一旦完成关德比,下来它会发送一个
success
什么回和关闭连接。
- 罐子发送该命令将关闭德比使用
- 我们听取在商定的TCP port。
- 我们呼
start()
并启动德比。
这是更多的工作比我的其他解决方案,但是theorectically一个更好的,因为作为一部分的重新启动您的罐子可能想要做其他事情以及(清除/重新启动其他资源,记录的事实,它被关闭,这样的东西)。