"org.omg.CORBA.BAD_OPERATION: Не удается извлечь ulonglong" с политикой тайм-аута клиента JacORB

Я пытаюсь реализовать политику тайм-аута клиента для соединения CORBA, используя JacORB с Java. Ниже приведен первый метод, который я пытался реализовать

long timeout = 10000000L;
org.omg.CORBA.Any relativeRoundtripTimeoutValue = orb.create_any();
TimeTHelper.insert(relativeRoundtripTimeoutValue,timeout);
Policy[] policies = new Policy[1];
try {
    policies[0] = orb.create_policy(org.omg.Messaging.RELATIVE_RT_TIMEOUT_POLICY_TYPE.value,
                                        relativeRoundtripTimeoutValue);
    <client_stub>._set_policy_override(policies, SetOverrideType.ADD_OVERRIDE);
} catch (PolicyError e) {
    e.printStackTrace();
}

Эта реализация бросает

Caused by: org.omg.CORBA.BAD_OPERATION: Cannot extract ulonglong  vmcid: 0x0  minor code: 0     completed: No
at org.jacorb.orb.Any.checkExtract(Any.java:118)
at org.jacorb.orb.Any.extract_ulonglong(Any.java:467)
at org.jacorb.orb.policies.RelativeRoundtripTimeoutPolicy.<init>(RelativeRoundtripTimeoutPolicy.java:58)
at org.jacorb.orb.ORB.create_policy(ORB.java:774)

Но когда я изменяю RELATIVE_RT_TIMEOUT_POLICY_TYPE на REPLY_END_TIME_POLICY_TYPE, это выполняется без исключения, но не дает ожидаемого результата, так как клиент ждал без истечения времени ожидания.

Я также попробовал следующий подход, и он работал без исключений, но снова клиент ждал бесконечно без перерыва.

Policy retquestTimeoutPolicy = new org.jacorb.orb.policies.RelativeRoundtripTimeoutPolicy (1000 * 10000);
applicationDataAccess._set_policy_override(new Policy[]{retquestTimeoutPolicy}, SetOverrideType.ADD_OVERRIDE);

Возможно, мне здесь не хватает какой-то мелочи, но я плохо знаком с потоками корбы. так что любая помощь будет отличной.

1 ответ

Решение

Когда вы устанавливаете переопределение, оно применяется к новому объекту, например

new_object_with_policy = applicationDataAccess._set_policy_override(....

Попробуйте это сделать?

Чтобы установить эту политику, вы должны использовать set_policy_overrides метод PolicyManager объект:

  long timeout = 10000000L;
  PolicyManager opm = (PolicyManager) orb.resolve_initial_references("ORBPolicyManager");
  Any relativeRoundtripTimeoutValue = orb.create_any();
  TimeTHelper.insert(relativeRoundtripTimeoutValue, timeout);
  Policy[] policies = new Policy[1];
  policies[0] = orb.create_policy(RELATIVE_RT_TIMEOUT_POLICY_TYPE.value,
      relativeRoundtripTimeoutValue);
  opm.set_policy_overrides(policies, SetOverrideType.ADD_OVERRIDE);

В источниках OpenORB есть пример https://sourceforge.net/projects/openorb/files/OpenORB/1.4.0/OpenORB-1.4.0-src.zip/download: \ OpenORB \ src \ examples\ org \ openorb \ ОРБ \ Examples\ сообщениями \Client.java

Другие вопросы по тегам