将session-cope bean存储在@controller中



我试图将我的会话划分的用户豆存储在整个会话中的单例控制器中。因此,每当用户连接时,我都想将其存储在阵列中,以与其他用户保留会话的用户。

我知道通过代理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);

相关内容

  • 没有找到相关文章

最新更新