using System; using System.Collections.Generic; using System.ComponentModel; using System.Threading.Tasks; using System.Windows.Forms; using TIBCO.Rendezvous; using Message = TIBCO.Rendezvous.Message; namespace JWH.TIB { public class TibRendezvous { #region [ Static ] ==================================================== private static bool IsOpen { get; set; } = false; public static void Open(XLogger logger = null) { if (IsOpen) return; try { IsOpen = true; if (logger == null) logger = XLogger.Instance; logger.Info($"TIBCO.Rendezvous.Environment.Open()"); TIBCO.Rendezvous.Environment.Open(); } catch (Exception ex) { if (logger != null) logger.Fatal(ex); throw ex; } } public static void Close(XLogger logger = null) { if (!IsOpen) return; try { IsOpen = false; if (logger == null) logger = XLogger.Instance; logger.Info($"TIBCO.Rendezvous.Environment.Close()"); TIBCO.Rendezvous.Environment.Close(); } catch (Exception ex) { if (logger != null) logger.Fatal(ex); throw ex; } } #endregion #region [ Event ] ===================================================== private delegate void ServiceStartHandler(); public delegate void OnTransportHandler(TibRendezvous sender, XmlMessage xmlMessage); public delegate void OnListenerHandler(Listener sender, XmlMessage xmlMessage); public delegate void OnListenerInfoHandler(ListenerInfo sender, XmlMessage xmlMessage); public delegate void OnListenerInfoEventHandler(ListenerInfo sender, TibRendezvousEventArgs args); public delegate void OnExceptionHandler(TibRendezvous sender, XmlMessage xmlMessage, Exception ex); /// /// Communication Started /// public event EventHandler OnStarted; /// /// Communication Stoped /// public event EventHandler OnStoped; /// /// Message Send /// public event OnTransportHandler OnSend; /// /// Message Sent /// public event OnTransportHandler OnSent; /// /// Message Received /// public event OnListenerInfoHandler OnReceived; /// /// Timeout Exception(SendRequest, SendReply) /// public event OnExceptionHandler OnTimeout; /// /// TIBCO.Rendezvous Event /// public event OnListenerInfoEventHandler OnEvent; #endregion #region [ Rendezvous.Variable ] ======================================= /// /// Rendezvous Server Information(서버 이상 발생시, 환형구조로 다음 서버로 연결한다) /// public List ServerInfos { get; protected set; } = new List(); /// /// Current Rendezvous Server Information /// public ServerInfo ServerInfo { get; protected set; } = null; /// /// Transport /// public Transport Transport { get; set; } = null; /// /// Rendezvous Listener Information /// public List Listeners { get; protected set; } = new List(); /// /// Rendezvous Listener Information (System Event) /// public ListenerSystem ListenerSystem { get; set; } = null; #endregion #region [ Variable ] ================================================== #endregion #region [ Properties ] ================================================ /// /// Logger /// public XLogger Logger { get; set; } = XLogger.Instance; /// /// 이벤트 보고시, Invoke 처리를 위한 상위객체 /// public Control Parent { get; set; } = null; /// /// Message 전송시, Thread 방식을 사용할 것인지를 설정한다 /// public bool UseThreadSend { get; set; } = true; /// /// 수신된 SendRequest 메시지를 보관한다 /// public Dictionary SendRequestMessages { get; protected set; } = new Dictionary(); /// /// SendRequest 수신후, SendReply 전송시간 (기본값: 30초) /// [DefaultValue(30)] public int SendRequestTime { get; set; } = 30; /// /// SendRequest 전송후, SendReply 메시지 수신시간 (기본값: 30초) /// [DefaultValue(30)] public int SendReplyTime { get; set; } = 30; #endregion #region [ Constructor ] =============================================== public TibRendezvous() { } public TibRendezvous(XLogger logger = null) { this.Logger = logger; } public TibRendezvous(ServerInfo serverInfo, XLogger logger = null) : this() { try { this.Logger = logger; this.ServerInfo = serverInfo; } catch (Exception ex) { throw ex; } } #endregion #region [ Raise_Events ] ============================================== private void Raise_OnStarted() { try { if (this.OnStarted == null) return; if (this.Parent != null && this.Parent.InvokeRequired) this.Parent.BeginInvoke(new EventHandler(this.OnStarted), this, new EventArgs()); else this.OnStarted?.Invoke(this, new EventArgs()); } catch (Exception ex) { throw ex; } } private void Raise_OnStoped() { try { if (this.OnStoped == null) return; if (this.Parent != null && this.Parent.InvokeRequired) this.Parent.BeginInvoke(new EventHandler(this.OnStoped), this, new EventArgs()); else this.OnStoped?.Invoke(this, new EventArgs()); } catch (Exception ex) { throw ex; } } private void Raise_OnSend(XmlMessage xmlMessage) { try { if (this.OnSend == null) return; if (this.Parent != null && this.Parent.InvokeRequired) this.Parent.BeginInvoke(new OnTransportHandler(this.OnSend), this, xmlMessage); else this.OnSend?.Invoke(this, xmlMessage); } catch (Exception ex) { throw ex; } } private void Raise_OnSent(XmlMessage xmlMessage) { try { this.SendRequestMessage_Remove(xmlMessage); if (this.OnSent == null) return; if (this.Parent != null && this.Parent.InvokeRequired) this.Parent.BeginInvoke(new OnTransportHandler(this.OnSent), this, xmlMessage); else this.OnSent?.Invoke(this, xmlMessage); } catch (Exception ex) { throw ex; } } private void Raise_OnReceived(ListenerInfo sender, XmlMessage xmlMessage) { try { this.Logger.Info($"SendSubject='{xmlMessage.SendSubject}', ReplySubject='{xmlMessage.ReplySubject}', SendRequestFlag='{xmlMessage.SendRequestFlag}'"); if (this.OnReceived == null) return; if (this.Parent != null && this.Parent.InvokeRequired) this.Parent.BeginInvoke(new OnListenerInfoHandler(this.OnReceived), sender, xmlMessage); else this.OnReceived?.Invoke(sender, xmlMessage); } catch (Exception ex) { throw ex; } } private void Raise_OnEvent(ListenerInfo sender, TibRendezvousEventArgs args) { try { if (this.OnEvent == null) return; if (this.Parent != null && this.Parent.InvokeRequired) this.Parent.BeginInvoke(new OnListenerInfoEventHandler(this.OnEvent), sender, args); else this.OnEvent?.Invoke(sender, args); } catch (Exception ex) { throw ex; } } private void Raise_OnTimeout(XmlMessage xmlMessage, Exception ex) { try { if (this.OnTimeout == null) return; if (this.Parent != null && this.Parent.InvokeRequired) this.Parent.BeginInvoke(new OnExceptionHandler(this.OnTimeout), this, xmlMessage, ex); else this.OnTimeout?.Invoke(this, xmlMessage, ex); } catch (Exception ex1) { throw ex1; } } #endregion #region [ Public Method ] ============================================= /// /// Communication Start /// public void Start() { try { this.Logger.Info(); this.NextServerInfo(); if (this.ServerInfo == null) return; TibRendezvous.Open(); ServiceStartHandler startMethod = null; switch (this.ServerInfo.TransportType) { case TransportType.Reliable: startMethod = this.RMServiceStart; break; case TransportType.Certiry: startMethod = this.CMServiceStart; break; case TransportType.Distributed: startMethod = this.DQServiceStart; break; } startMethod(); } catch (Exception ex) { throw ex; } } /// /// Communication Start /// public void Restart() { try { this.Logger.Info(); if (this.ServerInfo == null) this.NextServerInfo(); if (this.ServerInfo == null) return; TibRendezvous.Open(); ServiceStartHandler startMethod = null; switch (this.ServerInfo.TransportType) { case TransportType.Reliable: startMethod = this.RMServiceStart; break; case TransportType.Certiry: startMethod = this.CMServiceStart; break; case TransportType.Distributed: startMethod = this.DQServiceStart; break; } startMethod(); } catch (Exception ex) { throw ex; } } /// /// Stop /// public void Stop() { this.Logger.Info(); this.ServiceStop(); } #endregion #region [ Method ] ==================================================== /// /// RM ServiceStart(Reliable Message) /// private void RMServiceStart() { try { this.ServiceStop(); this.Logger.Info(); this.Logger.Info($"NetTransport({this.ServerInfo.Service}, {this.ServerInfo.Network}, {this.ServerInfo.Daemon})"); NetTransport netTransport = new NetTransport(this.ServerInfo.Service, this.ServerInfo.Network, this.ServerInfo.Daemon); this.Transport = netTransport; #region [ Event Listener : Failover ] { ListenerSystem listenerSys = new ListenerSystem(); listenerSys.Name = "SYSTEM"; listenerSys.Subject = $"_RV.*.*.*.*"; this.ListenerSystem = listenerSys; Queue queue = new Queue(); queue.Name = listenerSys.Name; Listener listener = new Listener(queue, listenerSys.ReceivedMessage, this.Transport, listenerSys.Subject, null); this.Logger.Info($"Listener({queue.GetType().Name}, ReceivedMessage, {listener?.Transport.GetType().Name}, {listener.Subject}, null)"); listenerSys.Logger = this.Logger; listenerSys.Listener = listener; listenerSys.OnReceivedMessage += this.OnReceivedMessage; listenerSys.OnReceivedEvent += this.OnReceivedEvent; listenerSys.QueueDispatch(); } #endregion foreach (ListenerInfo listenerInfo in this.Listeners) { if (string.IsNullOrEmpty(netTransport.Description)) netTransport.Description = $"{listenerInfo.Subject}"; Queue queue = new Queue(); queue.Name = listenerInfo.Name; Listener listener = new Listener(queue, listenerInfo.ReceivedMessage, this.Transport, listenerInfo.Subject, null); this.Logger.Info($"Listener({queue.GetType().Name}, ReceivedMessage, {listener?.Transport.GetType().Name}, {listener.Subject}, null)"); listenerInfo.Logger = this.Logger; listenerInfo.Listener = listener; listenerInfo.OnReceivedMessage += this.OnReceivedMessage; listenerInfo.OnReceivedEvent += this.OnReceivedEvent; listenerInfo.QueueDispatch(); } this.Raise_OnStarted(); } catch (RendezvousException ex) { this.Logger.Fatal(ex); throw ex; } catch (Exception ex) { this.Logger.Fatal(ex); throw ex; } } /// /// CM ServiceStart(Certiry Message) /// private void CMServiceStart() { try { this.ServiceStop(); this.Logger.Info(); this.Logger.Info($"NetTransport({this.ServerInfo.Service}, {this.ServerInfo.Network}, {this.ServerInfo.Daemon})"); NetTransport netTransport = new NetTransport(this.ServerInfo.Service, this.ServerInfo.Network, this.ServerInfo.Daemon); //this.Transport = netTransport; this.Logger.Info($"CMTransport(NetTransport, {this.ServerInfo.CMName}, {this.ServerInfo.RequestOld}, {this.ServerInfo.LedgerName}, {this.ServerInfo.SyncLedger})"); CMTransport cmTransport = new CMTransport(netTransport, this.ServerInfo.CMName, this.ServerInfo.RequestOld, this.ServerInfo.LedgerName, this.ServerInfo.SyncLedger); //this.Logger.Info($"CMTransport(NetTransport, {this.ServerInfo.CMName}, {this.ServerInfo.RequestOld}, {this.ServerInfo.LedgerName}, {this.ServerInfo.SyncLedger})"); //CMTransport cmTransport = new CMTransport(netTransport, this.ServerInfo.CMName, this.ServerInfo.RequestOld, this.ServerInfo.LedgerName, this.ServerInfo.SyncLedger); this.Transport = cmTransport; #region [ Event Listener ] { ListenerSystem listenerSys = new ListenerSystem(); listenerSys.Name = "SYSTEM"; listenerSys.Subject = $"_RV.*.*.*.*"; this.ListenerSystem = listenerSys; Queue queue = new Queue(); Listener listener = new Listener(queue, listenerSys.ReceivedMessage, netTransport, listenerSys.Subject, null); this.Logger.Info($"Listener(Queue[{queue.Name}], ReceivedMessage, {listener.Transport.GetType().ToString()}, {listener.Subject}, null)"); listenerSys.Listener = listener; listenerSys.OnReceivedMessage += this.OnReceivedMessage; listenerSys.OnReceivedEvent += this.OnReceivedEvent; listenerSys.Dispatch(); } #endregion foreach (ListenerInfo listenerInfo in this.Listeners) { Queue queue = new Queue(); CMListener listener = new CMListener(queue, listenerInfo.ReceivedMessage, cmTransport, listenerInfo.Subject, null); this.Logger.Info($"CMListener(Queue[{queue.Name}], ReceivedMessage, {listener.Transport.GetType().ToString()}, {listener.Subject}, null)"); listenerInfo.Listener = listener; listenerInfo.OnReceivedMessage += this.OnReceivedMessage; listenerInfo.OnReceivedEvent += this.OnReceivedEvent; listenerInfo.Dispatch(); } this.Raise_OnStarted(); } catch (RendezvousException ex) { this.Logger.Fatal(ex); throw ex; } catch (Exception ex) { this.Logger.Fatal(ex); throw ex; } } /// /// Distributed ServiceStart(Distributed Queue) /// private void DQServiceStart() { try { this.ServiceStop(); this.Logger.Info(); this.Logger.Info($"NetTransport({this.ServerInfo.Service}, {this.ServerInfo.Network}, {this.ServerInfo.Daemon})"); NetTransport netTransport = new NetTransport(this.ServerInfo.Service, this.ServerInfo.Network, this.ServerInfo.Daemon); this.Transport = netTransport; //this.Logger.Info($"CMTransport(NetTransport, {this.ServerInfo.CMName}, {this.ServerInfo.RequestOld}, {this.ServerInfo.LedgerName}, {this.ServerInfo.SyncLedger})"); //CMTransport cmTransport = new CMTransport(netTransport, this.ServerInfo.CMName, this.ServerInfo.RequestOld, this.ServerInfo.LedgerName, this.ServerInfo.SyncLedger); //this.Transport = cmTransport; this.Logger.Info($"CMQueueTransport(CMTransport, {this.ServerInfo.CMName})"); CMQueueTransport cmqTransport = new CMQueueTransport(netTransport, this.ServerInfo.CMName, 1, 5, 1, 1.0, 1.5); //this.Logger.Info($"CMQueueTransport(NetTransport, {this.ServerInfo.CMName}, {this.ServerInfo.RequestOld}, {this.ServerInfo.LedgerName}, {this.ServerInfo.SyncLedger})"); //CMQueueTransport cmqTransport = new CMQueueTransport(netTransport, this.ServerInfo.CMName, this.ServerInfo.RequestOld, this.ServerInfo.LedgerName, this.ServerInfo.SyncLedger); #region [ Event Listener ] { ListenerSystem listenerSys = new ListenerSystem(); listenerSys.Name = "SYSTEM"; listenerSys.Subject = $"_RV.*.*.*.*"; this.ListenerSystem = listenerSys; Queue queue = new Queue(); Listener listener = new Listener(queue, listenerSys.ReceivedMessage, netTransport, listenerSys.Subject, null); this.Logger.Info($"{listener.GetType().Name}(Queue[{queue.Name}], ReceivedMessage, {listener.Transport.GetType().ToString()}, {listener.Subject}, null)"); listenerSys.Listener = listener; listenerSys.OnReceivedMessage += this.OnReceivedMessage; listenerSys.OnReceivedEvent += this.OnReceivedEvent; listenerSys.Dispatch(); } #endregion foreach (ListenerInfo listenerInfo in this.Listeners) { Queue queue = new Queue(); CMListener cmListener = new CMListener(queue, listenerInfo.ReceivedMessage, cmqTransport, listenerInfo.Subject, null); this.Logger.Info($"{cmListener.GetType().Name}(Queue[{queue.Name}], ReceivedMessage, {cmListener.Transport.GetType().ToString()}, {cmListener.Subject}, null)"); listenerInfo.Listener = cmListener; listenerInfo.OnReceivedMessage += this.OnReceivedMessage; listenerInfo.OnReceivedEvent += this.OnReceivedEvent; listenerInfo.Dispatch(); } this.Raise_OnStarted(); } catch (RendezvousException ex) { this.Logger.Fatal(ex); throw ex; } catch (Exception ex) { this.Logger.Fatal(ex); throw ex; } } /// /// ServiceStop /// private void ServiceStop() { try { this.Logger.Info(); if (this.ListenerSystem != null) { this.ListenerSystem.Listener?.Transport?.Destroy(); this.ListenerSystem.OnReceivedMessage -= this.OnReceivedMessage; this.ListenerSystem.OnReceivedEvent -= this.OnReceivedEvent; this.ListenerSystem.Dispose(); } foreach(ListenerInfo listenerInfo in this.Listeners) { this.Logger.Debug($"Listener[{listenerInfo.Subject}].Dispose"); listenerInfo.Listener?.Transport?.Destroy(); listenerInfo.OnReceivedMessage -= this.OnReceivedMessage; listenerInfo.OnReceivedEvent -= this.OnReceivedEvent; listenerInfo.Dispose(); } if (this.Transport != null) { this.Logger.Debug($"Transport.Destroy()"); this.Transport.Destroy(); this.Transport = null; this.Raise_OnStoped(); } } catch (Exception ex) { throw ex; } } /// /// Received Data(XmlData) /// /// /// public void OnReceivedMessage(ListenerInfo sender, MessageReceivedEventArgs args) { try { Listener listener = sender.Listener; Message message = args.Message; XmlMessage xmlMessage = new XmlMessage(message); this.SendRequestMessage_Add(xmlMessage); this.Raise_OnReceived(sender, xmlMessage); } catch (Exception ex) { this.Logger.Fatal(ex); } } /// /// Add SendRequestMessage /// /// private void SendRequestMessage_Add(XmlMessage xmlMessage) { try { if (string.IsNullOrEmpty(xmlMessage.XmlData.TransactionID)) return; if (this.SendRequestMessages == null) return; if (this.SendRequestMessages.ContainsKey(xmlMessage.XmlData.TransactionID)) return; bool isAdd = false; // 1. SendRequest() --> SendReply() if (!string.IsNullOrEmpty(xmlMessage.Message.ReplySubject)) isAdd = true; // 2. SendRequestFlag is True --> Send() //if (xmlMessage.SendRequestFlag) isAdd = true; if (isAdd == false) return; this.SendRequestMessages.Add(xmlMessage.XmlData.TransactionID, xmlMessage); xmlMessage.OnTimeOver += this.SendRequest_OnTimeover; xmlMessage.TimerStart(this.SendRequestTime); } catch (Exception ex) { this.Logger.Fatal(ex); } } /// /// Remove SendRequestMessage /// /// private void SendRequestMessage_Remove(XmlMessage xmlMessage) { try { if (string.IsNullOrEmpty(xmlMessage.XmlData.TransactionID)) return; if (this.SendRequestMessages == null) return; if (!this.SendRequestMessages.ContainsKey(xmlMessage.XmlData.TransactionID)) return; XmlMessage message = this.SendRequestMessages[xmlMessage.XmlData.TransactionID]; message.OnTimeOver -= this.SendRequest_OnTimeover; message.TimerStop(); this.SendRequestMessages.Remove(xmlMessage.XmlData.TransactionID); } catch (Exception ex) { this.Logger.Fatal(ex); } } /// /// SendRequest 수신후, SendReply를 전송하지 않았을 경우 호출된다 /// /// /// private void SendRequest_OnTimeover(object sender, EventArgs e) { XmlMessage xmlMessage = sender as XmlMessage; if (xmlMessage == null) return; if (this.SendRequestMessages.ContainsKey(xmlMessage.XmlData.TransactionID)) this.SendRequestMessages.Remove(xmlMessage.XmlData.TransactionID); this.Raise_OnTimeout(xmlMessage, new Exception(Source.S10001) { Source = "S10001" }); } /// /// Received Event /// /// /// public void OnReceivedEvent(ListenerInfo sender, TibRendezvousEventArgs args) { try { this.Logger.Debug(args.ToString()); this.Raise_OnEvent(sender, args); } catch (Exception ex) { this.Logger.Fatal(ex); } } /// /// ServerInfo에 접속정보를 할당한다 /// /// private ServerInfo NextServerInfo() { if (this.ServerInfos.Count == 0) return null; if (this.ServerInfo == null) { this.ServerInfo = this.ServerInfos[0]; return this.ServerInfo; } int index = this.ServerInfos.IndexOf(this.ServerInfo); if (index == -1) index = 0; else index += 1; if (index >= this.ServerInfos.Count) index = 0; this.ServerInfo = this.ServerInfos[index]; return this.ServerInfo; } #endregion #region [ SendMessage ] =============================================== public XmlMessage SendMessage(XmlMessage xmlMessage, OnTransportHandler callback = null) { XmlMessage response = null; try { if (xmlMessage == null) return response; if (xmlMessage.IsReply && !string.IsNullOrEmpty(xmlMessage?.RequestMessage?.ReplySubject)) this.SendReply(xmlMessage, callback); else if (xmlMessage.SendRequestFlag) response = this.SendRequest(xmlMessage, callback); else this.Send(xmlMessage, callback); return response; } catch (Exception ex) { this.Logger.Fatal(ex); throw ex; } } public XmlMessage SendRequest(XmlMessage xmlMessage, OnTransportHandler callback = null) { XmlMessage xmlResponse = null; try { xmlMessage.SendRequestFlag = true; Message message = xmlMessage.Message; this.Raise_OnSend(xmlMessage); if (this.UseThreadSend) { Task.Factory.StartNew(delegate () { try { this.Logger.Debug($"SendSubject='{message.SendSubject}', ReplySubject='{message.ReplySubject}', SendRequestFlag='{xmlMessage.SendRequestFlag}'"); Message response = this.Transport.SendRequest(message, this.SendReplyTime); this.Raise_OnSent(xmlMessage); if (response == null) { this.Raise_OnTimeout(xmlMessage, new Exception(Source.S10002) { Source = "S10002" }); return; } xmlResponse = new XmlMessage(response) { RequestMessage = xmlMessage, IsReply = true }; this.Raise_OnReceived(null, xmlResponse); if (callback != null) callback(this, xmlResponse); } catch (RendezvousException ex) { throw ex; } catch (Exception ex) { throw ex; } }); } else { this.Logger.Debug($"SendSubject='{message.SendSubject}', ReplySubject='{message.ReplySubject}', SendRequestFlag='{xmlMessage.SendRequestFlag}'"); Message response = this.Transport.SendRequest(message, this.SendReplyTime); this.Raise_OnSent(xmlMessage); if (response == null) { this.Raise_OnTimeout(xmlMessage, new Exception(Source.S10002) { Source = "S10002" }); return xmlResponse; } xmlResponse = new XmlMessage(response) { RequestMessage = xmlMessage, IsReply = true }; this.Raise_OnReceived(null, xmlResponse); if (callback != null) callback(this, xmlResponse); } } catch (RendezvousException ex) { throw ex; } catch (Exception ex) { throw ex; } return xmlResponse; } public void SendReply(XmlMessage xmlMessage, OnTransportHandler callback = null) { try { Message reply = xmlMessage.Message; XmlMessage request = xmlMessage.RequestMessage; this.Raise_OnSend(xmlMessage); if (this.UseThreadSend) { Task.Factory.StartNew(delegate () { try { this.Logger.Debug($"SendSubject='{reply.SendSubject}', ReplySubject='{reply.ReplySubject}', SendRequestFlag='{xmlMessage.SendRequestFlag}'"); this.Transport.SendReply(reply, request.Message); this.Raise_OnSent(xmlMessage); if (callback != null) callback(this, xmlMessage); } catch (RendezvousException ex) { this.Logger.Fatal(ex); throw ex; } catch (Exception ex) { this.Logger.Fatal(ex); throw ex; } }); } else { this.Logger.Debug($"SendSubject='{reply.SendSubject}', ReplySubject='{reply.ReplySubject}', SendRequestFlag='{xmlMessage.SendRequestFlag}'"); this.Transport.SendReply(reply, request.Message); this.Raise_OnSent(xmlMessage); if (callback != null) callback(this, xmlMessage); } } catch (RendezvousException ex) { this.Logger.Fatal(ex); throw ex; } catch (Exception ex) { this.Logger.Fatal(ex); throw ex; } } public void Send(XmlMessage xmlMessage, OnTransportHandler callback = null) { try { Message message = xmlMessage.Message; this.Raise_OnSend(xmlMessage); if (this.UseThreadSend) { try { Task.Factory.StartNew(delegate () { this.Logger.Debug($"SendSubject='{message.SendSubject}', ReplySubject='{message.ReplySubject}', SendRequestFlag='{xmlMessage.SendRequestFlag}'"); this.Transport.Send(message); this.Raise_OnSent(xmlMessage); if (callback != null) callback(this, xmlMessage); }); } catch (RendezvousException ex) { this.Logger.Fatal(ex); throw ex; } catch (Exception ex) { this.Logger.Fatal(ex); throw ex; } } else { this.Logger.Debug($"SendSubject='{message.SendSubject}', ReplySubject='{message.ReplySubject}', SendRequestFlag='{xmlMessage.SendRequestFlag}'"); this.Transport.Send(message); this.Raise_OnSent(xmlMessage); if (callback != null) callback(this, xmlMessage); } } catch (RendezvousException ex) { this.Logger.Fatal(ex); throw ex; } catch (Exception ex) { this.Logger.Fatal(ex); throw ex; } } #endregion } public static class Source { public const string S10001 = "SendRequest Timeout: SendReply 메시지를 지정된 시간내에 전송하지 못하였습니다"; public const string S10002 = "SendReply Timeout: SendReply 메시지를 지정된 시간내에 수신하지 못하였습니다"; } }