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