【发布时间】:2015-06-11 21:21:15
【问题描述】:
我有两个 SLSB:
-
BeanF, -
BeanO
在两个 ejb-jars 中:
-
ModF, -
ModO。
BeanF 触发一个事件,BeanO 观察它。
第一个fire(-) 操作以异常结束(Wildfly 8.2):
错误 [org.jboss.as.ejb3.invocation] JBAS014134: EJB 调用在组件 BeanF 上失败,用于方法 public void BeanF.publish(ModEvent):
javax.ejb.EJBException: org.jboss.msc.service.ServiceNotFoundException: 服务服务
jboss.deployment.subunit."myapp.ear"."modO.jar".component.BeanO.VIEW."BeanO".LOCAL 未找到
进一步的fire(-) 操作到达观察者,但我不能让任何事件丢失。
有没有办法在事件触发之前(或在事件触发并等待处理之后即时)强制初始化观察者?
@Observes(notifyObserver = Reception.IF_EXISTS) 仅允许在观察者尚未准备好时以静默方式跳过事件。
在我的情况下,BeanF 不能依赖于BeanO,因为必须在application.xml 中的ModF 之后声明ModO。
是否可以使用 CDI 事件/侦听器,或者我需要使用 JMS?
【问题讨论】:
-
你能从 SLSB 切换到 Singletons 吗?那么使用@Sturtup 可以解决问题吗?
-
Reception.IF_EXISTS 主要适用于范围更广的bean(如 SessionScope 、 ApplicationScoped 等)。如果您的 bean 是 @Stateless,则仅为单个调用“创建”实例,这使得 IF_EXISTS 几乎总是返回 false(除非事件触发和观察者位于同一堆栈跟踪中)。
-
尝试使用
@Singleton和@Startup注释两个 bean 并收到相同的异常(我无法使用@DependsOn( BeanO )注释BeanF,因为ModF看不到ModO)。还尝试将BeanO更改为@ApplicationScoped,在这种情况下,可以接收到事件-BeanO.observe(@Observes ...)方法开始执行,执行了一些日志记录,但在尝试调用其他一些@Statelessbean 时因ServiceNotFoundException异常而崩溃(这其他 bean 必须是@Stateless,因为它使用了TransactionAttributeType.REQUIRES_NEW注释)。
标签: events cdi wildfly java-ee-7 ejb-jar.xml