我在寻找一个很好的方式运行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一个更好的,因为作为一部分的重新启动您的罐子可能想要做其他事情以及(清除/重新启动其他资源,记录的事实,它被关闭,这样的东西)。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top