首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在同一个请求中获取@RequestScoped CDI的不同实例

在同一个请求中获取@RequestScoped CDI的不同实例
EN

Stack Overflow用户
提问于 2016-02-05 10:56:23
回答 2查看 933关注 0票数 0

在WildFly 8/10上,我有一个简单的SLSB触发CDI事件:

代码语言:javascript
复制
@Stateless
@Remote(CDITestRemote.class)
@Local(CDITestLocal.class)
public class CDITestBean implements CDITestRemote, CDITestLocal {

    @Inject
    private Event<IVolumeEvent> events;

    @Override
    public String insert(final String value) {
        final IVolumeEvent event = new VolumeEvent();
        events.fire(event);

        return String.format("value: %s", value);
    }
}

以及用于EJB触发的事件类型的@ApplicationScoped "CDI事件观察者“:

代码语言:javascript
复制
@ApplicationScoped
public class VolumeEventObserver {

    private Logger logger = LoggerFactory.getLogger(VolumeEventObserver.class);

    @Inject
    private TransactionHandler txHandler;

    public void inProgress(
            @Observes(during = TransactionPhase.IN_PROGRESS) final IVolumeEvent event) {
        logger.info("@Observes progress() {}", String.valueOf(txHandler));
    }

    public void afterSuccess(
            @Observes(during = TransactionPhase.AFTER_SUCCESS) final IVolumeEvent event) {
        logger.info("@Observes success() {}", String.valueOf(txHandler));
    }

    public void afterFailure(
            @Observes(during = TransactionPhase.AFTER_FAILURE) final IVolumeEvent event) {
        logger.info("@Observes failure() {}", String.valueOf(txHandler));
    }

}

TransactionHandler是一个@RequestScoped CDI:

代码语言:javascript
复制
@RequestScoped
public class TransactionHandler {
    // some methods here...    
}

当我在注入REST资源的EJB实例上调用insert()时,在对REST端点的请求期间,在VolumeEventObserver中的任何观察者方法中都会看到相同的TransactionHandler实例:

代码语言:javascript
复制
11:23:58,476 INFO  [VolumeEventObserver] (default task-11) @Observes progress() TransactionHandler@7687eead
11:23:58,479 INFO  [VolumeEventObserver] (default task-11) @Observes success() TransactionHandler@7687eead

但是,当我进行远程EJB调用时,我在同一个请求中看到了不同的实例:

代码语言:javascript
复制
11:42:01,461 INFO  [VolumeEventObserver] (EJB default - 2) @Observes progress() TransactionHandler@2e65f10d
11:42:01,463 INFO  [VolumeEventObserver] (EJB default - 2) @Observes success() TransactionHandler@2a5a7019

因此,TransactionHandler似乎不受请求范围的限制。

JSR-299说,请求范围是活动的:

在任何远程方法调用任何EJB,在任何异步方法调用任何EJB .

而且由于没有ContextNotActiveException,我想请求作用域是活动的-那么为什么我得到不同的实例呢?

它是同一个线程(从日志条目中可以看到),而且事务也是相同的。

EN

回答 2

Stack Overflow用户

发布于 2016-02-06 02:15:34

您所看到的行为符合规范。规范指出,请求上下文在远程EJB调用期间是活动的。它并不是说对同一个bean的重复调用是在一个请求中操作的。

票数 0
EN

Stack Overflow用户

发布于 2016-10-28 11:29:54

只是在黑暗中开枪:你试过用这个吗?

代码语言:javascript
复制
@ApplicationScoped
public class VolumeEventObserver {

    private Logger logger = LoggerFactory.getLogger(VolumeEventObserver.class);

    @Inject
    private Instance<TransactionHandler> txHandler;

    public void inProgress(
        @Observes(during = TransactionPhase.IN_PROGRESS) final IVolumeEvent event) {
        logger.info("@Observes progress() {}", String.valueOf(txHandler.get()));
    }

}

也许“实例”能起作用。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35222370

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档