복붙노트

[SPRING] dropwizard에서 비동기 작업 실행 및 상태 폴링

SPRING

dropwizard에서 비동기 작업 실행 및 상태 폴링

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;
    }
}

나는 일자리를 시작하기 위해 석영을 사용하는 것을 고려하고 있지만 단 한 번만 반복하고 반복하지는 않습니다. 상태를 요청할 때 트리거 상태가 나타납니다. 그러나 일정이 잡히지 않은 사용을 위해 쿼츠를 사용한다는 생각은 이상하게 보입니다. 이것에 대한 더 좋은 접근법이 있습니까? 어쩌면 dropwizard가 더 나은 도구를 제공할까요? 모든 조언을 appriciate 것입니다.

업데이트 : 나는 또한 https://github.com/gresrun/jesque를보고 있지만 실행중인 작업의 상태를 폴링하는 방법을 찾을 수 없습니다.

해결법

  1. ==============================

    1.Managed 인터페이스를 사용할 수 있습니다. 아래의 스 니펫에서는 작업을 실행하기 위해 ScheduledExecutorService를 사용하지만 원하는 경우 Quartz를 대신 사용할 수 있습니다. 나는 더 쉽고 간단하므로 ScheduledExecutorService로 작업하는 것을 선호한다 ...

    Managed 인터페이스를 사용할 수 있습니다. 아래의 스 니펫에서는 작업을 실행하기 위해 ScheduledExecutorService를 사용하지만 원하는 경우 Quartz를 대신 사용할 수 있습니다. 나는 더 쉽고 간단하므로 ScheduledExecutorService로 작업하는 것을 선호한다 ...

    첫 번째 단계는 관리 서비스를 등록하는 것입니다.

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

    두 번째 단계는 그것을 작성하는 것입니다.

    /**
     * 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에서 현재 실행중인 모든 스레드 목록 가져 오기를 참조하십시오. 신청서 작성 방법에 따라 중간 중간 조각이 필요할 수도 있습니다.

  2. from https://stackoverflow.com/questions/34653177/running-async-jobs-in-dropwizard-and-polling-their-status by cc-by-sa and MIT license