Java Dropwizard关闭挂钩

Java Dropwizard关闭挂钩,java,dropwizard,shutdown-hook,Java,Dropwizard,Shutdown Hook,问题是,我停止了Dropwizard应用程序(通过ctrl+c),并在main类中插入了一个关机挂钩,以便在关机之前执行一些操作。但是现在,在我可以做我想做的事情之前,应用程序的ServerConnector已经关闭 有一个轮询服务(轮询我的一个资源),我需要告诉他们,该应用程序将很快停止,以防止出现一些问题。我至少需要15秒,ressource才能关闭 您知道如何解决此问题吗?添加一个可更改静态字段(或您希望以何种方式传递数据)状态的命令,您的轮询资源将使用该命令进行响应 public cla

问题是,我停止了Dropwizard应用程序(通过ctrl+c),并在main类中插入了一个关机挂钩,以便在关机之前执行一些操作。但是现在,在我可以做我想做的事情之前,应用程序的ServerConnector已经关闭

有一个轮询服务(轮询我的一个资源),我需要告诉他们,该应用程序将很快停止,以防止出现一些问题。我至少需要15秒,ressource才能关闭

您知道如何解决此问题吗?

添加一个可更改静态字段(或您希望以何种方式传递数据)状态的命令,您的轮询资源将使用该命令进行响应

public class ShutdownTask extends Task {
    private int timeoutSeconds;

    public ShutdownTask (int timeoutSeconds) {
        super("shutdown");
        this.timeoutSeconds = timeoutSeconds;
    }

      @Override
    public void execute(ImmutableMultimap<String, String> parameters, PrintWriter output) throws Exception {
        // you probably can take the timeout parameter from the request via 'parameters' instead of the constructor.
        PollingResource.shuttingDownIn = timeoutSeconds;
    }
}


environment.admin().addTask(new ShutdownTask(15));
以及:

  • 可能不建议这样做(人们不喜欢
    系统。退出(0)
    ),但您可以添加以下内容以执行方法:
Thread.sleep(timeoutSeconds*1000);
系统退出(0)

  • 或者在bash脚本中执行等待并杀死dropwizard应用程序

kill-SIGINT

您可以使用生命周期挂钩来管理某些资源

public class ManagedObject implements Managed {

    private final Object obj;

    public ManagedObject(Object obj) {
        this.obj = obj;
    }

    @Override
    public void start() throws Exception {
        // Do something to start the object
    }

    @Override
    public void stop() throws Exception {
        // Do something to stop the object
    }
}
然后在环境上注册

ManagedObject myManagedObject = new ManagedObject(obj);
environment.lifecycle().manage(myManagedObject);

是的,我现在就是这样做的,但是服务器管理或linux服务停止命令仍然会以“旧的方式”停止应用程序。Service ressource将立即关闭,我现在不知道如何修复它。是的,因此触发任务的想法是将服务器置于“关闭”状态,以便资源仍然可用。然后在服务器处于此状态时等待n秒,然后停止服务。但是如果按住ctrl+c键,ressource仍在运行,我想确切地防止这种情况:-)这就是为什么不执行
ctrl+c
,您将运行bash脚本,如
/shutdown.sh15
,如果应用程序不是以这种方式停止,会发生什么?然后我有一个大问题,这就是为什么我需要另一种方法:-)
ManagedObject myManagedObject = new ManagedObject(obj);
environment.lifecycle().manage(myManagedObject);