【问题标题】:Constraint JAX-WS CXF web service request method invocation to one request per client IP将 JAX-WS CXF Web 服务请求方法调用约束为每个客户端 IP 一个请求
【发布时间】:2012-06-26 07:17:44
【问题描述】:

我有一个基于 CXF 的 Web 服务,它采用单向方法说: 服务报告()

在处理来自客户端的report() 时,我想让来自同一客户端IP 的另一个传入report() 等待第一个请求得到处理。从客户端看,report() 是一个原子操作,对 report() 的连续调用应该按顺序处理。

我怎样才能最好地实现这种锁定机制?我需要实现每个客户端队列还是有一种简单的方法来完成这个?

【问题讨论】:

  • 这是否适用于同步报告()

标签: java servlets locking jax-ws cxf


【解决方案1】:

您不需要为此设置一个完整的队列。一个简单的对象同步应该可以工作

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.
   }
}

【讨论】:

  • 虽然它是一个完美的解决方案,但我会建议一些更强大的解决方案。通过这种同步,您将线程置于不确定状态,直到它有机会工作。如果您要使用某种执行器模式,就不需要这种 big 且代价高昂的同步恕我直言。
  • 除非您使用的是 servlet 3.0,否则无论如何都需要阻止 HTTP 请求的工作线程。
  • 谢谢@greyfairer!处理完请求后,如何最好地从地图中清除客户端 IP?这会导致问题吗:synchronized(syncMap.get(clientIp)) { //do synchronized stuff. syncMap.remove(clientIp); }
  • 删除始终是原子的,因此您可以安全地执行此操作。但我看不出有必要。如果你退出同步块,同步对象被解锁并且可以在下一次调用中重用,所以你将它保存在地图中。除非你的记忆力真的很有限。
猜你喜欢
  • 2012-03-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-05
  • 2013-05-17
  • 1970-01-01
  • 2016-08-13
  • 1970-01-01
相关资源
最近更新 更多