Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/383.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
Java 在web层的会话范围中使用的业务层中的有状态EJB_Java_Jsf_Glassfish_Ejb_Cdi - Fatal编程技术网

Java 在web层的会话范围中使用的业务层中的有状态EJB

Java 在web层的会话范围中使用的业务层中的有状态EJB,java,jsf,glassfish,ejb,cdi,Java,Jsf,Glassfish,Ejb,Cdi,我有一个企业应用程序,至少有一个web层(仅限UI)和一个服务层。服务层中的所有业务逻辑和当前会话状态都实现为@Stateful@LocalBeanejb(无CDI) 就CDI而言,这有点类似于@SessionScopedbean,对吗 所以,问题是: 我在web层(@Named@ConversationScoped)中有一个长时间运行的会话,希望访问有状态EJB。应该在此对话的不同控制器(bean)中访问EJB。我不能这样做:@EJB,因为它将是特定EJB类型的不同实例。我必须以某种方式保存对

我有一个企业应用程序,至少有一个web层(仅限UI)和一个服务层。服务层中的所有业务逻辑和当前会话状态都实现为
@Stateful@LocalBean
ejb(无CDI)

就CDI而言,这有点类似于
@SessionScoped
bean,对吗

所以,问题是: 我在web层(
@Named@ConversationScoped
)中有一个长时间运行的会话,希望访问有状态EJB。应该在此对话的不同控制器(bean)中访问EJB。我不能这样做:
@EJB
,因为它将是特定EJB类型的不同实例。我必须以某种方式保存对EJB的引用。这是我当前的解决方案:

@EJB
private MyEJB _myEJB; // a stateful EJB

@Produces
@Builder // custom quallifier
@ConversationScoped
public MyEJB produceMyEJB() {
    return _myEJB;
}
现在,我可以在每个对话范围的控制器中访问相同的有状态EJB实例,如下面的
@Inject@Builder-MyEJB\u-MyEJB

它在大多数情况下都有效。但是在一些长时间运行的测试中,这个引用是空的,我不知道为什么

我在Glassfish的server.log中得到了这个堆栈跟踪:

javax.ejb.NoSuchObjectLocalException: The EJB does not exist. session-key:
907f0200001f-ffffffffc3388fbb-761
和/或

Cannot load from  BACKUPSTORE FOR Key: <907f0200001f-ffffffffc3388fbb-761>
无法从备份存储加载密钥:

你知道为什么会这样吗?感谢您的帮助,并为我的英语不好感到抱歉。

您的有状态EJB可能正在超时。查看
javax.ejb.StatefulTimeout


您的有状态EJB可能正在超时。查看
javax.ejb.StatefulTimeout


嗨,非常感谢你的邀请。但是EJB上没有这样的StatefulTimeout命令。我发现此超时(删除未使用的EJB)的默认配置是90分钟(请通过localhost查看EJB容器设置:4848)。这远远超过了web.xml中的会话超时(以及会话超时)。我错过了什么吗?您可以使用@StatefulTimeout注释设置特定EJB的超时,如我的示例(JavaEE标准)所示。如果要更改所有有状态会话bean的默认值,这是特定于服务器的。我不使用Glassfish,但是Glassfish-ejb-jar.xml中的删除超时秒数属性可能正是您想要的:您好,非常感谢您的anwser。但是EJB上没有这样的StatefulTimeout命令。我发现此超时(删除未使用的EJB)的默认配置是90分钟(请通过localhost查看EJB容器设置:4848)。这远远超过了web.xml中的会话超时(以及会话超时)。我错过了什么吗?您可以使用@StatefulTimeout注释设置特定EJB的超时,如我的示例(JavaEE标准)所示。如果要更改所有有状态会话bean的默认值,这是特定于服务器的。我不使用Glassfish,但是Glassfish-ejb-jar.xml中的删除超时(秒)属性可能就是您想要的:
@Stateful
@StatefulTimeout(unit = TimeUnit.MINUTES, value = 30)
public class MyEJB {