Guava EventBus: как вернуть результат из обработчика событийJAVA

Программисты JAVA общаются здесь
Ответить Пред. темаСлед. тема
Anonymous
 Guava EventBus: как вернуть результат из обработчика событий

Сообщение Anonymous »

У меня есть веб-служба, которая получает события XML из другой системы, обрабатывает их с использованием определенного рабочего процесса и отправляет список потенциальных ошибок обратно в качестве ответа HTTP.
Рабочий процесс обработки событий состоит из нескольких обработчики (скажем, Preprocessor, Persister и Validator), реализованные с использованием EventBus Guava. Обработчики отправляют события друг другу. Примерно так:

Код: Выделить всё

public class RequestHandler {

@RequestMapping
public Errors handleRequest(String xmlData) {
eventBus.post(new XmlReceivedEvent(xmlData));
...
return errors; // how to get errors object from the last handler in chain ?
}
}

public class Preprocessor {

@Subscribe
public void onXmlReceived(XmlReceivedEvent event) {
// do some pre-processing
...
eventBus.post(new PreprocessingCompleteEvent(preprocessingResult));
}
}

public class Persister {

@Subscribe
public void onPreprocessingComplete(PreprocessingCompleteEvent event) {
// do some persistence stuff
...
eventBus.post(new PersistenceCompleteEvent(persistenceResult));
}
}

public class Validator {

@Subscribe
public void onPersistenceComplete(PersistenceCompleteEvent event) {
// do validation
...
eventBus.post(new ValidationCompleteEvent(errors)); // errors object created, should be returned back to the RequestHandler
}
}
Проблема в следующем: как вернуть результат обработки глубоко из обработчика Validator обратно в исходную точку (RequestHandler< /em>), чтобы пользователь мог получать ответ HTTP?
Я рассматриваю два варианта:
  • Установить ошибки объекта исходного XmlReceivedEvent и получения его после обработки. завершено:

    Код: Выделить всё

    public class RequestHandler {
    
    @RequestMapping
    public Errors handleRequest(String xmlData) {
    XmlReceivedEvent event = new XmlReceivedEvent(xmlData);
    eventBus.post(event);
    ...
    return event.getErrors();
    }
    }
    
Однако в этом случае мне придется передавать объект ошибок каждому событию в цепочке, чтобы сделать его доступным для Валидатор, чтобы заполнить его реальными данными.
  • Подпишитесь на RequestHandler в ValidationCompleteEvent из Валидатор с заполненным объектом ошибок внутри.

    Код: Выделить всё

    public class RequestHandler {
    
    private Errors errors;
    
    @RequestMapping
    public Errors handleRequest(String xmlData) {
    XmlReceivedEvent event = new XmlReceivedEvent(xmlData);
    eventBus.post(event);
    ...
    return this.errors; // ???
    }
    
    @Subscribe
    public void onValidationComplete(ValidationCompleteEvent event) {
    this.errors = event.getErrors();
    }
    }
    
Но, к сожалению, RequestHandler — это служба Spring без сохранения состояния (одиночная), поэтому я хотелось бы избежать сохранения каких-либо данных в полях класса.
Примем любые идеи.

Подробнее здесь: https://stackoverflow.com/questions/103 ... nt-handler
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «JAVA»