我在这里遇到设计问题。我有一个用jersey实现的RESTful Web服务。我也使用春季邮件发送电子邮件。
我的规范需要通知某个用户组(约15-20)已发出PUT请求,并通过修改资源通知他们。此外,我需要将JSON数组发送给作为响应发出请求的客户端。
现在我所做的是在我处理PUT服务的方法中进行修改后,我向用户发送电子邮件,然后返回JSON状态。
但是为什么客户端应该等待邮件通知完成?如果我的suer列表很长并且客户端等待很长时间才能得到响应怎么办?这不是他的头痛。但我也需要在PUT方法中通知用户。如果我返回JSON,我会丢失上下文,通过从请求响应周期中退出来发送通知。
有更好的方法吗?
要想出一个主意,我提供了我的代码的相关部分:
//first notify users
notifyUsers(event,jsonEntity,NotificationType.TicketType.UPDATED);
//then return response
return new JSONObject()
.put("response_code:", Response.status(Status.OK).build())
.put("title", evento.getDescrizioneevento())
.put("status", getEventAsString(evento.getStatoevento()))
.put("solved", evento.getCausascatenante());
答案 0 :(得分:2)
使“notifyUsers”异步。
排队请求,稍后处理。您可以在单例中使用简单的BlockingQueue,并在另一端使用线程,也可以设置更正式的排队系统,例如JMS。您还可以将请求插入到数据库中,并在那里监听活动。
或者您可以直接在那里启动一个简单的线程,并在您从请求返回时让它运行。这也可以。
具有不同利弊的各种替代方案。
答案 1 :(得分:0)
在我有我的Web服务的类中,我有这个内部类,它将在单独的线程中执行。
class MailExecutorService implements Runnable {
EventiAnomali eventiAnomali;
JSONObject jsonEntity;
NotificationType.TicketType type;
public MailExecutorService(EventiAnomali eventiAnomali,JSONObject jsonEntity,
NotificationType.TicketType type) {
this.eventiAnomali = eventiAnomali;
this.jsonEntity =jsonEntity;
this.type = type;
}
public void run() {
notifyUsers(eventiAnomali,jsonEntity,type); // I've made notifyUser asynchronous
}
}
在我使用的返回之前的@PUT方法中,
executorService.execute(
new MailExecutorService(evento,jsonEntity,
(evento.getStatoevento().equals("5"))? NotificationType.TicketType.CLOSED:
NotificationType.TicketType.UPDATED));
response = MY_JSON
我已将executor.shotDown()
放入finally
块中。然后最后一行是退回的JSON
(响应)
这些都可以吗?更不用说它有效..