package com.mogujie.tt.packet;
import android.os.Process;
import com.mogujie.tt.config.ProtocolConstant;
import com.mogujie.tt.config.SysConstant;
import com.mogujie.tt.conn.ConnectionStore;
import com.mogujie.tt.log.Logger;
import com.mogujie.tt.packet.action.Action;
import com.mogujie.tt.packet.action.ActionCallback;
import com.mogujie.tt.socket.MoGuSocket;
public class PacketSendMonitor {
public static final int DEFAULT_PACKET_SEND_MONTOR_INTERVAL = 10;
private Monitor mMonitor;
private volatile boolean mNeedStop;
private volatile boolean mStarted = false;
private Logger logger = Logger.getLogger(PacketSendMonitor.class);
public PacketSendMonitor(int interval) {
if (interval <= 0) {
mMonitor = new Monitor("DUODUO-packet-send-monitor",
Process.THREAD_PRIORITY_BACKGROUND,
DEFAULT_PACKET_SEND_MONTOR_INTERVAL);
} else {
mMonitor = new Monitor("DUODUO-packet-send-monitor",
Process.THREAD_PRIORITY_BACKGROUND, interval);
}
// Logger.getLogger(PacketSendMonitor.class).d("start PacketSendMonitor !!!");
// mMonitor.start();
}
public synchronized void start() {
if (mStarted)
return;
mNeedStop = false;
mMonitor.start();
Logger.getLogger(PacketSendMonitor.class).d(
"start PacketSendMonitor !!!");
mStarted = true;
}
public synchronized void stop() {
if (mNeedStop) {
return;
}
mNeedStop = true;
mStarted = false;
}
private class Monitor extends Thread {
private int mInterval;
public Monitor(String name, int priority, int interval) {
setName(name);
setPriority(priority);
mInterval = interval;
}
@Override
public void run() {
super.run();
try {
while (!mNeedStop) {
Action action = SocketMessageQueue.getInstance().getFront();
boolean bSuccess = false;
int sid = 0;
int cid = 0;
do {
if (action == null)
break;
final long currentTime = System.currentTimeMillis();
final long timeStamp = action.getTimeStamp();
final int timeout = action.getTimeout();
// 在队列中时间过长
if (timeStamp + timeout < currentTime) {
SocketMessageQueue.getInstance().pull();
// 重放入队列
if (action.minusRepeatCountIfFaild() >= 0) {
SocketMessageQueue.getInstance().submitAndEnqueue(action);
} else {
ActionCallback callback = action.getCallback();
if (callback != null) {
callback.onFaild(action.getPacket());
}
}
break;
}
sid = action.getPacket().getRequest().getHeader()
.getServiceId();
cid = action.getPacket().getRequest().getHeader()
.getCommandId();
// 这里需要区分一下用哪一个SOCKET发送
MoGuSocket messageClient = ConnectionStore
.getInstance().get(
SysConstant.CONNECT_MSG_SERVER);
if (sid == ProtocolConstant.SID_LOGIN
&& cid == ProtocolConstant.CID_LOGIN_REQ_MSGSERVER) {
messageClient = ConnectionStore.getInstance()
.get(SysConstant.CONNECT_LOGIN_SERVER);
} else {
}
if (messageClient == null)
break;
// 移除队列
SocketMessageQueue.getInstance().pull();
// 加入超时监视
if (action.getPacket().getNeedMonitor()) {
Logger.getLogger(PacketSendMonitor.class).d(
"push an action into waiting list :seqNo = "
+ action.getSequenceNo());
SocketMessageQueue.getInstance().add2WaitingList(
action);
Logger.getLogger(PacketSendMonitor.class).d(
"push success");
}
// if((sid != ProtocolConstant.SID_MSG) ||((sid ==
// ProtocolConstant.SID_MSG) && (cid !=
// ProtocolConstant.CID_MSG_DATA))) {
bSuccess = messageClient.sendPacket(action.getPacket());
// }
} while (false);
if (bSuccess)
Logger.getLogger(PacketSendMonitor.class).d(
"send message success : sid = " + sid
+ " cid = " + cid + " seqNo = "
+ action.getSequenceNo());
if (action == null
) {
sleep(mInterval);
}
}
} catch (Exception e) {
logger.e(e.getMessage());
}
}
}
}