我告诉DDS维护对使用示例代码时创建的DTO的引用:
public void on_data_available(DataReader reader) {
HelloWorldDataReader HelloWorldReader =
(HelloWorldDataReader)reader;
try {
HelloWorldReader.take(
_dataSeq, _infoSeq,
ResourceLimitsQosPolicy.LENGTH_UNLIMITED,
SampleStateKind.ANY_SAMPLE_STATE,
ViewStateKind.ANY_VIEW_STATE,
InstanceStateKind.ANY_INSTANCE_STATE);
for(int i = 0; i < _dataSeq.size(); ++i) {
SampleInfo info = (SampleInfo)_infoSeq.get(i);
if (info.valid_data) {
System.out.println(
((HelloWorld)_dataSeq.get(i)).toString("Received",0));
}
}
} catch (RETCODE_NO_DATA noData) {
// No data to process
} finally {
HelloWorldReader.return_loan(_dataSeq, _infoSeq);
}
}
}
在将DTO传递给我的其余代码之前,是否需要使用copy_from方法?给出的解释是RTI保留了对DTO的引用,并且只是在接收到新数据时更新字段而不是创建新的HelloWorld DTO。解释说DTO不会正常运作,除非通过首先执行副本(因此我没有持有对原文的引用)并在阅读器上调用return_loan来明确释放它。这对我来说没有意义,因为我希望清除序列后清除引用。
这准确吗?我真的需要每次DTO进来复制吗?我希望尽可能减少开销,因为这些DTO将以相对较高的速率发送。
答案 0 :(得分:0)
是(copy_from),或者提取您要查找的信息,然后发布release_loan。
在内部,您使用的是由中间件管理的数据。
当您处于take(或read)和release_loan之间时,保证数据处于一致状态。
如果你持有对内部(DDS)内存和release_loan的引用,你怎么知道你所看到的数据(以后)还没有被更新? (在Java中,无论如何都会获得并发内存访问异常)。
请记住,您使用的内部是而不是 Java,它们保存在c库(JNI连接)中。 Connext确保数据一致和连贯的唯一方法是通过loan / release_loan机制。
所以: 深层复制,然后释放贷款。