private void EndPointDestroyedEventHandler(object sender, AdapterEndPointEventArgs e) { TcpAdapterEndPoint endPoint = (TcpAdapterEndPoint)e.EndPoint; VocollectSession session = null; lock (endPointDictionary) { if (endPointDictionary.ContainsKey(endPoint)) { session = endPointDictionary[endPoint]; endPointDictionary.Remove(endPoint); } } if (session != null) { try { if (endPoint.Exception != null) { session.ReleaseLock(false); /* Do not log ObjectDisposedException since this indicates we got a timeout */ if (!(endPoint.Exception is ObjectDisposedException)) { if ((MessageEngine.Instance.Tracing.Switch.Level & SourceLevels.Error) == SourceLevels.Error) { MessageEngine.Instance.Tracing.TraceData(TraceEventType.Error, 0, endPoint.Exception); } } } else { session.ReleaseLock(true); } } catch (ObjectDisposedException) { //Session has been disposed } } }
private bool IsDuplicate(MultiPartMessage msg, VocollectSession session, TcpAdapterEndPoint endPoint) { int hashCode = msg.Properties.ReadAsInt("HashCode"); int sequence = msg.Properties.ReadAsInt("Sequence"); DateTime timeStamp = (DateTime)msg.Properties.Read("TimeStamp"); if (msg.Properties.ReadAsString("MessageType").Contains("ODR")) { if ((timeStamp <= session.LastTimeStamp) && (session.LastRequestMessage != null) && (session.LastResponseMessage != null) && (session.LastRequestMessage.Properties.ReadAsInt("HashCode") == hashCode) && (sequence <= session.LastRequestMessage.Properties.ReadAsInt("Sequence"))) { /* Duplicate ODR message */ return(true); } /* Message is valid update timestamp */ session.LastTimeStamp = timeStamp; } else { /* Removed due to time synchronization issues, timestamp from terminal not accurate enough to be useful */ //((TcpAdapter)endPoint.Adapter).SetEndPointTimeout(endPoint, timeStamp.AddMilliseconds(Configuration.ReadAsInt("PendingOperationsTimeout"))); /* Always update timestamp for LUT messages */ session.LastTimeStamp = timeStamp; if ((!session.LastOperationSuccessful) && (session.LastRequestMessage != null) && (session.LastResponseMessage != null) && (session.LastRequestMessage.Properties.ReadAsInt("HashCode") == hashCode)) { /* Duplicate LUT message */ return(true); } } return(false); }
private bool CanProcess(MultiPartMessage msg) { VocollectSession session = SessionManager.Instance[msg.Properties.ReadAsString("SerialNumber")]; /* Safe guard to ensure reset of session after new logon */ if ((session != null) && (msg.Properties.ReadAsString("MessageType") == "PrTaskLUTCoreConfiguration")) { SessionManager.Instance.DestroySession(msg.Properties.ReadAsString("SerialNumber")); session.Dispose(); session = null; } TcpAdapterEndPoint endPoint = MessageEngine.Instance.AdapterProxy.ResolveUriToEndPoint((Uri)msg.Metadata.Read("ReceiveUri")) as TcpAdapterEndPoint; if ((session != null) && (endPoint != null)) { try { if (!session.AcquireLock(Configuration.ReadAsInt("PendingOperationsTimeout"))) { /* Thread timed out or aborted due to a newer request */ if ((MessageEngine.Instance.Tracing.Switch.Level & SourceLevels.Warning) == SourceLevels.Warning) { MessageEngine.Instance.Tracing.TraceEvent(TraceEventType.Warning, 0, "Thread timed out waiting for a pending operation to complete."); } return(false); } } catch (ObjectDisposedException) { return(false); } lock (endPointDictionary) { endPointDictionary.Add(endPoint, session); } if (IsDuplicate(msg, session, endPoint)) { /* Message is duplicate, retransmit last response */ if ((MessageEngine.Instance.Tracing.Switch.Level & SourceLevels.Warning) == SourceLevels.Warning) { MessageEngine.Instance.Tracing.TraceEvent(TraceEventType.Warning, 0, "Message timeout detected, retransmitting last response."); } MultiPartMessage retransmitMsg = session.LastResponseMessage; retransmitMsg.Metadata.Write("Loopback", false); retransmitMsg.Metadata.Write("SendUri", msg.Metadata.Read("ReceiveUri")); MessageEngine.Instance.TransmitMessage(retransmitMsg); return(false); } else { /* Message is valid, continue processing */ session.LastRequestMessage = msg; session.LastResponseMessage = null; } } return(true); }