gpt4 book ai didi

java - 包含 Consumer 的事件将被忽略

转载 作者:行者123 更新时间:2023-11-30 08:34:10 24 4
gpt4 key购买 nike

我一直在尝试重新制作 Adam Bein 的视频 Going Asynchronous with CompleteableFuture and JavaEE 7 ),本质上它是触发一个包含 Consumer 的事件并在另一个类中观察它。在他使用“LambdaFish”应用程序服务器的视频中,我找不到任何其他对此的引用,所以我尝试使用 WAS Liberty、Glassfish 4 和 Wildfly 运行代码。都产生了相同的结果,即没有观察到消费者事件。我在我的测试用例中尝试了各种其他类,并且都运行良好,只有 Consumer 似乎证明了这个问题。

我还没有找到一种合适的方法来追踪“幕后”发生的事情,我希望追踪一个工作和非工作事件,看看我们“偏离轨道”的地方。

这是一个简单的问题,可以使用以下代码重新创建:-

制作人

import java.util.ArrayList;
import java.util.List;
import java.util.function.Consumer;
import javax.ejb.LocalBean;
import javax.ejb.Stateless;
import javax.enterprise.event.Event;
import javax.inject.Inject;

@Stateless
@LocalBean
public class Producer {
@Inject Event<Consumer<String>> ce;
@Inject Event<List<Object>> oe;

public void produce() {
Consumer<String> c = (x) -> System.out.println(x.toLowerCase());
ArrayList<Object> al = new ArrayList<Object>();
System.out.println("Firing Events");
ce.fire(c);
oe.fire(al);
System.out.println("Events fired");
}
}

观察者

package event.controller;


import java.util.ArrayList;
import java.util.function.Consumer;
import javax.ejb.Singleton;
import javax.ejb.Startup;
import javax.enterprise.event.Observes;

@Singleton
@Startup
public class Observer {

public void onStuff(@Observes Consumer<String> cs) {
System.out.println("consumer event triggered");
cs.accept("Hi There");
}

public void onStuff2(@Observes ArrayList<Object> al) {
System.out.println("ArrayList event triggered");
}
}

这只是我尝试过的众多排列组合中的一种;都没有成功。我还尝试按照本文 Glassfish Tracing with log4j 中的描述设置 Glassfish 跟踪,这篇文章似乎已经过时了。我无法使用插件在 eclipse 下启动 Glassfish,当我尝试定义服务器时出现“内部错误”。

我还使用 =info:JCDI=all:com.ibm.ws.webbeans=all:org.apache.webbeans*=all:org.jboss.weld 尝试了 WAS Liberty CDI 跟踪*=all:com.ibm.ws.cdi*=all:EJBContainer=all:MetaData=all:Injection=all

但在 event.fire() 期间没有触发任何跟踪事件。

我的做法有什么根本性的错误吗?

有没有人设法触发包含消费者的事件并成功观察到它?

有谁知道可以使用任何跟踪工具来确定为什么一种情况有效而另一种情况无效?

提前感谢您提出任何意见和/或建议。

最佳答案

您做对了,但是您偶然发现了 Weld(CDI 引用实现)中的一个已知错误,您在上面命名的所有服务器都使用该错误。我不确定 Open Web Beans(替代 CDI impl)是否对此有更好的解决方案,但您可以查看。

可以找到相关的焊缝跟踪问题here可以找到链接到它的 CDI 规范问题 here .解决这些问题后,您应该能够执行您的代码。

我能想到的唯一“解决方法” 是使用原始类型 观察器。即:

public void onStuff(@Observes Consumer cs) {
System.out.println("consumer event triggered");
cs.accept("Hi There");
}

这个观察者当然更通用,并且会触发任何其他带有 Consumer 有效负载的触发事件,但是您可以在方法内部自由地进行一些额外的检查,以确定您是否真的想触发任何是否采取行动。

关于java - 包含 Consumer 的事件将被忽略,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39005294/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com