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

在同一请求期间获取@RequestScope CDIBean的不同实例

姬朗
2023-03-14

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

@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事件观察者”:

@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是一个@RequestScopedCDI bean:

@RequestScoped
public class TransactionHandler {
    // some methods here...    
}

当我在注入到REST资源的EJB实例上调用插入()时,在对REST的请求期间,我在任何观察者方法中看到了相同的TransactionHandler实例endpoint如预期:

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调用时,我会在同一请求期间看到不同的实例:

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的任何异步方法调用期间[…]

由于没有ContextNotActiveExc0019,我认为请求范围是活动的-那么为什么我得到不同的实例呢?

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

共有2个答案

华善
2023-03-14

黑暗中的一枪:你试过用这个吗?

@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()));
    }

}

也许“实例”会起作用。

季博
2023-03-14

您看到的行为符合规范。规范说明在远程EJB调用期间请求上下文处于活动状态。它并没有说对同一bean的重复调用在单个请求中运行。

 类似资料:
  • 问题内容: 我的问题是给定的代码: 我访问: 我应该期望[‘a’,’bbb’]的输出,除了Flask似乎只接受第一个参数而忽略其余参数。 这是Flask的限制吗?还是设计使然? 问题答案: 你可以使用与Django类似的,但由于某些原因,Flask文档中未提及: 结果是: 使用如果参数是查询字符串(如题),如果值来自具有相同名称的多个表单输入。 结合了两者,但通常应避免使用更具体的集合。

  • CORS策略阻止从起源'https://www.happydesertsafari.com'访问'https://happydesertsafari.com/happy-new/getlocations.php?getall=true&_=1578818763165'的XMLHttpRequest:请求的资源上没有'access-control-allow-origin'标头。

  • 我正在为同一位置获取不同格式的Azure资源位置 像这样,以不同的格式获取所有位置。由于此唯一性,正在数据库中创建行。现在我通过保存一个包含所有可能位置格式的JSON文件来处理这个问题,但这不是一个好的处理方法,因为如果新添加了位置,则需要更新位置。使用Java和Mysql如何有效地处理这个问题?

  • 我们有一个具有多个副本的服务,它可以在没有事务和阻塞方法的情况下使用存储。因此我们需要通过某种“分片”键来同步多个实例之间的并发请求。现在,我们在Kubernetes环境中作为副本集托管该服务。 难道你不知道任何简单的开箱即用的方法,如何做到这一点,而不是从头开始实现它吗? 下面是我们如何做到这一点的几个想法: > 将服务部署为StatefulSet,并实现一些代理API,通过从HTTP请求分片密

  • 我想知道南非目前的日期和时间。 如何在甲骨文中检查不同时区的当前时间和日期? 我将在数据表中添加时区值,从中可以得到当前日期和时间? 我有一个国家表,我将根据国家保存时区。现在在程序中,我必须检查其他表格中的一个日期是否为当前日期。So查询:从DUAL中选择时区“非洲/约翰内斯堡”的SYSTIMESTAMP;不会解决我的问题。

  • 问题内容: 我想检测请求是否来自或主机以及请求的路径。如何获得有关Flask请求的信息? 问题答案: 你可以通过以下几个字段检查网址: 用户请求以下URL: 在这种情况下,上述属性的值如下: 你可以通过适当的拆分轻松提取主体部分。