簡體   English   中英

Guava EventBus:如何從事件處理程序返回結果

[英]Guava EventBus: How to return result from event handler

我有一個Web服務,該服務從另一個系統接收xml事件,使用特定的工作流程處理它們,並將潛在錯誤列表作為HTTP響應發送回去。

事件處理工作流由使用Guava的EventBus實現的多個處理程序(例如: PreprocessorPersisterValidator組成 處理程序將事件彼此發送。 像這樣:

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 ),以便用戶可以接收HTTP響應?

我考慮兩種選擇:

  1. 將錯誤對象設置為初始XmlReceivedEvent,並在處理完成后檢索它:

     public class RequestHandler { @RequestMapping public Errors handleRequest(String xmlData) { XmlReceivedEvent event = new XmlReceivedEvent(xmlData); eventBus.post(event); ... return event.getErrors(); } } 

但是,在那種情況下,我將必須將錯誤對象傳遞給鏈中的每個事件,以使Validator可以使用真實數據填充它。

  1. 從內部將已填充錯誤的對象從Validator訂閱RequestHandlerValidationCompleteEvent

     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無狀態服務(單例),因此我想避免在類字段中保存任何數據。

欣賞任何想法。

如果您想要這樣的工作流程,則不應EventBus使用Guava EventBus EventBus專門用於在事件發布者不知道或EventBus這些訂閱者是什么的情況下將事件發布給訂閱者...這樣,您無法將結果返回給訂閱者的事件發布者。

在我看來,您應該在這里做一些更簡單的事情,例如注入預處理器,持久化器和驗證器,然后直接調用其方法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM