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

@使用@RequestScoped CDIBean的远程EJB

颜志业
2023-03-14

我有一个应用程序,它有一个@Remote@SingletonEJB,它注入了由CDI生成的@requestscope实体管理器。同一服务器(wildfly 9)/JVM上的另一个应用程序将使用此EJB从实体管理器获取结果。

EJB的第一次调用将返回预期结果。当调用返回时,它生成实体管理器,获取数据并再次处理实体管理器。由于关闭了实体管理器,该EJB的每个后续调用都将抛出一个错误。未对新实体经理进行生产/处置。

这是预期的巴哈维奥吗?我的代码中有错误吗?

IFrameworkResourceManager framework = _applicationContext.getFrameworkResourceManager();
final User resolvedUser = framework.resolveUser(username, domain);
// ...
final Rights resolvedRights = framework.resolveRights(resolvedUser.getGuid(), applicationId);
// ...

这段代码在CDI生产者中执行,一旦为用户创建了新的http会话,CDI生产者就会再次执行。如果在调用resolveRights之前再次调用getFramworkResourceManager,则不会发生任何更改。

public IFrameworkResourceManager getFrameworkResourceManager() {
    return IFrameworkResourceManager frm = (IFrameworkResourceManager) ctx
        .lookup("java:global/WebFramework/WebFrameworkImpl!my.package.IWebFramework");
}

不管我是使用直接JNDI查找还是@EJB注入。返回的实例被报告(toString())为远程EJB无状态ejblocator的代理,对于“/WebFramework/WebFrameworkImpl”,视图是我的接口。包裹IWebFramework,关联性为无

@LocalBean
@Singleton
public class WebFrameworkImpl implements IWebFramework, Serializable {
    @Inject
    private EntityManager _entityManager;

    @Override
    public User resolveUser(String username, String domain) {
        System.out.println(_entityManager + " || " + _entityManager.isOpen());
        // execute query using QueryDSL and the injected entityManager
    }

    @Override
    public Rights resolveRights(String guidUser, int applicationId) {
        System.out.println(_entityManager + " || " + _entityManager.isOpen());
        // execute query using QueryDSL and the injected entityManager
    }
}

@Remote
public interface IWebFramework extends IFrameworkResourceManager {
    // some methods...
}

public interface IFrameworkResourceManager {
    public User resolveUser(String username, String domain);
    public Rights resolveRights(String guidUser, int applicationId);
}

Sysout ofresolveUserorg。冬眠jpa。内部的EntityManagerImpl@379e882b| |正确

Sysout ofresolveRightsorg。冬眠jpa。内部的EntityManagerImpl@379e882b| |假

编辑20.11.2015 13:43:持久化单元的类型为RESOURCE\u LOCAL。此外,所有@ResourceScopedbean都会受到影响<代码>@PostConstruct和@PreDestroy仅在第一次EJB调用时调用。每个后续调用都使用资源范围bean的前一个实例,这是不正确的。

编辑20.11.2015 13:55:如果从提供EJB的同一应用程序中调用EJB,则一切都会正常工作。此行为仅在从其他应用程序调用时出现。

编辑20.11.2015 15:24:JBoss AS 7.1.3。最终,Wildfly 9.0.0。最终和Wildfly 10.0.0。CR4全部生效。但根据CDI规范(1.0至1.2)第6.7.4章,这应该是可行的。我已经填写了错误报告(WFLY-5716)。

共有2个答案

卢英范
2023-03-14

此有线行为的错误修复已合并到焊接存储库中:

  • WFLY-5716
  • WELD-2069
蔚学真
2023-03-14

使用RESOURCE\u LOCAL时,您应该从EntityManager数据库创建EntityManager并自行处理,如:

private EntityManagerFactory factory = Persistence.createEntityManagerFactory("unit-name");

public void someMethod(){

    EntityManager em = emf.createEntityManager();
    EntityTransaction tx = null;
    try {
      tx = em.getTransaction();
      tx.begin();

      // do some work

      tx.commit();
    }
    catch (RuntimeException e) {
      if ( tx != null && tx.isActive() )
        tx.rollback();
      throw e; // or display error message
    }
    finally {
      em.close();
    }
}
 类似资料:
  • 为了能在任意 Git 项目上协作,你需要知道如何管理自己的远程仓库。 远程仓库是指托管在因特网或其他网络中的你的项目的版本库。 你可以有好几个远程仓库,通常有些仓库对你只读,有些则可以读写。 与他人协作涉及管理远程仓库以及根据需要推送或拉取数据。 管理远程仓库包括了解如何添加远程仓库、移除无效的远程仓库、管理不同的远程分支并定义它们是否被跟踪等等。 在本节中,我们将介绍一部分远程管理的技能。 查看

  • 因此,客户机请求CPU和内存(我相信我需要两个队列),服务器用这些值进行响应。 是否可以简单地创建和,本例使用Python中的Pika库。

  • 使用远程调试 为了与qemu配合进行源代码级别的调试,需要先让qemu进入等待gdb调试器的接入并且还不能让qemu中的CPU执行,因此启动qemu的时候,我们需要使用参数-S –s这两个参数来做到这一点。在使用了前面提到的参数启动qemu之后,qemu中的CPU并不会马上开始执行,这时我们启动gdb,然后在gdb命令行界面下,使用下面的命令连接到qemu: (gdb) target remot

  • 本文向大家介绍使用portainer连接远程docker的教程,包括了使用portainer连接远程docker的教程的使用技巧和注意事项,需要的朋友参考一下 Portainer是一个轻量级的docker环境管理UI,可以用来管理docker宿主机和docker swarm集群。他的轻量级,轻量到只要个不到100M的docker镜像容器就可以完整的提供服务 Portainer的Hub地址是:htt

  • 我使用RxJava异步处理servlet请求。在每个请求期间,使用flatMap操作符对远程服务API进行大量异步调用。 由于资源限制,我需要限制针对该API的并发请求总数。对于使用其并发参数在单个平面图中调用API的单个Rx流来说,这是微不足道的。但是我的应用程序中有多个独立的流(基本上每个ServletRequest一个),并且每个流都有多个对API的平面图调用。 因此,我认为我必须将所有远程

  • 我已经用Oracle Enterprise Linux安装了VirtualBox image。它包含已安装的Oracle Database 12.1.0。 在虚拟机网络设置中,我选择“Bridget Adapter”。接下来Linux我配置了连接设置:静态IP地址:192.168.0.110 现在我可以使用ping 192.168.0.110 ping到虚拟机。 虚拟机上的文件: tnsnames