Tôi đã cố gắng thực hiện trò chuyện COMET bằng cách sử dụng Async Processing được định nghĩa trong Servlet API 3. Nó không hoạt động - trò chuyện đã bị chặn, vì vậy tôi đã tạo ra servlet debug để kiểm tra phần async .Tomcat 7 Xử lý không đồng bộ không thành công - chỉ một yêu cầu được xử lý đồng thời
Đây là phương pháp doGet tôi:
@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");
}
Tôi đang đặt mục yêu cầu trong hàng đợi, và có một sợi chạy, sẽ đưa các mặt hàng thời gian chờ sau khi quy định và gửi thư trả lời để AsyncContext, thông điệp in ấn về nó . Vấn đề là, thread bị chặn cho đến khi AsyncContext được trả lời. Đây là những gì có thể nhìn thấy trong nhật ký của tôi sau khi yêu cầu 4 tải trang trong trình duyệt:
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]
Vì nó là để xem, phương pháp doGet tiếp theo được gọi là chỉ sau khi yêu cầu trước đó là (về mặt lý thuyết không đồng bộ) đã trả lời. Vì vậy, toàn bộ điều không đồng bộ là không làm việc ở tất cả! Và đây là khai báo 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>
Tôi đang làm tất cả những gì được tìm thấy trên Internet. Tôi không thấy nơi xảy ra sai lầm. Tôi đã tìm thấy không có gì đặc biệt để cấu hình trong servlet.xml. Vì vậy, câu hỏi là, tại sao nó không hoạt động như nó nên?
Kỳ lạ Chrome và Firefox dường như tuần tự hóa nhiều yêu cầu GET nếu URL giống nhau. Safari không làm điều đó mặc dù. – Mark