#pragma once #include "BUSClient.Define.hpp" #include "BUSClient.Base.hpp" namespace ECOM { namespace ServiceBus { namespace Controller { //----------------------------------------------------------------------------- // BaseReceiver, 消息接收的基类 //----------------------------------------------------------------------------- class _ServiceBus_API BaseReceiver { public: void SetSourceID (LPCTSTR SourceID); DString SetUniqueSourceID (LPCTSTR SourceID); DString GetSourceID () const; void ConnectTo (LPCTSTR IPAddress); bool SetTcpNoDelay (bool bSet); int SetSocketOption (int level, int optname, const char * optval, int optlen); DString GetConnectIPAddress (void) const { return m_IPAddress; } void SetTCPTimeOut (int seconds); bool Subscribe (DWORD Command, int msTimeOut = gDefMSTimeOut); bool BUSSetting (DWORD Command, LPCTSTR Key, LPCTSTR Value); protected: DString m_IPAddress; int m_StatusPort; int m_NbOfChannel; bool m_bTcpNoDelay; int m_TCPTimeOut; // seconds DString m_SourceID; public: BaseReceiver (); virtual ~BaseReceiver (); public: // 启动线程后, Task 会检测是否真的启动了, 否则等待 virtual void StartWait (); virtual void StopWait (); bool IsStarted () const; protected: virtual void CreateWaitTask (int NbOfChannel); protected: void OnHeartbeatRelay (const void * sender, EventArgs_Null * arg); void OnHeartbeat1MinuteRelay (const void * sender, EventArgs_Null * arg); void OnHeartbeat5MinuteRelay (const void * sender, EventArgs_Null * arg); void OnServerGlitchRelay (const void * sender, EventArgs_Int * arg); void OnServerOfflineRelay (const void * sender, EventArgs_Int * arg); void OnServerOnlineRelay (const void * sender, EventArgs_Int * arg); void OnServerRecoveredRelay (const void * sender, EventArgs_Int * arg); public: _tUnsafeDelegate OnHeartbeat; _tUnsafeDelegate OnHeartbeat1Minute; _tUnsafeDelegate OnHeartbeat5Minute; _tUnsafeDelegate OnServerGlitch; _tUnsafeDelegate OnServerOffline; _tUnsafeDelegate OnServerOnline; _tUnsafeDelegate OnServerRecovered; protected: class WaitMessageTask * m_Task; public: int m_iEnter; protected: static int gDefMSTimeOut; friend class Client; }; //----------------------------------------------------------------------------- // MessageReceiver, 可以发送消息, 也可以接收消息 //----------------------------------------------------------------------------- class _ServiceBus_API MessageReceiver : public BaseReceiver//, public MessageClient { typedef BaseReceiver inherited; public: MessageReceiver (); virtual ~MessageReceiver (); public: virtual void StartWait () override; virtual void StopWait () override; protected: virtual void CreateWaitTask (int NbOfChannel) override; protected: void OnMessageRelay (DWORD Command, const void * sender, ::EventArgs_BUSMessage * arg); protected: virtual bool RelayMessage (DWORD Command, const void * sender, ::EventArgs_BUSMessage * arg) { return false; } virtual void OnMessageNoResponse (const void * sender, ::EventArgs_BUSMessage * arg); public: BUSDelegate OnMessage; }; class _ServiceBus_API BLOBReceiver : public BaseReceiver//, public BLOBClient { typedef BaseReceiver inherited; public: BLOBReceiver (); virtual ~BLOBReceiver (); protected: virtual void CreateWaitTask (int NbOfChannel) override; public: virtual void StartWait () override; virtual void StopWait () override; protected: void OnMessageRelay (DWORD Command, const void * sender, ::EventArgs_BUSMessage * arg); void OnBLOBRelay (DWORD Command, const void * sender, ::EventArgs_BUSBLOB * arg); protected: virtual bool RelayMessage (DWORD Command, const void * sender, ::EventArgs_BUSMessage * arg) { return false; } virtual bool RelayBLOB (DWORD Command, const void * sender, ::EventArgs_BUSBLOB * arg) { return false; } virtual void OnMessageNoResponse (const void * sender, ::EventArgs_BUSMessage * arg); virtual void OnBLOBNoResponse (const void * sender, ::EventArgs_BUSBLOB * arg); public: BUSDelegate OnMessage; BUSDelegate OnBLOB; }; //----------------------------------------------------------------------------- // 单端口/固定端口的接收器 //----------------------------------------------------------------------------- class _ServiceBus_API FixedMessageReceiver : public MessageReceiver { public: FixedMessageReceiver (int StatusPort, int NbOfChannel = 1) { m_StatusPort = StatusPort; m_NbOfChannel = NbOfChannel; } }; class _ServiceBus_API FixedBLOBReceiver : public BLOBReceiver { public: FixedBLOBReceiver (int StatusPort, int NbOfChannel = 1) { m_StatusPort = StatusPort; m_NbOfChannel = NbOfChannel; } }; } } };