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

@Singleton会话bean是跨不同会话管理对象的正确位置吗?

贲招
2023-03-14

我仍在学习合适的JavaEE模式,希望您能给我一些关于解决这个问题的最佳工具的建议。

我有一个需要管理多个智能代理实例的系统。客户端可以创建新实例,也可以按名称访问所需实例。多个客户端可以同时访问同一个代理。

我们的计划是通过REST接口向代理公开操作,因此调用可能类似于:

GET  /sessions/
POST /sessions/{name}
PUT  /sessions/{name}/doanaction

这些会话在重启后不会持续,所以我不寻求资源管理。

我的想法是,我们可以使用一个@Singleton会话bean来管理名称到代理的映射,然后将其注入到将为REST Web服务提供实用程序方法的@Statless会话bean中。

我想确保我没有在这里滥用@Singleton。因为多个客户端可以访问同一个代理,所以似乎没有任何方法可以使用JavaEE会话管理来促进跨会话的对象管理。除了@Singleton会话bean之外,我还应该使用其他可注射对象吗?这通常是解决这个问题的正确方法吗?感谢提示!

共有1个答案

商皓
2023-03-14

我认为EJB的任何开箱即用机制都不适合代理的概念,代理是一个有状态的实体,在服务器中有自己的生命周期,同时可供多个客户端访问。

无状态会话bean没有状态,有状态会话bean仅用于一个客户端。

因此,一种可能的设计是将状态从代理提取到AgentState对象中。然后将每个代理的状态存储在ConcurrentHashMap中,按代理名称索引。散列映射可以包装在@Singletonbean中。

然后,REST控制器代码可以按名称检索代理状态,动态实例化一个代理new MyAgent(agentState),将状态传递给它,然后执行一些操作。

多个客户端可以同时从缓存中检索代理状态。关键是,当代理对象执行复合操作时,需要通过锁定代理对象来防止代理状态的损坏:

类MyAgent{

public void someCompoundOperation() {
    synchronized (agentState) {
        ...
        String propertyA = agentState.getPropertyA();
        ... compare A with something

        agentState.setPropertyA(newA);
        ...
    }
}

这将防止两个客户端读取相同属性值时出现争用情况,并同时执行操作,而不是等待另一个代理完成并释放代理状态。

 类似资料:
  • 我需要确保给定的 bean 是使用会话范围定义的。 我知道我可以使用或,其中是我的(Web)Application Context,但是,没有。 如果你想知道为什么我需要这样的东西,请检查这个问题。 相关:我可以以编程方式确定Spring bean是否不是单例吗?

  • 成功开发 Web 应用程序的难题之一是在一次用户访问,即会话期间,当用户在一个应用程序的页与页之间跳转的同时,维护用户信息。HTTP 是一种无状态协议,也就是说,Web 服务器将某页的每次访问都当作相互无关的访问来处理;服务器不保留前一次访问的任何信息,即使访问就发生在当前访问的几秒钟之前。正因为这种不记忆以前访问的特性使得编写联机目录之类的应用程序很困难,此类应用程序可能需要跟踪用户在目录的不同

  • 问题内容: 我一直对会话在内部的工作方式感兴趣,但是我对C的知识很少(并且不确定在PHP源代码中的位置)。 这是我目前对会话的了解: 当您启动会话时,将为用户分配一个会话ID,该ID存储在cookie中。 会话数据保存(通过)后,将与相关的会话ID和到期时间一起存储在文件系统中。 它是否正确?另外,创建会话ID的方法是什么?我认为这是基于时间的,但是如果两个用户同时发送请求该怎么办?内部采用什么方

  • 问题内容: 我正在构建一个系统,其中来自客户端的每个请求都会在服务器端生成多个线程。然后,每个线程都使用一个或多个DAO(某些DAO可以同时被多个线程使用)。Spring 将所有DAO注入()到我的线程类中。每个DAO也接受注射。 什么是在这些多个DAO之间管理Hibernate会话的正确方法,这样我就不会因多线程环境而遇到问题(例如,来自不同线程的几个DAO试图同时使用同一会话)? 我在Hibe

  • 成功登录后,我想用新的url继续进行进一步的请求处理。但url正在调用springmvc中的公开服务,其中的安全配置不会检查会话身份验证以获取传入url。请看下面的代码。 当jsp页面提交登录验证时,J_security_check调用目标url,该URL随后调用拦截器模式/home*并验证登录凭证。 如果我在登录之前调用公开的服务“/address/userid/”,它将直接调用服务方法,使其成

  • 问题内容: 我正在开发一个小型Web应用程序,很有趣,目前仅使用Java Servlet。我有两个页面,test1和test2。目前,我正在test1中创建一个新会话,如下所示: 在test2中,我像这样检索会话: 因此,问题在于,如果我先进入test2,我总是会得到一个有效的会话,因为浏览器会创建一个会话。我想限制从test1到test2的流量,因此我必须先进入test1。我的计划是最终创建一个