Tomcat 彗星与超时

Tomcat 彗星与超时,tomcat,comet,cloud-foundry,Tomcat,Comet,Cloud Foundry,您好,我一直在尝试使用tomcat中的comet制作聊天应用程序。问题是,我已经在云中部署了应用程序,其中开放连接的时间上限为30秒。 因此,每当服务器响应时间超过30秒时(比如当没有聊天信息可以推送时),客户端就会收到一个504异常 那么,这是否意味着彗星技术在我们有时间上限的情况下不起作用 附加代码段 package com.cumulations.clique.ChatHandler; public class AsynchronousGetChatHandler extends Http

您好,我一直在尝试使用tomcat中的comet制作聊天应用程序。问题是,我已经在云中部署了应用程序,其中开放连接的时间上限为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;
    }

}
package com.cumulations.clique.ChatHandler;
公共类AsynchronousGetChatHandler扩展了HttpServlet实现
彗星处理器{
公共静态HashMap consumerConnectionQueue=new HashMap();
public static HashMap consumerPoolingQueue=new HashMap();
public static HashMap consumerSessionQueue=new HashMap();
公共静电连接工厂;
公共静态连接;
公共无效事件(CometEvent事件)引发IOException、ServletException{
HttpServletRequest=event.getHttpServletRequest();
HttpServletResponse=event.getHttpServletResponse();
字符串userName=request.getParameter(“用户名”);
字符串sessionId=request.getParameter(“accesskey”);
AsynchronousGetChatHandler.consumerPoolingQueue.put(用户名“ON”);
试一试{
if(event.getEventType()==CometEvent.EventType.BEGIN){
字符串str=fromRabitQ(用户名);
如果(str!=null){
System.out.println(“传递消息:“+str”);
PrintWriter=response.getWriter();
作者:println(str);
writer.flush();
writer.close();
}
否则{
PrintWriter=response.getWriter();
writer.println(“”);
writer.flush();
writer.close();
}
}
}
捕获(例外e){
抛出新的ServletException(“接收异常”);
//TODO:处理异常
}
}
来自RABITQ(字符串用户名)的公共静态字符串引发异常{
试一试{
渠道;
排队消费者;
字符串队列名称=用户名;
字符串消息=”;
connection=RabbitMqConnection.getConnection();
channel=connection.createChannel();
queueDeclare(队列名称,true,false,false,null);
消费者=新排队消费者(通道);
channel.basicConsume(队列名称,true,消费者);
排队消费者。配送;
交付=消费者下一次交付(27000);
if(传递!=null){
message=新字符串(delivery.getBody());
}否则{
消息=null;
}
channel.basicCancel(consumer.getConsumerTag());
channel.close();
返回消息;
}
捕获(例外e){
System.out.println(“接收时发生异常”+e);
投掷e;
}
}

}

我想说,继续修改

delivery = consumer.nextDelivery(27000);
致:


另外,如果您还可以提供RabbitMqConnection的实现,那就太好了。

请参阅以下回复:谢谢alessandro。。我已经在等待30秒后发送了空响应(实际上我在rabbitMq中等待消息28秒,然后返回空响应)。然而,当我尝试使用jMeter的一些负载时,我可以看到许多请求仍然返回504。由于这些504,我的日志条目变得越来越大。是否有任何方法可以避免至少504的日志记录?您是否尝试过短于28秒的窗口?大概20秒?如果这没有帮助,您可以将源代码发布到您的应用程序中,以及使用JMeter重新生成负载的说明,以便我们可以进一步排除故障吗?嗨,Glenn Oppegard,我已经附上了示例代码。如果我做错了什么,请告诉我。谢谢你的建议。我们试了2000秒,聊天功能在我们名为nukkad(www.nukkad.me)的应用程序中运行良好。所以你不是在做20秒,而是在做2秒,对吗?对不起,那是个打字错误。。这不是2000秒,而是20000毫秒。我试过20sec,效果相当不错。这很有道理。
 delivery = consumer.nextDelivery(20000);