2012-07-19 93 views
0

你好,因为很长一段时间使用彗星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; 
    } 

} 

}

+0

看到这个回应:http://stackoverflow.com/questions/11430841/what-is-the-best-way-to-automatically-reestablish-long-polling-request/11441711#11441711 – 2012-07-19 17:47:57

+0

谢谢alessandro ..我已经在等待30秒后发送空响应(实际上我正在等待rabbitMq中的消息持续28秒,然后返回一个空响应)。但是,当我尝试从jMeter的一些负载,我可以看到许多请求仍然返回504。由于这些504的我让我的日志条目增加的大小。有没有办法避免504的日志? – 2012-07-19 17:55:52

+0

您是否尝试过短于28秒的窗口?也许20秒?如果这没有帮助,您可以将源代码发布到您的应用程序中,并附带有关于使用JMeter重现负载的指导,以便我们可以进一步排除故障? – 2012-07-19 20:36:31

回答

1

我说那就去修改

delivery = consumer.nextDelivery(27000); 

到:

delivery = consumer.nextDelivery(20000); 

此外,如果您也可以提供你的执行认为RabbitMqConnection会很棒。

+0

感谢您的建议。我们尝试了2000秒,聊天功能在我们的应用程序nukkad(www.nukkad.me) – 2012-08-05 03:36:28

+0

Cool中运行良好。因此,而不是20秒,你正在做2秒正确? – 2012-08-06 17:05:10

+0

对不起,这是一个错字..它不是2000秒,但20000毫秒。我试了20秒,其相当好的工作很好 – 2012-08-06 19:07:04