package org.zbus.server.mq;
import java.io.IOException;
import java.io.Serializable;
import java.util.List;
import java.util.concurrent.ExecutorService;
import org.zbus.common.logging.Logger;
import org.zbus.common.logging.LoggerFactory;
import org.zbus.common.protocol.ConsumerInfo;
import org.zbus.common.protocol.MqInfo;
import org.zbus.common.remoting.Message;
import org.zbus.common.remoting.nio.Session;
import org.zbus.server.mq.store.MessageStore;
/**
* 消息队列抽象类: 有多种实现类: PubsubQueue, ReplyQueue, RequestQueue
* Message + Queue分为: 实际上实现类都是对Message进行操作
* Pubsub + Queue : 发布订阅消息的队列
* Reply + Queue : 消息应答队列
* Request + Queue : 消息请求队列
*/
public abstract class MessageQueue implements Serializable{
private static final long serialVersionUID = 5719362844495027862L;
private static final Logger log = LoggerFactory.getLogger(MessageQueue.class);
protected final String broker;
protected final String name;
protected String creator;
protected long createdTime = System.currentTimeMillis();
protected String accessToken = "";
protected final int mode;
protected transient ExecutorService executor;
protected transient MessageStore messageStore = null;
public MessageQueue(String broker, String name, ExecutorService executor, int mode){
this.broker = broker;
this.name = name;
this.executor = executor;
this.mode = mode;
}
public abstract void produce(Message msg, Session sess) throws IOException;
public abstract void consume(Message msg, Session sess) throws IOException;
//实现类自己实现消息分发机制
abstract void doDispatch() throws IOException;
public abstract void cleanSession();
//使用多线程执行消息分发流程
void dispatch(){
executor.submit(new Runnable() {
@Override
public void run() {
try {
MessageQueue.this.doDispatch();
} catch (IOException e) {
log.error(e.getMessage(), e);
}
}
});
}
public long getCreatedTime() {
return createdTime;
}
public void setCreatedTime(long createdTime) {
this.createdTime = createdTime;
}
public String getAccessToken() {
return accessToken;
}
public void setAccessToken(String accessToken) {
this.accessToken = accessToken;
}
public String getName() {
return name;
}
public String getCreator() {
return creator;
}
public void setCreator(String creator) {
this.creator = creator;
}
public int getMode() {
return mode;
}
public ExecutorService getExecutor() {
return executor;
}
public void setExecutor(ExecutorService executor) {
this.executor = executor;
}
public MqInfo getMqInfo(){
MqInfo info = new MqInfo();
info.setBroker(broker);
info.setName(name);
info.setCreator(creator);
info.setCreatedTime(createdTime);
info.setUnconsumedMsgCount(this.getMessageQueueSize());
info.setConsumerInfoList(getConsumerInfoList());
info.setMode(this.mode);
return info;
}
public abstract int getMessageQueueSize();
public abstract List<ConsumerInfo> getConsumerInfoList();
/**
* 为支持浏览器,特定处理消息状态
* @param msg
*/
public void prepareMessageStatus(Message msg){
String status = msg.getStatus();
if(status == null){
status = msg.getReplyCode();
if(status == null){
status = "200"; //default to OK
}
msg.setStatus(status);
}
}
@Override
public String toString() {
return "MQ [name=" + name + ", creator=" + creator + ", createdTime=" + createdTime + "]";
}
public MessageStore getMessageStore() {
return messageStore;
}
public void setMessageStore(MessageStore messageStore) {
this.messageStore = messageStore;
}
}