package com.mogujie.tt.biz;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.BlockingQueue;
import com.mogujie.tt.cache.AutoCloseable;
import com.mogujie.tt.cache.CacheModel;
import com.mogujie.tt.cache.Dispatcher;
import com.mogujie.tt.cache.MessageCacheImpl;
import com.mogujie.tt.config.SysConstant;
import com.mogujie.tt.entity.MessageInfo;
import com.mogujie.tt.log.Logger;
/**
* @Description 业务消息分发中心
* @date 2014-7-12
*/
public class MessageDistCenter implements Dispatcher, AutoCloseable, Runnable {
private static Logger logger = Logger.getLogger(MessageDistCenter.class);
private BlockingQueue<MessageInfo> msgQueue = null;
private Thread mqThread = null;
private volatile boolean run = true;
private static MessageDistCenter instance;
public static MessageDistCenter getInstance() {
if (null == instance) {
instance = new MessageDistCenter();
}
return instance;
}
public MessageDistCenter() {
init();
}
public void init() {
this.msgQueue = new ArrayBlockingQueue<MessageInfo>(SysConstant.MESSAGE_QUEUE_LIMIT);
this.mqThread = new Thread(this, "Message Queue Thread");
this.mqThread.setDaemon(true);
this.mqThread.start();
}
@Override
public void close() throws Exception {
this.setRun(false);
}
@Override
public void run() {
while (this.run) {
if (0 < msgQueue.size()) {
MessageInfo messageInfo = msgQueue.poll();
if (null != messageInfo) {
this.dispatch(messageInfo);
}
} else {
try {
Thread.sleep(100);
} catch (Exception e) {
logger.e(e.getMessage());
}
}
}
}
/*
* 把一条消息推入消息队列,把不合法的消息Kill在门外
*/
public boolean push(MessageInfo msginfo) {
if (null == msginfo) {
logger.e("空消息");
return false;
}
// if (SysConstant.DEFAULT_MESSAGE_ID == msginfo.msgId) {
// logger.e("不合法的消息");
// return false;
// }
if (msgQueue.size() < SysConstant.MESSAGE_QUEUE_LIMIT) {
this.msgQueue.add(msginfo);
return true;
} else {
logger.e("Queue full");
return false;
}
}
/**
* @return the run
*/
public boolean isRun() {
return run;
}
/**
* @param run the run to set
*/
public void setRun(boolean run) {
this.run = run;
}
public void setQueue(BlockingQueue<MessageInfo> queue) {
this.msgQueue = queue;
}
@Override
public void dispatch(MessageInfo messageInfo) {
if (messageInfo.getIsSend()) {
CacheModel.getInstance().pushMsg(messageInfo);
MessageCacheImpl.getInstance().set(messageInfo.getTargetId(), messageInfo);
} else if (!messageInfo.getIsSend()) {
CacheModel.getInstance().pushMsg(messageInfo);
MessageCacheImpl.getInstance().set(messageInfo.getMsgFromUserId(), messageInfo);
MessageCacheImpl.getInstance().incUnreadCount(messageInfo.getMsgFromUserId(), 1);
MessageNotifyCenter.getInstance().doNotify(SysConstant.EVENT_UNREAD_MSG);
}
}
}