[英]Guava EventBus: How to return result from event handler
我有一個Web服務,該服務從另一個系統接收xml事件,使用特定的工作流程處理它們,並將潛在錯誤列表作為HTTP響應發送回去。
事件處理工作流由使用Guava的EventBus實現的多個處理程序(例如: Preprocessor , Persister和Validator ) 組成 。 處理程序將事件彼此發送。 像這樣:
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響應?
我考慮兩種選擇:
將錯誤對象設置為初始XmlReceivedEvent,並在處理完成后檢索它:
public class RequestHandler { @RequestMapping public Errors handleRequest(String xmlData) { XmlReceivedEvent event = new XmlReceivedEvent(xmlData); eventBus.post(event); ... return event.getErrors(); } }
但是,在那種情況下,我將必須將錯誤對象傳遞給鏈中的每個事件,以使Validator可以使用真實數據填充它。
從內部將已填充錯誤的對象從Validator訂閱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無狀態服務(單例),因此我想避免在類字段中保存任何數據。
欣賞任何想法。
如果您想要這樣的工作流程,則不應EventBus
使用Guava EventBus
。 EventBus
專門用於在事件發布者不知道或EventBus
這些訂閱者是什么的情況下將事件發布給訂閱者...這樣,您無法將結果返回給訂閱者的事件發布者。
在我看來,您應該在這里做一些更簡單的事情,例如注入預處理器,持久化器和驗證器,然后直接調用其方法。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.