मैं Async प्रसंस्करण सर्वलेट एपीआई 3. यह काम कर रहा था के रूप में परिभाषित का उपयोग कर कोमेट चैट लागू करने के लिए कोशिश कर रहा था - बातचीत अवरोधित कर ली, तो मैं डिबग सर्वलेट बनाया है async हिस्सा केवल परीक्षण करने के लिए ।बिलाव 7 Async प्रसंस्करण में नाकाम रहने - एक ही अनुरोध संसाधित simultanously
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
log.debug("doGet called");
int timeout = 30 + RandomUtils.nextInt(60);
String message = RandomStringUtils.randomAlphanumeric(50 + RandomUtils.nextInt(250));
response.setHeader("Access-Control-Allow-Origin", "*");
final AsyncContext context = request.startAsync();
synchronized(items) {
items.add(new RequestItem(context, message, timeout));
}
log.debug("doGet created request and finished");
}
मैं कतार में अनुरोध आइटम डाल रहा हूँ, और वहाँ एक धागा चल रहा है, कि इसके बारे में आइटम निर्दिष्ट के बाद समय समाप्त मुद्रण संदेश लेने के लिए और AsyncContext के जवाब भेज देंगे, है:
यह मेरा तरीका है doGet । समस्या यह है कि थ्रेड को तब तक अवरुद्ध कर दिया जाता है जब तक AsyncContext का जवाब नहीं मिलता है। यह वही ब्राउज़र में 4 पृष्ठ लोड का अनुरोध करने के बाद अपने लॉग में देखा जा सकता है:
2011-12-08 13:56:36,923 DEBUG [my.servlet.TestAsyncServlet] doGet called
2011-12-08 13:56:36,952 DEBUG [my.servlet.TestAsyncServlet] doGet created request and finished
2011-12-08 13:57:39,934 TRACE [my.servlet.TestAsyncServlet] respond on item RequestItem [[email protected], message=zEQpATavzwFl6qIbBKve4OzIY9UUuZBwbqN1TC5KpU3i8LM9B6ChgUqaRmcT2yF, timeout=0]
2011-12-08 13:57:39,962 DEBUG [my.servlet.TestAsyncServlet] doGet called
2011-12-08 13:57:39,962 DEBUG [my.servlet.TestAsyncServlet] doGet created request and finished
2011-12-08 13:58:53,949 TRACE [my.servlet.TestAsyncServlet] respond on item RequestItem [[email protected], message=pKHKC632CPIk7hGLV0YqCbQl1qpWIoyNv5OWCp21bEqoni1gbY79HT61QEUS2eCjeTMoNEwdqKzCZNGgDngULysSzVdzFTnQQ5cQ8JvcYnp1pLVqGTueJPWnbRdUuO, timeout=0]
2011-12-08 13:58:53,960 DEBUG [my.servlet.TestAsyncServlet] doGet called
2011-12-08 13:58:53,960 DEBUG [my.servlet.TestAsyncServlet] doGet created request and finished
2011-12-08 13:59:36,954 TRACE [my.servlet.TestAsyncServlet] respond on item RequestItem [[email protected], message=43FPeEUZWBLqgkAqS3WOFMiHUMVvx6o4jNqWLx8kUvwxqJqpOZyGCtiIcr7yw, timeout=0]
2011-12-08 13:59:36,999 DEBUG [my.servlet.TestAsyncServlet] doGet called
2011-12-08 13:59:36,999 DEBUG [my.servlet.TestAsyncServlet] doGet created request and finished
2011-12-08 14:00:34,957 TRACE [my.servlet.TestAsyncServlet] respond on item RequestItem [[email protected], message=r69Y4NQsyR1vj0kzUlHssic2x1Yrr6T09IGKjWAH1E6Lz4VhFTy9dQHi5CPeTObyjLLBDlCLEDfiyMUnVkVIEgYG7r47Ak4w30RklhzdEi9nthqdfNkry6nyjircsFPX534NqWjI1LwsrGq5nOa3ZYtfjfPVpGlk4KDmWP11L53YntO3GmptZPKa50gcqj9i, timeout=0]
यह देखने के लिए है के रूप में, अगले doGet विधि कहा जाता है के बाद ही पिछले अनुरोध है (सैद्धांतिक रूप से अतुल्यकालिक) जवाब दे दिया। तो पूरी एसिंक चीज बिल्कुल काम नहीं कर रही है! और यहां web.xml घोषणा है:
<servlet>
<servlet-name>TestAsyncServlet</servlet-name>
<servlet-class>my.servlet.TestAsyncServlet</servlet-class>
<async-supported>true</async-supported>
</servlet>
<servlet-mapping>
<servlet-name>TestAsyncServlet</servlet-name>
<url-pattern>/test-async</url-pattern>
</servlet-mapping>
मैं इंटरनेट पर पाया जाने वाला सब कुछ कर रहा हूं। मुझे गलती की जगह नहीं दिखती है। मुझे servlet.xml में कॉन्फ़िगरेशन के लिए कुछ खास नहीं मिला है। तो सवाल यह है कि यह क्यों काम नहीं कर रहा है?
अजीब क्रोम और फ़ायरफ़ॉक्स कई जीईटी अनुरोधों को क्रमबद्ध करने लगते हैं यदि यूआरएल समान है। सफारी हालांकि ऐसा नहीं करता है। – Mark