ICE運行環境備忘三

1、ICE是一個多線程的運行環境,每個communicator通信器中都有一個Leader-Follower的線程池負責處理客戶端的服務請求,
   ICE的線程池有一系列的屬性用以來控制線程池的運行,主要包含如下內容:
   ThreadPoolName.Size          = 3              # 線程池初始線程個數3個,注意默認大小1個
   ThreadPoolName.SizeMax       = 10             # 線程池最大線程個數10個,注意默認大小1個,大於等於初始大小
   ThreadPoolName.sizeWarn      = 8              # 線程池告警線程個數8個,默認取值爲0不告警
   ThreadPoolName.StackSize     = 4MB            # 線程池中線程的堆棧大小4MB,默認使用系統配置大小
   ThreadPoolName.Serialize     = 1              # 線程池的線程消息序列化標記,默認取值0不序列化
   ThreadPoolName.ThreadIdleTime= 30             # 線程池中空閒線程回收時間,單位秒,默認取值60秒
   該處的ThreadPoolName可以替換成Ice.ThreadPool.Client、Ice.ThreadPool.Server、AdapterName.ThreadPool,分別用以
   控制客戶端線程池、服務器端線程池、ObjectAdapter線程池的屬性
   注意:如果沒有顯示的配置objectadapter的線程池屬性,那麼它繼承使用歸屬的communicator的線程池屬性
2、在強事物要求的處理系統中,可能需要客戶端請求處理的時序性有嚴格保證,那麼要達到該種效果,可以從兩個方面解決:
   A、使用單線程的服務器運行環境,即Ice.ThreadPool.Server=1
   B、採用序列化的線程池屬性,即Ice.ThreadPool.Server.Serialize = 1
   採用B方案看上去很優雅,但是他比單線程的線程池需要額外的系統負擔來確保消息的序列化分發和處理。
   如果客戶端請求能夠保證不會再多線程中發送消息、不會使用多個連接發送消息、僅僅採用雙向的同步調用,那麼消息的發送
   和處理肯定是時序的,就不用上述方式來進行屬性限制了
3、在ICE運行環境,提供了一個線程創建和通知的回調接口給應用,當ICE運行環境動態的創建和回收線程時,會回調對應的接口:
   class MyThreadHook : public virtual Ice::ThreadNotification
   {
   public:
       void start() {cout<<"Thread creat with id "<<ThreadControl().id()<<endl;}
  void stop() {cout<<"Thread destory with id "<<ThreadControl().id()<<endl;}
   };
   typedef IceUtil::Handle<MyThreadHook> MyTHreadHookPtr;
   
   int main()
   {
       Ice::InitializationData id;
  id.threadHook = new MyThreadHook;
  communicator = Ice::initialize(argc, argv, id);
   }
4、在ICE的運行環境中,所有的線程池默認採用LEADER-FOLLOWER的線程模型,按照默認的規則進行消息分發和處理,有的時候需要
   應用自行來控制特殊消息的分發,或者事物處理。ICE運行環境支持內嵌一個消息分發器,具體操作方式如下:
   class MyDispatcher : public virtaul Ice::Dispatcher
   {
   public:
       void dispatch(const DispatcherCallPtr& call, const Ice::ConnectionPtr& connection)
  {
       // 完成方法分派,但是不要試圖在該方法中進行阻塞式的方法調用
// 可以再該處將消息分發給自己創建的指定線程
// 並在指定的線程中中調用call->run();
  }
   };
   typedef IceUtil::Handle<MyDispatcher> MyDispatcherPtr;
   
   int main()
   {
       Ice::InitializationData id;
  id.dispatcher = new MyDispatcher;
  communicator = Ice::initialize(argc, argv, id);
   }
   
   dispather 在如下有被調用:
   Ice::ConnectionI::message(ThreadPoolCurrent& current)
   Ice::ConnectionI::finished(ThreadPoolCurrent& current)
   IceInternal::DispatchWorkItem::execute(ThreadPoolCurrent& current)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章