呼叫球衣服务(PUT)时发送电子邮件通知的设计问题

时间:2011-07-26 20:38:28

标签: java web-services design-patterns jersey

我在这里遇到设计问题。我有一个用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());

2 个答案:

答案 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(响应)

这些都可以吗?更不用说它有效..