2014-12-09 3 views
0

Я реализую веб-службу RESTfull с Java, которая должна вычислять каждый вызов надежным способом, даже если системы аварийно завершатся. После потенциального сбоя система должна иметь возможность находить все задания, которые были открыты в момент сбоя системы, и приступить к вычислению, в котором система разбилась.Лучший способ сохранить входящие вызовы REST для надежных сбоев системы управления

Каков наилучший способ достижения этой задачи? Является ли JMS правильным направлением?

+0

Не могли бы вы рассказать нам больше о рабочих местах? – mkrakhin

+0

JMS будет заменой для вызовов RESTful - это другой метод межпроцессного общения. Это не то, что вам нужно. Вероятно, что вызвало ваше упоминание об этом, потому что JMS поддерживает постоянство сообщений для восстановления отказа - и именно это вы на самом деле после; сделать что-то подобное в среде RESTful. Верный? – Gimby

+1

Служба RESTful использует протокол HTTP в качестве протокола связи. Это протокол без учета состояния: нет понятия * открытого задания *. Ваш вопрос не имеет смысла. – Raedwald

ответ

0

Вы можете попробовать использовать RestEasy.

В RestEasy вы можете связать обработчик до и после вызова REST.

Вы можете хранить вызов REST перед обработчиком и подтвердить выполнение после его завершения.

Если REST не был выполнен ... его можно повторить, или это действие повторяется.

Код будет выглядеть примерно так (REQUEST):

@Provider 
public class RestInterceptor implements ContainerRequestFilter { 

    @Override 
    public void filter(ContainerRequestContext context) { 

(RESPONSE)

@Provider 
public class EventFilter implements ContainerResponseFilter { 

    @Override 
    public void filter(ContainerRequestContext containerRequestContext, ContainerResponseContext containerResponseContext) throws IOException { 

Возникает вопрос, почему?

REST вызовы должны быть простыми атомными задачами, выполняемыми менее чем за 30 секунд. Плюс они должны быть (если возможно) идемпотентными.

Если вы хотите запускать и отслеживать длительные задачи с помощью REST-вызовов, тогда это путь. Но сама работа должна быть отделена и контролироваться на каком-то другом уровне (а не в стеке HTTP).

+0

Интерфейс REST является атомарным. Я хочу сохранить вызов за интерфейсом REST, чтобы обеспечить правильное вычисление за интерфейсом REST, которое запускается из интерфейса REST. – hans

+0

Тогда, вероятно, лучше всего перефразировать ваш вопрос. Я не думаю, что интерфейс REST - это подходящее место для контроля за выполнением вами. – Drejc