Java tomcat如何仅对特定http线程排队?

Java tomcat如何仅对特定http线程排队?,java,concurrency,concurrenthashmap,Java,Concurrency,Concurrenthashmap,我在tomcat web服务器上部署了一个无状态Java应用程序。由于数据的性质,在任何给定的时间,所有http线程都必须处理不同的密钥,换句话说:所有线程都必须处理不同的密钥 因此,我编写了一个模块,如果在此之前http post正在处理请求的密钥,则对http post进行排队。只有在具有相同密钥的前一个http post完成其处理后,我才会继续处理当前http post 我用concurrenthashmap编写了一个简单的while循环,以测试是否有任何以前的请求使用相同的密钥进行。性能

我在tomcat web服务器上部署了一个无状态Java应用程序。由于数据的性质,在任何给定的时间,所有http线程都必须处理不同的密钥,换句话说:所有线程都必须处理不同的密钥

因此,我编写了一个模块,如果在此之前http post正在处理请求的密钥,则对http post进行排队。只有在具有相同密钥的前一个http post完成其处理后,我才会继续处理当前http post

我用concurrenthashmap编写了一个简单的while循环,以测试是否有任何以前的请求使用相同的密钥进行。性能低于标准杆,有一种意外的行为。这是代码片段:

//This part of code is place inside the servlet 
private static ConcurrentHashMap<String, String> transQueue = new ConcurrentHashMap<String, String>();
private void inQueuePoll(String queueKey) {
   while(transQueue.containsKey(queueKey)){     
      synchronized(this){
         try{
            Thread.sleep(50); // i know this is bad, any idea to improve this?
            logger.trace("Wait for Que Key: "+queueKey + " );

            }catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
    transQueue.put(queueKey, "");
}
在每个http post的末尾,在finally块中,我放入:transQueue.removequeueKey以确保已将其从concurrenthashmap中删除。然而,在我最糟糕的噩梦中,从服务器日志中,我注意到,在删除queueKey之前,另一个http post线程设法退出上面的while循环并继续处理

在上面的代码中将http线程排队时,我是否做错了什么


另外,我非常感谢任何关于我如何做得更好的想法。

首先,如果我能重申你的观点以澄清问题的话。对于任何给定的密钥,所有请求都必须在单个线程中处理;然而,对其他密钥的请求可以在处理对第一密钥的请求的同时进行处理

这件衣服我觉得很适合这件衣服。我会让你的映射成为一个映射,其中键是你的队列键,值是一个单线程执行器,可以通过

给定一个密钥,您将从映射中获得一个ExecutorService,并提交要处理的服务。由于此密钥的执行器是单线程的,因此可以确保它将在处理此密钥之前等待该密钥的前一个请求得到处理。然后,对的调用将被阻止,直到完成对该请求的处理