AMQ在Servlet3.0下出現的問題
阿新 • • 發佈:2019-02-16
這裡通過設定ContinuationListener來保證當超時或者完成時能夠返回給前臺一個空的Ajax報文,不至於出現超時情況。if (message == null && client.getListener().getUndeliveredMessages().size() == 0) { Continuation continuation = ContinuationSupport.getContinuation(request); // Add a listener to the continuation to make sure it actually // will expire (seems like a bug in Jetty Servlet 3 continuations, // see https://issues.apache.org/jira/browse/AMQ-3447 continuation.addContinuationListener(new ContinuationListener() { @Override public void onTimeout(Continuation cont) { if (LOG.isDebugEnabled()) { LOG.debug("Continuation " + cont.toString() + " expired."); } } @Override public void onComplete(Continuation cont) { if (LOG.isDebugEnabled()) { LOG.debug("Continuation " + cont.toString() + " completed."); } } }); if (continuation.isExpired()) { response.setStatus(HttpServletResponse.SC_OK); StringWriter swriter = new StringWriter(); PrintWriter writer = new PrintWriter(swriter); writer.println("<ajax-response>"); writer.print("</ajax-response>"); writer.flush(); String m = swriter.toString(); response.getWriter().println(m); return; } continuation.setTimeout(timeout); continuation.suspend(); LOG.debug( "Suspending continuation " + continuation ); // Fetch the listeners AjaxListener listener = client.getListener(); listener.access(); // register this continuation with our listener. listener.setContinuation(continuation); return; }