namespace AsiaINFO.SMS.APPCMPP2.MyThread.CMPPThread
|
{
|
using AsiaINFO.SMS.APPCMPP2;
|
using AsiaINFO.SMS.APPCMPP2.MyThread;
|
using AsiaINFO.SMS.CMPP2;
|
using AsiaINFO.SMS.Entity;
|
using System;
|
using System.Collections;
|
using System.Collections.Generic;
|
using System.Threading;
|
using System.IO;
|
|
public class SubmitRespThread : CMPPThreadBase
|
{
|
private Dictionary<ulong, SubmitInfo> _slidingWindowDic;
|
private SyncEvents _slidingWindowEvents;
|
private SyncEvents _submitOKEvents;
|
private Queue<SubmitInfo> _submitOKQueue;
|
private Queue<byte[]> _submitRespQueue;
|
private object _syncSlidingWindowDicObject;
|
private CMPP_SUBMIT_RESP response;
|
private SubmitInfo submit;
|
|
|
|
public SubmitRespThread(CMPPClient cmppClient, SyncEvents syncEvents, object syncSlidingWindowDicObject, Dictionary<ulong, SubmitInfo> slidingWindowDic, SyncEvents slidingWindowEvents, Queue<SubmitInfo> submitOKQueue, SyncEvents submitOKEvents, Queue<byte[]> submitRespQueue) : base(cmppClient, syncEvents)
|
{
|
if (((syncSlidingWindowDicObject == null) || (slidingWindowDic == null)) || (((submitOKQueue == null) || (submitOKEvents == null)) || (submitRespQueue == null)))
|
{
|
throw new Exception("SubmitRespThread参数不能为空!");
|
}
|
this._syncSlidingWindowDicObject = syncSlidingWindowDicObject;
|
this._slidingWindowDic = slidingWindowDic;
|
this._slidingWindowEvents = slidingWindowEvents;
|
this._submitOKQueue = submitOKQueue;
|
this._submitOKEvents = submitOKEvents;
|
this._submitRespQueue = submitRespQueue;
|
}
|
|
|
private void DealData(byte[] data)
|
{
|
try
|
{
|
int count = 0;
|
CMPP_SUBMIT_RESP cmpp_submit_resp = new CMPP_SUBMIT_RESP(data);
|
lock (this._syncSlidingWindowDicObject)
|
{
|
this._slidingWindowDic.TryGetValue((ulong) cmpp_submit_resp.Header.Sequence_Id, out this.submit);
|
}
|
if (this.submit != null)
|
{
|
lock (this._syncSlidingWindowDicObject)
|
{
|
OnMsg($"[_slidingWindowDic]移除已经提交的数据------Guid:{submit.MTWait.Guid},号码:{submit.MTWait.MOBILE_NO}",MsgLevel.Debug);
|
this._slidingWindowDic.Remove((ulong) cmpp_submit_resp.Header.Sequence_Id);
|
count = this._slidingWindowDic.Count;
|
}
|
this.submit.Result = cmpp_submit_resp.Result;
|
this.submit.RespMsgID = cmpp_submit_resp.Msg_Id;
|
string msg = string.Format("收到SUBMIT反馈 MsgID={0} State={1},------时间:"+DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff"), this.submit.RespMsgID, this.submit.Result);
|
base.OnMsg(msg, MsgLevel.Debug);
|
this._submitOKData = this.submit;
|
this._submitOKEvents.NewItemEvent.Set();
|
if (count <= 0)
|
{
|
this._slidingWindowEvents.NewItemEvent.Set();
|
}
|
}
|
}
|
catch (Exception exception)
|
{
|
base.OnMsg("[CMPP_SUBMIT_RESP]异常:" + exception.Message, MsgLevel.Err);
|
}
|
}
|
|
protected override void Run()
|
{
|
byte[] data = null;
|
while (WaitHandle.WaitAny(base._syncEvents.EventArray) != 1)
|
{
|
Label_0004:
|
data = null;
|
lock (((ICollection) this._submitRespQueue).SyncRoot)
|
{
|
if (this._submitRespQueue.Count > 0)
|
{
|
data = this._submitRespQueue.Dequeue();
|
}
|
}
|
if (data != null)
|
{
|
this.DealData(data);
|
goto Label_0004;
|
}
|
}
|
base.Stop();
|
}
|
|
public override void Stop()
|
{
|
if ((base._thread != null) && (base._thread.ThreadState == ThreadState.Suspended))
|
{
|
base.StartRun();
|
}
|
base._syncEvents.ExitThreadEvent.Set();
|
}
|
|
private int _submitDicCount
|
{
|
get
|
{
|
lock (this._syncSlidingWindowDicObject)
|
{
|
return this._slidingWindowDic.Count;
|
}
|
}
|
}
|
|
private SubmitInfo _submitOKData
|
{
|
get
|
{
|
lock (((ICollection) this._submitOKQueue).SyncRoot)
|
{
|
if (this._submitOKQueue.Count > 0)
|
{
|
return this._submitOKQueue.Dequeue();
|
}
|
}
|
return null;
|
}
|
set
|
{
|
lock (((ICollection) this._submitOKQueue).SyncRoot)
|
{
|
this._submitOKQueue.Enqueue(value);
|
}
|
}
|
}
|
|
private byte[] _submitRespData
|
{
|
get
|
{
|
lock (((ICollection) this._submitRespQueue).SyncRoot)
|
{
|
if (this._submitRespQueue.Count > 0)
|
{
|
return this._submitRespQueue.Dequeue();
|
}
|
}
|
return null;
|
}
|
}
|
}
|
}
|