Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Jakarta ee 在cdi会话上下文之间通信——使用数据库,是否会调用适当的cdi上下文?_Jakarta Ee_Jpa_Java Ee 6_Cdi_Ejb 3.1 - Fatal编程技术网

Jakarta ee 在cdi会话上下文之间通信——使用数据库,是否会调用适当的cdi上下文?

Jakarta ee 在cdi会话上下文之间通信——使用数据库,是否会调用适当的cdi上下文?,jakarta-ee,jpa,java-ee-6,cdi,ejb-3.1,Jakarta Ee,Jpa,Java Ee 6,Cdi,Ejb 3.1,我很难让sessionscoped bean和ejb有状态bean在同一JavaEE容器中的用户会话之间进行通信。经过反复试验,我决定使用数据库在用户会话之间传递消息。但是现在我有一个问题,我如何通知用户的会话DB已经更改 我可以在每个用户的会话上下文中启动后台轮询线程来轮询数据库的更改吗?如果这样做可行,除了确保轮询bean在其自己的用户会话上下文中“唤醒”之外,避免阻塞的最佳方法是什么 我使用的是Glassfish 3.1.2,用户会话是CDI sessionscoped bean,带有一些

我很难让sessionscoped bean和ejb有状态bean在同一JavaEE容器中的用户会话之间进行通信。经过反复试验,我决定使用数据库在用户会话之间传递消息。但是现在我有一个问题,我如何通知用户的会话DB已经更改 我可以在每个用户的会话上下文中启动后台轮询线程来轮询数据库的更改吗?如果这样做可行,除了确保轮询bean在其自己的用户会话上下文中“唤醒”之外,避免阻塞的最佳方法是什么

我使用的是Glassfish 3.1.2,用户会话是CDI sessionscoped bean,带有一些用于JPA数据库访问的有状态EJB。我正在使用CDI事件总线在用户会话中围绕bean传递消息

我尝试使用单例在用户会话之间进行通信。但这不起作用,因为一旦来自用户1的消息传递给用户2的bean,这些bean触发CDI事件,CDI事件就由用户1的会话上下文处理。这很有意义,因为消息是在用户1的会话中创建的


任何帮助都将不胜感激

我想我必须回答我自己的问题--

  • 上下文不会传播到新线程或异步调用。这是CDI1.0规范中未定义的行为,因此不需要容器来跟踪创建线程的上下文。如果创建一个线程,然后在该线程唤醒后触发CDI事件,则该CDI事件将没有活动上下文,并将抛出以下错误:
    org.jboss.weld.context.contextNotActivieException:weld-001303作用域类型javax.enterprise.context.RequestScope没有活动上下文
    或特定于线程试图激活的作用域的内容,这真的不是一个bug,它只是未定义的行为

  • 因此,当设置任何后台轮询线程以检查用户数据是否有任何更改时,当线程检测到更改时,它无法(通过CDI事件)与用户的会话上下文通信。此时线程没有上下文。对于一些人来说,这似乎是一个尚未回答的问题:而这个问题

  • 希望我的解决方案能有所帮助。在CDI 1.1定义了将会话上下文传播到线程的方法之前,您必须对用户自己的数据进行轮询,当用户获得新数据时,他们可以在自己的会话上下文中对其进行操作。我设置了自己的系统,使用数据库为每个用户存储一个事件队列,当他们轮询时,他们只需迭代队列中的消息,并将其激发,就好像它们是在自己的会话上下文中发送的CDI消息一样


    如果焊接CDI专家能纠正我的错误,我将不胜感激

    我想我必须回答我自己的问题--

  • 上下文不会传播到新线程或异步调用。这是CDI1.0规范中未定义的行为,因此不需要容器来跟踪创建线程的上下文。如果创建一个线程,然后在该线程唤醒后触发CDI事件,则该CDI事件将没有活动上下文,并将抛出以下错误:
    org.jboss.weld.context.contextNotActivieException:weld-001303作用域类型javax.enterprise.context.RequestScope没有活动上下文
    或特定于线程试图激活的作用域的内容,这真的不是一个bug,它只是未定义的行为

  • 因此,当设置任何后台轮询线程以检查用户数据是否有任何更改时,当线程检测到更改时,它无法(通过CDI事件)与用户的会话上下文通信。此时线程没有上下文。对于一些人来说,这似乎是一个尚未回答的问题:而这个问题

  • 希望我的解决方案能有所帮助。在CDI 1.1定义了将会话上下文传播到线程的方法之前,您必须对用户自己的数据进行轮询,当用户获得新数据时,他们可以在自己的会话上下文中对其进行操作。我设置了自己的系统,使用数据库为每个用户存储一个事件队列,当他们轮询时,他们只需迭代队列中的消息,并将其激发,就好像它们是在自己的会话上下文中发送的CDI消息一样


    如果焊接CDI专家能纠正我的错误,我将不胜感激

    我认为CDI事件总线不能用于用户会话之间的通信

    用JMS消息代理解决这个问题不是更好吗?您的应用程序将扩展得更好!将其作为单独的实例运行,或将其嵌入到应用程序服务器中。 例如,您可以使用ActiveMQ代理

    在JMS主题上发布通知消息,并使用户会话订阅该消息。
    我还没有使用,但它似乎能够弥合JMS和CDI之间的差距。使用Seam JMS,您可以在每个用户会话中接收JMS消息。文档中的示例解释了如何为每个用户在@SessionScoped bean的@PostConstruct中注册JMS侦听器。

    我认为CDI事件总线不能用于用户会话之间的通信

    用JMS消息代理解决这个问题不是更好吗?您的应用程序将扩展得更好!将其作为单独的实例运行,或将其嵌入到应用程序服务器中。 例如,您可以使用ActiveMQ代理

    在JMS主题上发布通知消息,并使用户会话订阅该消息。 我还没有使用,但它似乎能够弥合JMS和CDI之间的差距。使用Seam JMS,您可以在每个用户会话中接收JMS消息。文档中的示例解释了如何为每个用户在@SessionScoped bean的@PostConstruct中注册JMS侦听器。

    不,它不起作用——我试过了。当JMS消息