你好,因爲很長一段時間使用彗星Tomcat的聊天應用程序。問題是,我已經在雲中部署了應用程序,在30秒內有一個打開連接的上限。 因此,每次服務器需要超過30秒的響應時間(例如,當沒有聊天消息要推送時)客戶端收到504異常。彗星和超時
那麼這是否意味着彗星技術在我們有時間上限的情況下不起作用?
附加的代碼片段
package com.cumulations.clique.ChatHandler;
public class AsynchronousGetChatHandler extends HttpServlet implements
CometProcessor {
public static HashMap consumerConnectionQueue = new HashMap();
public static HashMap consumerPoolingQueue = new HashMap<String, String>();
public static HashMap consumerSessionQueue = new HashMap<String, Date>();
public static ConnectionFactory factory;
public static Connection connection;
public void event(CometEvent event) throws IOException, ServletException {
HttpServletRequest request = event.getHttpServletRequest();
HttpServletResponse response = event.getHttpServletResponse();
String userName = request.getParameter("userName");
String sessionId = request.getParameter("accesskey");
AsynchronousGetChatHandler.consumerPoolingQueue.put(userName, "ON");
try {
if (event.getEventType() == CometEvent.EventType.BEGIN) {
String str = fromRabitQ(userName);
if (str != null) {
System.out.println("delivering a message: " + str);
PrintWriter writer = response.getWriter();
writer.println(str);
writer.flush();
writer.close();
}
else {
PrintWriter writer = response.getWriter();
writer.println("");
writer.flush();
writer.close();
}
}
}
catch (Exception e) {
throw new ServletException("Recieving exception");
// TODO: handle exception
}
}
public static String fromRabitQ(String userName) throws Exception {
try {
Channel channel;
QueueingConsumer consumer;
String QUEUE_NAME = userName;
String message = "";
connection = RabbitMqConnection.getConnection();
channel = connection.createChannel();
channel.queueDeclare(QUEUE_NAME, true, false, false, null);
consumer = new QueueingConsumer(channel);
channel.basicConsume(QUEUE_NAME, true, consumer);
QueueingConsumer.Delivery delivery;
delivery = consumer.nextDelivery(27000);
if (delivery != null) {
message = new String(delivery.getBody());
} else {
message = null;
}
channel.basicCancel(consumer.getConsumerTag());
channel.close();
return message;
}
catch (Exception e) {
System.out.println("Exception occured while receiveing " + e);
throw e;
}
}
}
看到這個迴應:http://stackoverflow.com/questions/11430841/what-is-the-best-way-to-automatically-reestablish-long-polling-request/11441711#11441711 – 2012-07-19 17:47:57
謝謝alessandro ..我已經在等待30秒後發送空響應(實際上我正在等待rabbitMq中的消息持續28秒,然後返回一個空響應)。但是,當我嘗試從jMeter的一些負載,我可以看到許多請求仍然返回504。由於這些504的我讓我的日誌條目增加的大小。有沒有辦法避免504的日誌? – 2012-07-19 17:55:52
您是否嘗試過短於28秒的窗口?也許20秒?如果這沒有幫助,您可以將源代碼發佈到您的應用程序中,並附帶有關於使用JMeter重現負載的指導,以便我們可以進一步排除故障? – 2012-07-19 20:36:31