gpt4 book ai didi

java - @Singleton Session bean 是跨不同 session 管理对象的正确位置吗?

转载 作者:太空宇宙 更新时间:2023-11-04 07:02:32 25 4
gpt4 key购买 nike

我仍在学习适当的 Java EE 模式,并且希望获得有关解决此问题的最佳工具的建议。

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

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

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

这些 session 在重新启动后不会持续存在,因此我不寻找资源管理。

我的想法是我们可以使用 @Singleton session bean 管理名称到代理的映射,然后将其注入(inject) @Stateless session bean 将为 REST Web 服务提供实用方法。

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

最佳答案

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

无状态 session Bean 没有状态,而有状态 session Bean 仅适用于一个客户端。

因此,一种可能的设计是将代理的状态提取到 AgentState 对象中。然后将每个代理的状态存储在 ConcurrentHashMap 中,并按代理名称进行索引。 HashMap 可以封装在 @Singleton bean 中。

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

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

MyAgent 类{

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

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

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

关于java - @Singleton Session bean 是跨不同 session 管理对象的正确位置吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21891127/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com