从OpenDDS发布者传递复杂结构

时间:2014-10-09 12:26:48

标签: java publish-subscribe data-distribution-service

我有以下idl结构。我想用opendds发布它

#pragma DCPS_DATA_TYPE "B::CData"
#pragma DCPS_DATA_KEY "B::CData id"


module B { 

    struct Quote {
        string skit_name;
        string episode_name;     
        string line;
    };

    struct CData{
        long id;
        Quote payload;
    };
};

我在java中编写了发布者和订阅者。但是在发布和订阅上述主题时JVM崩溃了。

有人对此有所了解吗?

以下是公共主题

的java代码
  public static void main(String[] args) {

    DomainParticipantFactory dpf =
    TheParticipantFactory.WithArgs(new StringSeqHolder(args));
    if (dpf == null) {
    System.err.println ("Domain Participant Factory not found");
    return;
    }
    final int DOMAIN_ID = 42;
    DomainParticipant dp = dpf.create_participant(DOMAIN_ID,
    PARTICIPANT_QOS_DEFAULT.get(), null, DEFAULT_STATUS_MASK.value);
    if (dp == null) {
    System.err.println ("Domain Participant creation failed");
    return;
    }


    CDataTypeSupportImpl servant = new CDataTypeSupportImpl();

    if (servant.register_type(dp, "") != RETCODE_OK.value) {
    System.err.println ("register_type failed");
    return;
    }


    Topic top = dp.create_topic("data",
    servant.get_type_name(),
    TOPIC_QOS_DEFAULT.get(), null,
    DEFAULT_STATUS_MASK.value);


    Publisher pub = dp.create_publisher(
    PUBLISHER_QOS_DEFAULT.get(),
    null,
    DEFAULT_STATUS_MASK.value);




    DataWriter dw = pub.create_datawriter(
    top, DATAWRITER_QOS_DEFAULT.get(), null, DEFAULT_STATUS_MASK.value);


    CDataDataWriter mdw = CDataDataWriterHelper.narrow(dw);
    CData cData=new CData();
    int handle = mdw.register(cData);

//    above statement crashes the jvm   

    int ret = mdw.write(msg, handle);

}

1 个答案:

答案 0 :(得分:0)

您可以使用openDDS传递复杂结构

您需要定义复杂的结构idl,如

#pragma DCPS_DATA_TYPE "B::CData"

module B { 

   typedef struct Quote {
        string skit_name;
        string episode_name;     
        string line;
    }QuoteData;

    struct CData{
        long id;
        QuoteData payload;
    };
};

在接收数据时,您需要为复杂数据类型预先分配内存。如果CDataQuoteData首先我们将为QuoteData分配内存,然后为{{分配内存1}}。

就我而言,我在Java中使用openDDS。 JAVA中的openDDS使用在编译openDDS和ACEWrappers后生成的本机库iedll或lib。

JVM崩溃是因为我没有为复杂对象预先分配内存。我只传递了CData对象。当我第一次创建QuoteData对象时,之后我创建了CData对象,它工作正常。