Сломанные ссылки на объекты CORBA - PullRequest
1 голос
/ 04 января 2011

Я работаю над домашней работой и застрял.Задача состоит в том, чтобы обслуживать объекты, используя слугу по умолчанию.Но когда я пытаюсь использовать ссылку, происходят странные вещи.Некоторая часть corba печатает трассировку стека, но исключение не выдается.Проблема возникает, когда сервер получает ссылку и должен вызывать какой-то метод.Затем ссылка сокращается и не содержит идентификатора объекта (что означает, что моя реализация слуги не может сделать ничего разумного).

Это реализация слуги, где возникает проблема:

public class ModelFileImpl extends ModelFilePOA{
   @Override
    public String getName() {
        try {
            return new String(_poa().reference_to_id(_this_object()));
        } catch (Throwable e) {}
        assert false;
        return null;
    }
}

Если я возьму _this_object (). ToString () внутри блока try и поместу его в dior -i, я получу следующее:

------IOR components-----
TypeId  :   IDL:termproject/idl/ModelFile:1.0
TAG_INTERNET_IOP Profiles:
    Profile Id:     0
    IIOP Version:       1.2
    Host:           127.0.0.1
    Port:           45954
    Object key (URL):   %AF%AB%CB%00%00%00%00%20Q%BA%F4%FF%00%00%00%01%00%00%00%00%00%00%00%01%0000%00%08RootPOA%00%00%00%00%08%00%00%00%02%00%00%00%00%14
    Object key (hex):   0xAF AB CB 00 00 00 00 20 51 BA F4 FF 00 00 00 01 00 00 00 00 00 00 00 01 00 00 00 08 52 6F 6F 74 50 4F 41 00 00 00 00 08 00 00 00 02 00 00 00 00 14 
    -- Found 2 Tagged Components--
    #0: TAG_CODE_SETS
        ForChar native code set Id: ISO8859_1
        Char Conversion Code Sets: UTF8
, Unknown TCS: 10020
        ForWChar native code set Id: UTF16
        WChar Conversion Code Sets: Unknown TCS: 10100
    Unknown tag : 38

однако часть сервера, которая делает ссылку иклиент видит ссылку как

------IOR components-----
TypeId  :   IDL:termproject/idl/ModelFile:1.0
TAG_INTERNET_IOP Profiles:
    Profile Id:     0
    IIOP Version:       1.2
    Host:           127.0.0.1
    Port:           45954
    Object key (URL):   %AF%AB%CB%00%00%00%00%20Q%BA%F4%FF%00%00%00%01%00%00%00%00%00%00%00%02%00%00%00%08RootPOA%00%00%00%00%09modelPoa%00%00%00%00%00%00%00%10testModel1.MyIDL%14
    Object key (hex):   0xAF AB CB 00 00 00 00 20 51 BA F4 FF 00 00 00 01 00 00 00 00 00 00 00 02 00 00 00 08 52 6F 6F 74 50 4F 41 00 00 00 00 09 6D 6F 64 65 6C 50 6F 61 00 00 00 00 00 00 00 10 74 65 73 74 4D 6F 64 65 6C 31 2E 4D 79 49 44 4C 14 
    -- Found 2 Tagged Components--
    #0: TAG_CODE_SETS
        ForChar native code set Id: ISO8859_1
        Char Conversion Code Sets: UTF8
, Unknown TCS: 10020
        ForWChar native code set Id: UTF16
        WChar Conversion Code Sets: Unknown TCS: 10100
    Unknown tag : 38

(«modelPoa» (имя poa, работающего с клиентами по умолчанию) и «testModel1.MyIDL» (идентификатор объекта) в ключе объекта отсутствуют впервый)

Я попытался прослушать трафик и обнаружил, что клиент по-прежнему отправляет правильную ссылку.

Вот как я создаю ссылки:

ret[i] = ModelFileHelper.narrow(modelFilePoa.create_reference_with_id(files[i].getBytes(), ModelFileHelper.id()));

И вот как я настроил сервер:

// init ORB
ORB orb = ORB.init(args, null);

// init POA
POA poa = POAHelper.narrow(orb.resolve_initial_references("RootPOA"));

// create the POA for the models.
Policy[] policies = {
    poa.create_request_processing_policy(RequestProcessingPolicyValue.USE_DEFAULT_SERVANT),
    poa.create_servant_retention_policy(ServantRetentionPolicyValue.NON_RETAIN),
    poa.create_id_assignment_policy(IdAssignmentPolicyValue.USER_ID)
};

POA modelPoa = poa.create_POA("modelPoa", poa.the_POAManager(), policies);
modelPoa.the_POAManager().activate();

modelPoa.set_servant(new ModelFileImpl());

modelPoa.the_POAManager().activate();

ModelStoreImpl impl = new ModelStoreImpl(modelPoa);
// create the object reference
org.omg.CORBA.Object obj = poa.servant_to_reference(impl);

// ... store the IOR file ...

orb.run();

Я был бы очень благодарен за любые указатели (или ссылки :-))

РЕДАКТИРОВАТЬ: после дня отладкикод Корба я обнаружил, чтопроблема возникает, когда orb.peekInvocationInfo() выбрасывает EmptyStackException в методе _this_object() Комментарии что-то говорят о контексте вызова, но Google не может сказать мне, что это такое.

1 Ответ

0 голосов
/ 08 января 2011

Хорошо, я нашел обходной путь: в файле ModelFilePoa.java, сгенерированном из файла idl, я переключил вызов на мою реализацию метода и создание ответа

String tmp = getName();
_out = handler.createReply();
_out.write_string(tmp);

вместо

_out = handler.createReply();
_out.write_string(getName();

Таким образом, информация о вызовах остается в стеке во время моих методов, а _this_object() работает как положено.Некрасиво но работает: -)

...