java - 如何管理有状态的网络服务?

标签 java jakarta-ee glassfish ejb stateful-session-bean

我正在尝试了解 J2EE 和 Web 服务(在 GlassFish 3.1 中)。这个问题有点跟进 this .

我已经弄清楚如何使用无状态 session Bean 和 Web 服务。我实际上只是出于方便才使用 Web 服务 (@WebService),因为我不想手动解析消息。尽管如果可能的话我更喜欢比 SOAP 更轻的东西。但是,当我想维护某种状态(例如通过有状态 session Bean)时,我遇到了问题。我已经搜索过这个网站和其他几个建议我避免这种情况的网站,因为它会导致难以发现错误并限制可扩展性。

假设我有一个用户刚刚执行了“userLogin”方法并且成功了。然后我如何在服务器上知道用户已经登录。例如,登录后用户可能通过 SOAP(不带任何参数)调用“getProfile()”,我会返回该用户的正确信息。我知道通过将 @WebService 附加到我的有状态 session Bean 是不可能的,因为它只对 @Stateless 有效。

如果我将 HttpSession(带有 HttpServlet)与无状态 session Bean 一起使用,我知道如何存储状态,但是我无法使用很好地生成的 SOAP 消息。

所以我的问题是:我将如何解决维护用户状态的问题,或者调整该问题以便我不需要状态?

最佳答案

WS 可以是有状态的:使用@Stateful 注释和 WS-Addressing(参见我的 old question 例如)

拥有有状态服务器并没有什么罪过。毕竟,如果需要状态性,为什么要避免呢?无状态确实更容易扩展和调试,但如果您需要保持状态(例如在购物卡中)——那就保持它。

不过需要考虑的是在超时后清理有状态服务实例。使用 StatefulWebServiceManager 实例及其 setTimeout() 方法。

此外,状态可以保存在 WS(例如数据库)之外,状态( session )标识符作为参数之一传递。工作正常。

使用 HTTP session 是为无状态服务保持状态的一种非常简单的方法,但我认为与 @Stateful 相比它已经过时了。理由是请求不必通过 HTTP 来; @Stateful/WS-Addressing 适用于任何 channel ,而 HTTP session 需要 HTTP 传输。当然,在现实世界中,HTTP 是最流行的,所以这个论点是非常纯粹的。

关于java - 如何管理有状态的网络服务?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6501020/

相关文章:

java - 在运行时包含和排除 Lib

java - Android SQLite 创建数据库但找不到表

java - GWT 面板设计最佳实践

java - fork /加入 JavaEE 应用程序?

java - 使用 java apache POI 写入 Excelsheet 时出现问题

deployment - Netbeans,如何将项目部署(war)文件构建到自定义文件夹中?

java - 简单java代码的时间复杂度

jakarta-ee - web.xml 中的上下文参数是什么?

java - 如何访问远程服务器上的EJB?

Glassfish:链接安全策略时出错