проблема дизайна с отправкой уведомления по электронной почте во время вызова службы джерси (PUT) - PullRequest
2 голосов
/ 27 июля 2011

У меня возникла проблема с дизайном.У меня есть веб-сервис RESTful, реализованный с Джерси .Я также использую Spring Mail для отправки электронной почты.

Моя спецификация должна уведомить определенную группу пользователей (приблизительно 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 ]

2 голосов
/ 27 июля 2011

Сделать "notifyUsers" асинхронным.

Поставить в очередь запрос и обработать его позже. Вы можете использовать простую BlockingQueue в одиночном узле с потоком, слушающим другой конец, или вы можете настроить более формальную систему очередей, такую ​​как JMS. Вы также можете вставить запрос в базу данных и прослушать что-нибудь там.

Или вы можете просто запустить простой поток прямо здесь и позволить ему запускаться, когда вы возвращаетесь из запроса. Это тоже может сработать.

Всевозможные альтернативы с разными плюсами и минусами.

0 голосов
/ 27 июля 2011

В классе, где у меня есть веб-сервис, у меня есть этот внутренний класс, который будет выполняться в отдельном потоке.

 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 (ответ)

Все ли в порядке? Не говоря уже о том, что это работает ..

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...