Константа ТАО КОРБА ИОР

Как настроить сервер TAO corba так, чтобы строка IOR этого сервера, сгенерированная из object_to_string, была постоянной?

Каждый раз, когда строка IOR, сгенерированная из object_to_string, изменяется после перезапуска сервера. Это неудобно, так как клиент должен обновить строку IOR кэшированного сервера, перезагрузив файл IOR или обратившись к службе имен. В результате было бы полезно, если бы сервер мог генерировать постоянную строку IOR, независимо от того, сколько раз он перезапускается.

Мой сервер corba основан на ACE+TAO, и я помню, что TAO поддерживает постоянную строку IOR: строка IOR каждый раз, когда она генерируется, одинакова, и решение заключается в добавлении некоторых конфигураций для сервера. Но я не мог вспомнить эти конфигурации сейчас.

============================================ ОБНОВЛЕНИЕ:

В ACE_wrappers/TAO/tests/POA/Persistent_ID/server.cpp я добавил новую функцию с именем testUniqe(), которая похожа на метод creatPOA. И содержимое файла обновления:

void testUniqu(CORBA::ORB_ptr orb_, PortableServer::POA_ptr poa_){

  CORBA::PolicyList policies (2);
  policies.length (2);          
                                                     //IOR is the same even it is SYSTEM_ID
  policies[0] =   poa_->create_id_assignment_policy (PortableServer::USER_ID); 

  policies[1] =   poa_->create_lifespan_policy (PortableServer::PERSISTENT);
  PortableServer::POAManager_var poa_manager = poa_->the_POAManager ();
  PortableServer::POA_ptr child_poa_ =   poa_->create_POA ("childPOA", poa_manager.in (), policies);

  // Destroy the policies
  for (CORBA::ULong i = 0;  i < policies.length ();  ++i)  {
      policies[i]->destroy ();
    }

  test_i *servant =   new test_i (orb_, child_poa_);

  PortableServer::ObjectId_var oid = PortableServer::string_to_ObjectId("xushijie");
  child_poa_->activate_object_with_id (oid,  servant);

  PortableServer::ObjectId_var id =  poa_->activate_object (servant);
  CORBA::Object_var object = poa_->id_to_reference (id.in ());

  test_var test =  test::_narrow (object.in ());
  CORBA::String_var ior = orb_->object_to_string(test.in());
  std::cout<<ior.in()<<std::endl;

  poa_->the_POAManager()->activate();
  orb_->run();
}

int
ACE_TMAIN (int argc, ACE_TCHAR *argv[])
{

  try
    {
      CORBA::ORB_var orb =
        CORBA::ORB_init (argc, argv);

      int result = parse_args (argc, argv);
      CORBA::Object_var obj =
        orb->resolve_initial_references ("RootPOA");

      PortableServer::POA_var root_poa =
        PortableServer::POA::_narrow (obj.in ());

      PortableServer::POAManager_var poa_manager =
        root_poa->the_POAManager ();
      testUniqu(orb.in(), root_poa.in());
       orb->destroy ();
    }
  catch (const CORBA::Exception& ex)
    {
      ex._tao_print_exception ("Exception caught");
      return -1;
    }

  return 0;
}

Проблема в том, что IOR сервера вывода все еще отличаются после перезапуска. Я также сравнил этот код с кодом на странице 412 (Advance Corba Programming), но все еще терпит неудачу.

///////////////////////////////////

ОБНОВИТЬ:

С «server -ORBListenEndpoints iiop://:1234 > /tmp/ior1» сгенерированы два IOR:

IOR: 010000000d00000049444c3a746573743a312e300000000001000000000000007400000001010200150000007368696a69652d5468696e6b5061642d543431300000d2041b00000014010f0052535453f60054c6f80c000000000001000000010000000002000000000000000800000001000000004f41540100000018000000010000000100010001000000010001050901010000000000 IOR: 010000000d00000049444c3a746573743a312e300000000001000000000000007400000001010200150000007368696a69652d5468696e6b5061642d543431300000d2041b00000014010f0052535468f60054da280a000000000001000000010000000002000000000000000800000001000000004f41540100000018000000010000000100010001000000010001050901010000000000

Результат для tao_catior для ior1 и ior2:

ior1: 
The Byte Order: Little Endian
The Type Id:    "IDL:test:1.0"
Number of Profiles in IOR:      1
Profile number: 1
IIOP Version:   1.2
    Host Name:  **
    Port Number:        1234
    Object Key len:     27
    Object Key as hex:
    14 01 0f 00 52 53 54 53 f6 00 54 c6 f8 0c 00 00
    00 00 00 01 00 00 00 01 00 00 00
    The Object Key as string:
    ....RSTS..T................
    The component <1> ID is 00 (TAG_ORB_TYPE)
            ORB Type: 0x54414f00 (TAO)
    The component <2> ID is 11 (TAG_CODE_SETS)
        Component length: 24
        Component byte order:   Little Endian
        Native CodeSet for char:  Hex - 10001   Description - ISO8859_1
        Number of CCS for char 1
        Conversion Codesets for char are:
        1)  Hex - 5010001       Description - UTF-8
        Native CodeSet for wchar:  Hex - 10109  Description - UTF-16
        Number of CCS for wchar 0
ecoding an IOR:


//ior2
The Byte Order: Little Endian
The Type Id:    "IDL:test:1.0"
Number of Profiles in IOR:      1
Profile number: 1
IIOP Version:   1.2
    Host Name:  **
    Port Number:        1234
    Object Key len:     27
    Object Key as hex:
    14 01 0f 00 52 53 54 68 f6 00 54 da 28 0a 00 00
    00 00 00 01 00 00 00 01 00 00 00
    The Object Key as string:
    ....RSTh..T.(..............
    The component <1> ID is 00 (TAG_ORB_TYPE)
            ORB Type: 0x54414f00 (TAO)
    The component <2> ID is 11 (TAG_CODE_SETS)
        Component length: 24
        Component byte order:   Little Endian
        Native CodeSet for char:  Hex - 10001   Description - ISO8859_1
        Number of CCS for char 1
        Conversion Codesets for char are:
        1)  Hex - 5010001       Description - UTF-8
        Native CodeSet for wchar:  Hex - 10109  Description - UTF-16
        Number of CCS for wchar 0

Результат разницы:

<     14 01 0f 00 52 53 54 53 f6 00 54 c6 f8 0c 00 00 
---
>     14 01 0f 00 52 53 54 68 f6 00 54 da 28 0a 00 00 
19c19
<     ....RSTS..T................
---
>     ....RSTh..T.(..............

Аналогичный результат diff:

<     14 01 0f 00 52 53 54 62 fd 00 54 2c 9a 0e 00 00 
---
>     14 01 0f 00 52 53 54 02 fd 00 54 f9 a9 09 00 00 
19c19
<     ....RSTb..T,...............
---
>     ....RST...T................

Разница в ObjectKey.

============================================

Обновить:

Вместо того, чтобы использовать приведенный выше код, я нашел лучшее решение с помощником TAO_ORB_Manager, который используется NamingService и TAO/examples/Simple. TAO_ORB_Manager инкапсулирует API и генерирует постоянные IOR, как пример кода в Simple.cpp:

  if (this->orb_manager_.init_child_poa (argc, argv, "child_poa") == -1){
      CORBA::String_var str  = 
        this->orb_manager_.activate_under_child_poa (servant_name,
                                                     this->servant_.in ());
  }

Это описание для TAO_ORB_Manager:

class TAO_UTILS_Export TAO_ORB_Manager
{
  /**
   * Creates a child poa under the root poa with PERSISTENT and
   * USER_ID policies.  Call this if you want a @a child_poa with the
   * above policies, otherwise call init.
   *
   * @retval -1 Failure
   * @retval 0 Success
   */
  int init_child_poa (int &argc,
                      ACE_TCHAR *argv[],
                      const char *poa_name,
                      const char *orb_name = 0);


  /**
   * Precondition: init_child_poa has been called.  Activate <servant>
   * using the POA <activate_object_with_id> created from the string
   * <object_name>. Users should call this to activate objects under
   * the child_poa.
   *
   * @param object_name  String name which will be used to create
   *                     an Object ID for the servant.
   * @param servant  The servant to activate under the child POA.
   *
   * @return 0 on failure, a string representation of the object ID if
   *           successful.  Caller of this method is responsible for
   *           memory deallocation of the string.
   */
  char *activate_under_child_poa (const char *object_name,
                                  PortableServer::Servant servant);
  ...................
}

После сборки я могу получить то, что хочу, с опцией -ORBListenEndpoints iiop://localhost:2809. Спасибо, @Johnny Willemsen помог


person shijie xu    schedule 26.08.2014    source источник


Ответы (1)


Вы должны создать POA с постоянной политикой жизненного цикла, см. ACE_wrappers/TAO/tests/POA/Persistent_ID как часть дистрибутива TAO.

person Johnny Willemsen    schedule 27.08.2014
comment
Спасибо @Джонни Виллемсен. Этот пример аналогичен описанному в README. Я добавил новую функцию checkuniq в server.cpp, чтобы проверить, совпадают ли IOR при перезапуске сервера. Но результат такой, как я ожидал. - person shijie xu; 29.08.2014
comment
Вы должны запустить сервер на фиксированном порту, см. параметр командной строки -ORBEndpoint. - person Johnny Willemsen; 29.08.2014
comment
Результаты по-прежнему не совпадают. Я пробовал дважды для каждого -ORBListenEndpoints iiop://:1234 и -ORBListenEndpoints iiop://localhost:1234 и -ORBEndpoint iiop://:1234. - person shijie xu; 29.08.2014
comment
Пожалуйста, запустите TAO/utils/catior/tao_catior на IOR и посмотрите, что находится в - person Johnny Willemsen; 29.08.2014
comment
Обновите, как указано выше. Ключ_объекта используется для идентификации уникального объекта на сервере, а идентификатор объекта_ключа_объекта может определять местонахождение серванта, подключенного к POA. Означает ли это, что child_poa_, созданные в двух разных запусках, не совпадают, хотя оба имеют одинаковое имя POA? - person shijie xu; 30.08.2014
comment
Если вы используете правильные политики, ссылка на объект останется прежней, но не знаю, почему она не работает в вашей настройке. На данный момент я не могу погрузиться в это из-за нехватки времени. Пожалуйста, используйте список рассылки TAO, см. dre.vanderbilt.edu/~schmidt/ ACE-mail.html - person Johnny Willemsen; 30.08.2014
comment
Что происходит, когда вы используете явный IP-адрес для прослушивания? - person Johnny Willemsen; 31.08.2014
comment
С явным IP-адресом IOR по-прежнему не сохраняется. - person shijie xu; 31.08.2014
comment
Что произойдет, если вы используете IOR, написанный при первом вызове при перезапуске? - person Johnny Willemsen; 02.09.2014
comment
Используя предыдущую строку ior, вызов на клиенте выдаст (8394|139721312069440) EXCEPTION, системное исключение myexception, ID 'IDL:omg.org/CORBA/OBJECT_NOT_EXIST:1.0' OMG второстепенный код (2), описанный как 'Не удалось создать или найти адаптер объекта.', завершено = НЕТ - person shijie xu; 03.09.2014