我试图将我的会话划分的用户豆存储在整个会话中的单例控制器中。因此,每当用户连接时,我都想将其存储在阵列中,以与其他用户保留会话的用户。
我知道通过代理bean向@controller注入会话示出的bean,以便我定义了我的会话划分的用户bean如下,
@Bean
@Scope(value="session", proxyMode = ScopedProxyMode.TARGET_CLASS)
public IUser user ()
{
IUser user = new MyUser();
return user;
}
我已经使用@Autowire注释将bean注入我的控制器类,如下所示,
@Autowired
private IUser sessionUser;
因此,每当用户连接时,我都会将该用户存储在conturrenthashmap中,该用户定义和添加如下,
private ConcurrentHashMap<Integer,IUser> userMap = new ConcurrentHashMap<>(50,0.9f,2);
public void addUser(IUser user)
{
if(user == null) return;
IUser retUser = userMap.putIfAbsent(user.getDbid(),user);
//...
}
因此,当第一个用户连接时,一切都在工作,我将其引用到地图。假设第一个用户参考为
us.com.soemthing.orm.model.MyUser@135debf
然后,让我们假设第二个用户连接了其引用,
us.com.soemthing.orm.model.MyUser@28zbdh
从参考文献中,我可以看到我的会话划分的豆正常工作,因为它们的参考是不同的。但是,当执行进入 Adduser 方法时,问题开始。甚至在将第二个用户添加到地图之前,我检查了我的USERMAP,并查看用户对象,它将其储存的第二个用户替换为Myuser@28zbdh。结束,添加了第二个用户后,我的用户图看起来像这样,
Map --> "1"- us.com.soemthing.orm.model.MyUser@28zbdh
Map --> "2"- us.com.soemthing.orm.model.MyUser@28zbdh
,以始终使用最后一个。我知道它们是真实对象的代理对象,但是我如何存储它们?
谢谢
[编辑]我想提供其他信息。
我正在从另一个Singleton bean中调用Adduser为userIndbMemory.adduser(sessionuser);UserIndBmemory是另一个Singleton Bean,我实际上将Session用户添加到ConcurrentHashMap中。我想将当前的在线用户存储在地图上,因为我想搜索和查询它们而无需访问数据库。因此,我想在内存中保留在线用户(在上下文中有一个会话),以便更轻松,更快地访问。要处理会话到期,每个在线用户都会向服务器发送一个心跳以显示他在线,我在每x分钟内都有一个安排的线程,如果它发现任何用户暂时没有从用户那里得到心跳的用户,则它将其从地图中删除,因为这意味着用户脱机。总而言之,我的情况是我有一个主控制器,然后收到请求,然后链就是这样: @controller-> singleton Application bean-> singleton inmemorydb bean(我定义了我的地图并添加我的映射)我的sessionuser sessiger-sescoped bean是 @自动在@controller中自动将其传递给其他单身豆作为参数。谢谢响应。
我通过直接存储sected bean而不是直接存储它们的对象来解决我的问题。
//IMyUser sessionUser; --let say sessionUser is session-scoped bean in a singleton bean
so而不是
userInDBMemory.addUser(sessionUser);
我首先复制了用户并添加了该对象。
IMyUser copyUser = new MyUser();
BeanUtils.copyProperties(sessionUser, copyUser);
userInDBMemory.addUser(copyUser);