CDI 2.0:在一个观察者实例中观察多个事件 [英] CDI 2.0: Observing multiple events in one and the same observer instance

查看:85
本文介绍了CDI 2.0:在一个观察者实例中观察多个事件的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有两个引发两个事件的类(代码来自带有私有内部类的junit测试):

I have two classes that fire two events (code comes from a junit test with private inner classes):

private static class EventEmitter1 { @Inject private Event<EventData1> event; }
private static class EventEmitter2 { @Inject private Event<EventData2> event; }

在我的测试中,EventData类很简单:

In my test EventData classes are trivial:

private class EventData1 { }
private class EventData2 { }

在接收器类中,我想等待直到两个事件都被接收到,所以我尝试了如下操作:

In a receiver class I want to wait until both events have been received, so I tried something like this:

private static class EventReceiver {
    private boolean eventData1Received = false;
    private boolean eventData2Received = false;

    private void receiveEventData1(@Observes EventData1 eventData) {
        LOGGER.debug("received " + eventData.getClass().getName());
        eventData1Received = true;
        handleReceivedEvents();
    }

    private void receiveEventData2(@Observes EventData2 eventData) {
        LOGGER.debug("received " + eventData.getClass().getName());
        eventData2Received = true;
        handleReceivedEvents();
    }

    private void handleReceivedEvents() {
        LOGGER.debug("eventData1Received: " + eventData1Received + ", eventData2Received: " + eventData2Received); 
    }
}

在我的测试方法中,我手动为两个发射器类选择一个实例,并为每个实例触发一个事件.此外,我手动选择一个Receiver实例.

In my test method I manually select an instance for both emitter classes and fire an event for each instance. Moreover I manually select a Receiver instance.

@Test public void receiveEvents() {
    EventReceiver eventReceiver = CDI.current().select(EventReceiver.class).get();

    Instance<EventEmitter1> instanceEventEmitter1 = CDI.current().select(EventEmitter1.class);
    EventEmitter1 eventEmitter1 = instanceEventEmitter1.get();
    EventData1 eventData1 = new EventData1();
    eventEmitter1.event.fire(eventData1);

    Instance<EventEmitter2> instanceEventEmitter2 = CDI.current().select(EventEmitter2.class);
    EventEmitter2 eventEmitter2 = instanceEventEmitter2.get();
    EventData2 eventData2 = new EventData2();
    eventEmitter2.event.fire(eventData2);
}

通过CDI.current.select(...)进行手动选择应确保CDI机制正常工作.

Manual selection via CDI.current.select(...) should make sure the CDI mechanisms work.

我现在的问题是这样三种!EventReceiver实例被初始化.它们都没有将eventDataXReceived字段都设置为true.将事件传递到一个和同一EventReceiver实例的正确方法是什么?理想情况下,EventReceiver不应为(应用程序范围内的)单例.

My problem now is that this way three! EventReceiver instances get initialised. None of them ever has both eventDataXReceived fields set to true. What is the correct way to have the events being delivered to one and the same EventReceiver instance? Ideally EventReceiver should not be an (application scoped) singleton.

感谢您的帮助.

推荐答案

为EventReceiver提供适当的范围.没有作用域,它是@Dependend,因此对于每个事件,都会创建一个新实例.

Give the EventReceiver an appropriate scope. Without a scope it is @Dependend, so for every event a new instance is created.

@ApplicationScoped应该可以正常工作.

@ApplicationScoped should work fine.

这篇关于CDI 2.0:在一个观察者实例中观察多个事件的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆