如何使用Jersey进行Async方法调用?

时间:2018-11-12 10:20:38

标签: java asynchronous jersey-2.0 dropwizard

我正在研究dropwizard应用程序。我有一个资源EmployeeResource,它会触发一个邮件api。

@Path("/employee")
public class EmployeeResource {
    @GET
    @Path("/list")
    public void getEmployeeDetails(){
        //DAO call and other stuff

        mailClient.sendMail();
    }
}

现在,sendMail方法将从数据库中获取一些详细信息,然后调用邮件API。我希望方法sendMail不阻止“ / employee / list”请求。有没有一种方法可以使sendMail方法异步?

我查了一下,找到了使API异步的解决方案,但我只希望我的 sendMail 方法是异步的。我该如何解决?

编辑:我不使用Spring 框架,而只是使用Dropwizard 框架。

1 个答案:

答案 0 :(得分:2)

要使方法或任何代码块异步执行,您始终可以通过实现Runnable接口来创建新的线程。对于您的要求如下:

@Path("/employee")
public class EmployeeResource {
    @GET
    @Path("list")
    @Async
    public void getEmployeeDetails(){
        //DAO call and other stuff

        new Thread(new Runnable() {
           public void run() {
              mailClient.sendMail();
           }
        }).start();
    }
}

[edit1]如果您认为发送电子邮件的并发性很高,则可以使用内部有队列的 ExecutorService (您可以详细了解here):

private static final ExecutorService TASK_EXECUTOR = Executors.newCachedThreadPool();

您的呼叫发送邮件方法的部分代码将如下所示:

TASK_EXECUTOR.submit(new Runnable() {
            @Override
            public void run() {
                mailClient.sendMail();
            }
        });

相关问题