Dropwizard关机钩

hea*_*ach 6 java shutdown-hook dropwizard

问题是,我停止了Dropwizard应用程序(通过ctrl + c),我在主类中插入了一个Shutdown Hook,以便在关机前做一些事情.但是现在,在我可以做我想做的事情之前,应用程序的ServerConnector已关闭.

有一个轮询服务(轮询我的一个资源),我需要告诉他们,该应用程序将很快停止以防止一些问题.在资源停止之前我需要至少15秒.

有些想法如何解决这个问题?

Nat*_*tan 6

添加一个Dropwizard任务,它将更改您的轮询资源将用于响应的静态字段的状态(或者您想要传递数据).

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));
Run Code Online (Sandbox Code Playgroud)

然后编写一个bash脚本,它将卷曲到任务

curl -X POST http://dw.example.com:8081/tasks/shutdown
Run Code Online (Sandbox Code Playgroud)

和:

  • 这可能不推荐(人们不喜欢System.exit(0))但你可以添加以下执行方法:

Thread.sleep(timeoutSeconds * 1000); System.exit(0)

  • 或者等待并杀死bash脚本中的dropwizard应用程序.

kill -SIGINT <pid>

  • 如果应用程序不是以这种方式停止,会发生什么?然后我有一个大问题,这就是为什么我需要另一种方法:-) (2认同)

小智 5

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

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
    }
}
Run Code Online (Sandbox Code Playgroud)

然后在环境上注册

ManagedObject myManagedObject = new ManagedObject(obj);
environment.lifecycle().manage(myManagedObject);
Run Code Online (Sandbox Code Playgroud)