当前位置: 首页 > 知识库问答 >
问题:

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

轩辕翰
2023-03-14

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

事件处理工作流由几个使用Guava的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处理程序深度返回到起点(Request estHandler),以便用户接收HTTP响应?

我考虑两种选择:

>

public class RequestHandler {

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

但是,在这种情况下,我必须将错误对象传递给链中的每个事件,以使Validator可以使用真实数据填充它。

>

  • 从Validator订阅Request estHandler到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),所以我希望避免在类字段中保存任何数据。

    欣赏任何想法。

  • 共有1个答案

    郎飞龙
    2023-03-14

    如果您想要这样的工作流,您不应该为此使用GuavaEventBusEventBus专门用于允许将事件发布给订阅者,而事件发帖人不知道或关心这些订阅者是什么...因此,您不能将订阅者的结果返回给事件发帖人。

    在我看来,您应该在这里做一些更简单的事情,比如注入预处理器、持久器和验证器,并直接调用它们的方法。

     类似资料:
    • 我需要从OracleIdtyManager中的自定义后处理事件处理程序调用外部REST API? 如果有人有想法,请在这里发布。

    • 特别是如果信号处理需要调用一个/一些活动,我如何实现? 我试图返回数据或异常,但它不起作用。 无法从信号方法返回数据。抛出异常将阻止工作流执行。

    • 问题内容: 我在Utilities类中使用loadImage方法,并且在通过闭包返回图像时遇到了一些麻烦。基本上因为我的代码可能返回图像或错误,所以在调用该方法时将其分配给image属性是行不通的。 我在类的方法声明中使用的方法是否错误,还是应该以不同的方式调用该方法以预期潜在的不同结果?谢谢 问题答案: 将处理程序添加到您的 loadImage 函数中: 迅捷3 像这样调用func: 斯威夫特2

    • 事件就是用户或浏览器自身执行的某种动作。诸如click、load 和mouseover,都是事件的名字。而响应某个事件的函数就叫做事件处理程序(或事件侦听器)。事件处理程序的名字以"on"开头,因此click 事件的事件处理程序就是onclick,load 事件的事件处理程序就是onload。为事件指定处理程序的方式有好几种。 13.2.1 HTML事件处理程序某个元素支持的每种事件,都可以使用一

    • 我想在JavaFX中制作一个程序,其中包含一个按钮,单击该按钮时,将创建一个圆并将其添加到形状的ArrayList中。以下是我的代码: 我的问题是-如何从内部句柄方法访问“circle1”?在JavaScript中,我们使用e.currentTarget。 我无法声明“Circle1”最终版本,因为我需要在之后更改它。

    • 我正在尝试在javaFx中为特殊需要定制一个快捷方式系统。 这种特殊需求使得不可能使用KeyCombinaison(只限制一个键修饰符是不可接受的)。 我已经做了我适当的KeyCompin联络员系统,现在我想从节点调用一个处理程序(我在控制器之外)。但是我找不到任何优雅的解决方案来执行这个。 有一个按钮声明: 在我想从我的快捷方式代码调用控制器的操作之后。 和标准控制器。 我可以做一些工作,例如使