如何维护有状态会话Bean列表?

时间:2011-09-07 12:29:12

标签: java-ee java-ee-6 ejb-3.1

考虑到要开发Java EE应用程序,其目的是聊天服务器,我遇到了一些问题。

客户端应该能够使用HTTP,SOAP或AMF等不同的连接器进行连接。传入的请求需要转换为统一的内部消息。接下来,消息驱动的bean调用业务逻辑并将请求的结果返回给特定的连接器。

Q1:听起来合理吗?

我的问题是如何存储每个客户端的会话信息。这将包括连接数据,时间戳,需要传递的命令等。 有状态会话Bean应该没问题,因为只要客户端连接,我就需要它们。但是,问题是维护所有bean的列表,以便能够为新请求选择正确的会话。 我无法将SFSB引用链接到HttpSession(在别处推荐),因为有不同的连接器,而不仅仅是HTTP客户端。

第二季度:正确的方法是什么?会话管理器,它执行JNDI查找以创建新的SFSB并将其添加到内部列表中?

问题3:如何在集群环境中运行?我看到SFSB可以复制到不同的节点,但如何同步会话管理器列表?

问题4:除负载均衡器外,您还推荐会话亲和力吗?

谢谢。

2 个答案:

答案 0 :(得分:1)

Q1:我猜。这取决于您的要求。只是不要过于复杂化。简单。请注意,使用消息驱动的bean之类的东西意味着异步处理/响应以及消息失败或进入系统异常/死信队列的可能性。

Q2:通常你想通过JNDI查找Java EE bean。让生活更轻松IMO。也许你需要一个servlet或一个无状态会话bean或者前面的东西作为“控制器”?然后,当您不需要bean时,可以在需要数据时从数据库加载有状态bean的数据和/或将数据写入数据库。

问题3:取决于您如何配置群集以及您正在使用的应用程序服务器。每个服务器可能以不同方式实现群集/故障转移/同步等。我建议您阅读应用程序服务器文档以了解其中的一个。和/或发布您正在使用的应用服务器,以便此论坛上的其他人可以推荐一些东西。例如,我们使用IBM WebSphere Application Server V7.0.0.7,Network Deployment Edition。所以在我们的例子中,我们可以在集群节点之间设置bean /对象的复制。

问题4:如果您希望为最终用户的每个后续事务保持连接到同一群集节点,我认为答案是肯定的。 (至少从通过HTTP服务器进入的角度来看)。我猜你是否没有启用会话亲和性,那么你可以切换到不同的群集节点,找到你的数据可能会比较棘手(特别是如果你不在群集之间复制它)。它可以完成,它可能会受到性能影响。所以我猜这里的答案是“是”。

答案 1 :(得分:1)

关于你的问题:

  

问题3:如何在集群环境中运行?我看到SFSB可以   被复制到不同的节点,但如何同步会话管理器   列出?

我通过序列化/反序列化其句柄来存储对有状态会话Bean(SFSB)的引用。它在集群环境中运行良好,但是当在之间之间启动/停止节点时,将在此类调用之后修改句柄。一旦在SFSB调用之后修改了句柄,那么它需要再次序列化 以供进一步使用。

我认为您可以考虑我对SFSB句柄进行序列化/反序列化的方法。