Java 番石榴:在彼此之间同步几个加载缓存

Java 番石榴:在彼此之间同步几个加载缓存,java,concurrency,guava,Java,Concurrency,Guava,我有:基于WebSocket(非阻塞io)的Web应用程序。浏览器中的每个用户选项卡都与一个对等对象关联。还有三个全局对等集合,可通过peer.engine.*对等引用链从每个peer访问。见下面的代码: public class Peer implements WebSocketListener { private org.eclipse.jetty.websocket.api.Session session; private long sessionId; private

我有:基于WebSocket(非阻塞io)的Web应用程序。浏览器中的每个用户选项卡都与一个
对等对象关联。还有三个全局对等集合,可通过
peer.engine.*对等引用链从每个
peer
访问。见下面的代码:

public class Peer implements WebSocketListener {
   private org.eclipse.jetty.websocket.api.Session session;
   private long sessionId;
   private Engine engine;

   public Peer(Engine engine) {
       this.engine = engine;
   }

   //all WebSocketListener methods implementation
}

//singleton
public class Engine {
   // Where key is the peer.sessionId 
   //HERE IS THE POINT: each user can remove, add, replace elements of caches with the same key (`sessionId`) in concurrent way.
   LoadingCache<Long, Peer> activePeers; 
   LoadingCache<Long, Peer> inactivePeers; 
   LoadingCache<Long, Peer> closedPeers; 

   private Engine(LoadingCache<Long, Peer> a, LoadingCache<Long, Peer> b, LoadingCache<Long, Peer> c) {
      this.activePeers = a;
      this.inactivePeers = b;
      this.closedPeers = c;
   }
}
公共类对等实现WebSocketListener{
private org.eclipse.jetty.websocket.api.Session;
私人长会期;
私人发动机;
公共对等(引擎){
这个。发动机=发动机;
}
//所有WebSocketListener方法的实现
}
//独生子女
公共级引擎{
//其中key是peer.sessionId
//要点是:每个用户都可以用相同的键(`sessionId`)以并发方式删除、添加、替换缓存元素。
加载缓存活动节点;
加载缓存不活动对等点;
加载缓存关闭的指针;
专用引擎(加载缓存a、加载缓存b、加载缓存c){
this.activePeers=a;
这个。不活动对等点=b;
此参数为c;
}
}
问题解释:每个对等方都可以从所有*对等方集合中添加、删除自己或其他对等方,或将其他对等方从一个集合替换到另一个集合问题:有许多同级,所有同级都同时发生

重要的细微差别!:如果用户从多个选项卡使用我的应用程序,他将有许多同龄人。用户只能触摸(意味着添加、删除、替换)他的同行。我的意思是,每个对等方只能触摸(添加、删除、替换)在
加载缓存中具有相同键的对等方

问题:我是否需要同步所有这些操作(添加、删除、替换)或者LoadingCache已经为我完成了


p.S.如果你需要额外的解释,尽管问,不客气

呃,为什么不将对等状态嵌入
peer
类中呢?这样,您就只有一个缓存需要处理。另外,缓存是如何构建的?您是否设置了
RemovalListener
设置?替换/删除/添加是什么意思?您是否通过调用AsMap从缓存中获取映射?或者您是指“无效”方法吗?@fge 2)是的,我有一个
RemovalListener
,在某些情况下,它只是将
对等方
移动到另一个集合。例如,如果发生访问超时,我会在
RemovalListener
中将对等点从
activePeers
移动到
inactivePeers
。1) 你所说的同侪国家是什么意思。这些集合包含所有用户的所有对等方。我必须将它们存储在一个地方,以允许它们之间的通信users@Chunkz示例:我在
inactivePeers
map中有
peer1
。在某些事件中,我应该将
peer1
和所有true
peer.sessionId==peer1.sessionId
的现有对等方替换为
activePeers
缓存。我可以通过
使其失效
来实现这一点吗?如果是,那么使用
asMap
invalidate
都没有关系。对等方可以有多个状态吗?ie它们可以同时关闭和激活吗?否则,我同意@fge的观点,即指示其当前状态的属性应该创建更干净、更不容易出错的代码。