2012-07-19 126 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