/**
*
*/
package com.chamago.cometserver;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import javax.servlet.ServletConfig;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import com.chamago.cometserver.connection.CometConnection;
import com.chamago.cometserver.connection.CometConnectionManager;
import com.chamago.cometserver.connection.RedisClientManager;
import com.chamago.cometserver.connection.StreamCometConnection;
public class ReceMsgServlet extends HttpServlet {
private final static Log LOG = LogFactory
.getLog(ReceMsgServlet.class);
private CometConnectionManager connectionManager;
/**
*
*/
private static final long serialVersionUID = 7791301745498733988L;
@Override
public void init(ServletConfig config) {
LOG.info("启动接收消息服务");
Object obj = config.getServletContext().getAttribute("cometserver.connect.manager");
if(obj!=null){
connectionManager = (CometConnectionManager)obj;
}else{
LOG.info("启动错误,主服务初始化失败");
}
}
@Override
public void doPost(HttpServletRequest request, HttpServletResponse response) {
try {
String appkey = request.getParameter(StreamConstants.PARAM_APPKEY);
String subject = request.getParameter(StreamConstants.PARAM_SUBJECT);
String[] contents = request.getParameterValues(StreamConstants.PARAM_CONTENT);
int code = 0;
String err = "success";
if(contents!=null&&contents.length>0){
CometConnection connect = this.connectionManager.findCometConnection(appkey);
if(connect!=null){
List<PullEvent> events = new ArrayList<PullEvent>();
for(String msg:contents){
PullEvent pe = new PullEvent(appkey,StreamConstants.NEW_MESSAGE,subject,msg);
events.add(pe);
}
((StreamCometConnection)connect).batchPullEvent(events);
events.clear();
events = null;
}else{
if(CometServer.NO_DISCARD){
RedisClientManager rcm = RedisClientManager.getInstance();
for(String msg:contents){
PullEvent pe = new PullEvent(appkey,StreamConstants.NEW_MESSAGE,subject,msg);
rcm.saveMsg(pe.getAppkey(), pe.getId(), pe.toString());
}
}else{
code = 1;
err = "客户端appkey["+appkey+"]没有和服务端建立连接,忽略掉该appkey的消息";
LOG.warn(err);
}
}
}
this.sendMsg(response, code, err);
} catch (Exception e) {
try {
this.sendMsg(response, 2,e.getMessage());
} catch (IOException e1) {
e1.printStackTrace();
}
e.printStackTrace();
} finally{
try {
response.getWriter().close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
@Override
public void destroy() {
}
public void sendMsg(HttpServletResponse response,int code,String msg) throws IOException{
response.setCharacterEncoding("UTF-8");
StringBuilder xmlC = new StringBuilder("<?xml version=\"1.0\" encoding=\"UTF-8\"?>");
xmlC.append("<response>");
xmlC.append("<code>").append(code).append("</code>");
xmlC.append("<error>").append(msg).append("</error>");
xmlC.append("</response>");
response.getWriter().write(xmlC.toString());
}
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
}
}