ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

java – Guava EventBus:如何从事件处理程序返回结果

2019-07-23 11:11:06  阅读:930  来源: 互联网

标签:java events event-handling guava


我有一个Web服务,它从另一个系统接收xml事件,使用特定的工作流程处理它们,并将一个潜在错误列表作为HTTP响应发回.

事件处理工作流由几个处理程序组成(比方说:预处理程序,Persister和Validator),使用Guava’s EventBus实现.处理程序相互发送事件.像这样的东西:

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响应?

我考虑两个选择:

>将errors对象设置为初始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无状态服务(singleton),所以我想避免在类字段中保存任何数据.

欣赏任何想法.

解决方法:

如果你想要这样的工作流程,你不应该使用Guava EventBus. EventBus专门用于允许事件发布给订阅者,而事件海报不知道或关心这些订阅者是什么……因此,您无法将结果返回给订阅者的活动海报.

听起来像你应该在这里做一些更简单的事情,比如注入你的预处理器,persister和验证器并直接调用它们的方法.

标签:java,events,event-handling,guava
来源: https://codeday.me/bug/20190723/1513123.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有