我有一个基于CXF的Web服务,其中有一个单向方法:Service.report()
当正在处理来自客户端的report()请求时,我希望能让同一客户端IP的另一个进入的report()请求等到第一个请求被处理完毕。从客户端的角度来看,report()是一个原子操作,对report()的连续调用应该按顺序进行处理。
我最好如何实现这种锁定机制?是否需要实现每个客户端队列,还是有简单的方法可以实现此目的?
我有一个基于CXF的Web服务,其中有一个单向方法:Service.report()
当正在处理来自客户端的report()请求时,我希望能让同一客户端IP的另一个进入的report()请求等到第一个请求被处理完毕。从客户端的角度来看,report()是一个原子操作,对report()的连续调用应该按顺序进行处理。
我最好如何实现这种锁定机制?是否需要实现每个客户端队列,还是有简单的方法可以实现此目的?
你不需要一个完整的队列来实现这个。一个简单的对象同步应该就可以了。
static ConcurrentMap syncMap = new ConcurrentHashMap();
public void report()
{
String clientIp = ...
syncMap.putIfAbsent(clientIp, new Object()); // just new Object is good enough to sync on
synchronized(syncMap.get(clientIp))
{
//do synchronized stuff.
}
}
synchronized(syncMap.get(clientIp))
{
//进行同步操作。
syncMap.remove(clientIp);
}
- amo