2

dropwizard では、非同期ジョブを実装し、そのステータスをポーリングする必要があります。リソースには、このための 2 つのエンドポイントがあります。

@Path("/jobs")
@Component
public class MyController {
    @POST
    @Produces(MediaType.APPLICATION_JSON)
    public String startJob(@Valid MyRequest request) {
        return 1111;
    }

    @GET
    @Path("/{jobId}")
    @Produces(MediaType.APPLICATION_JSON)
    public JobStatus getJobStatus(@PathParam("id") String jobId) {
        return JobStatus.READY;
    }
}

仕事を始めるためにクォーツを使用することを検討していますが、1回だけで繰り返しはありません。そして、ステータスを要求すると、トリガー ステータスが取得されます。しかし、スケジュールされていない用途にクォーツを使用するという考えは奇妙に見えます。これに対するより良いアプローチはありますか?もしかしたら、dropwizard 自体がより優れたツールを提供しているのではないでしょうか? アドバイスをいただければ幸いです。

更新: https://github.com/gresrun/jesqueも見ていますが、実行中のジョブのステータスをポーリングする方法が見つかりません。

4

1 に答える 1

7

インターフェイスを使用できManagedます。以下のスニペットでは、ScheduledExecutorServiceジョブを実行するために を使用していますが、必要Quartzに応じて代わりに使用することもできます。ScheduledExecutorServiceよりシンプルで簡単なため、私はで作業することを好みます...

最初のステップは、マネージド サービスを登録することです。

environment.lifecycle().manage(new JobExecutionService());

2番目のステップは、それを書くことです。

/**
 * A wrapper around the   ScheduledExecutorService so all jobs can start when the server starts, and
 * automatically shutdown when the server stops.
 * @author Nasir Rasul {@literal nasir@rasul.ca}
 */
public class JobExecutionService implements Managed {


    private final ScheduledExecutorService service = Executors.newScheduledThreadPool(2);

    @Override
    public void start() throws Exception {
        System.out.println("Starting jobs");
        service.scheduleAtFixedRate(new HelloWorldJob(), 1, 1, TimeUnit.SECONDS);

    }

    @Override
    public void stop() throws Exception {
        System.out.println("Shutting down");
        service.shutdown();
    }
}

そして仕事そのもの

/**
 * A very simple job which just prints the current time in millisecods
 * @author Nasir Rasul {@literal nasir@rasul.ca}
 */
public class HelloWorldJob implements Runnable {
    /**
     * When an object implementing interface <code>Runnable</code> is used
     * to create a thread, starting the thread causes the object's
     * <code>run</code> method to be called in that separately executing
     * thread.
     * <p>
     * The general contract of the method <code>run</code> is that it may
     * take any action whatsoever.
     *
     * @see Thread#run()
     */
    @Override
    public void run() {
        System.out.println(System.currentTimeMillis());
    }
}

以下のコメントで述べたように、 を使用するRunnableと、Thread.getState(). Java で現在実行中のすべてのスレッドのリストを取得するを参照してください。アプリケーションの配線方法によっては、まだいくつかの中間部分が必要になる場合があります。

于 2016-01-08T06:19:54.277 に答える