我目前正在使用 RTI DDS 来实现我正在实施的pub子系统,并且对于某些主题,希望保持历史深度仅为1,以便在需要时保持重新发送以及其他主题,如果需要,希望保留所有历史记录。以下是我正在使用的Qos policy
文件。
<?xml version="1.0"?>
<dds>
<qos_library name="Keep_History_Library">
<qos_profile name="Keep_History_profile" is_default_qos="true">
<datawriter_qos name="ReliableWriter">
<property>
<value>
<element>
<name>dds.data_writer.history.memory_manager.fast_pool.pool_buffer_max_size</name>
<!-- Typical size of your data type. -->
<value>32000</value>
</element>
</value>
</property>
<durability>
<kind>TRANSIENT_LOCAL_DURABILITY_QOS</kind>
</durability>
<history><kind>KEEP_LAST_HISTORY_QOS</kind><depth>1</depth></history>
<reliability>
<kind>RELIABLE_RELIABILITY_QOS</kind>
</reliability>
<publication_name>
<name>HistoryDataWriter</name>
</publication_name>
</datawriter_qos>
<datareader_qos name="ReliableReader">
<history><kind>KEEP_LAST_HISTORY_QOS</kind><depth>1</depth></history>
<reliability>
<kind>RELIABLE_RELIABILITY_QOS</kind>
</reliability>
<durability>
<kind>TRANSIENT_LOCAL_DURABILITY_QOS</kind>
</durability>
<subscription_name>
<name>HistoryDataReader</name>
</subscription_name>
</datareader_qos>
</qos_profile>
<qos_profile name="Keep_All_History_profile">
<datawriter_qos name="ReliableWriter">
<property>
<value>
<element>
<name>dds.data_writer.history.memory_manager.fast_pool.pool_buffer_max_size</name>
<!-- Typical size of your data type. -->
<value>32000</value>
</element>
</value>
</property>
<history><kind>KEEP_ALL_HISTORY_QOS</kind></history>
<reliability>
<kind>RELIABLE_RELIABILITY_QOS</kind>
</reliability>
<durability>
<kind>TRANSIENT_LOCAL_DURABILITY_QOS</kind>
</durability>
<publication_name>
<name>HistoryDataWriter</name>
</publication_name>
</datawriter_qos>
<datareader_qos name="ReliableReader">
<history><kind>KEEP_ALL_HISTORY_QOS</kind><depth>1000000</depth></history>
<reliability>
<kind>RELIABLE_RELIABILITY_QOS</kind>
</reliability>
<durability>
<kind>TRANSIENT_LOCAL_DURABILITY_QOS</kind>
</durability>
<subscription_name>
<name>HistoryDataReader</name>
</subscription_name>
</datareader_qos>
</qos_profile>
</qos_library>
</dds>
以下是用java编写的代码,用于从阅读器的Keep_All_History_profile
文件加载Qos policy
。
DataReaderQos datareader_qos = new DataReaderQos();
DomainParticipantFactory.TheParticipantFactory.get_datareader_qos_from_profile(datareader_qos, "Keep_History_Library", "Keep_All_History_profile");
以及将Qos
文件加载到编写器中的代码
DataWriterQos datawriter_qos = new DataWriterQos();
DomainParticipantFactory.TheParticipantFactory.get_datawriter_qos_from_profile(datawriter_qos, "Keep_History_Library", "Keep_All_History_profile");
然而,我遇到的问题是当我尝试加载Keep All History profile
时,只有一个的深度才会保留而不再存在。但是,如果我将配置文件的keep last history
部分更改为深度为10的深度,它将保留并读取保留所有历史记录应该加载的最后10条消息。为什么会出现这样的情况,好像正在加载错误的配置文件?
修改
用于制作加载Qos
个人资料后立即使用的数据编写器的代码。
writer = (DataDataWriter)
publisher.create_datawriter(
topic, Publisher.DATAWRITER_QOS_DEFAULT,
null, StatusKind.STATUS_MASK_NONE);
if (writer == null) {
System.err.println("create_datawriter error\n");
return;
}
以及datareader
listener = new DataListener();
reader = (DataDataReader)
subscriber.create_datareader(
topic, Subscriber.DATAREADER_QOS_DEFAULT, listener,
StatusKind.STATUS_MASK_ALL);
if (reader == null) {
System.err.println("create_datareader error\n");
return;
}
}
然后,数据读取器使用以下方法发送消息,
public void writeData(String results) throws InterruptedException
{
instance.results = results;
writer.write(instance, handle);
}
答案 0 :(得分:3)
为什么你会看到你看到的内容:
您正在使用Subscriber.DATAREADER_QOS_DEFAULT和Publisher.DATAREADER_QOS_DEFAULT,并且在Keep_Last深度1个人资料中设置了'is_default_qos'布尔值。
它在幕后做了什么:
如果在配置文件“Foo”上设置了is_default_qos标志,则 THAT 是使用* _QOS_DEFAULT标志时将使用的配置文件。即使您使用某些 OTHER 个人资料中的参与者个人资料。
* _QOS_DEFAULT标志将始终恢复为“is_default_qos”个人资料。
如何得到你想要的东西:
如果您想使用Subscriber.DATAREADER_QOS_DEFAULT和Publisher.DATAREADER_QOS_DEFAULT,那么您必须告诉Subscriber和Publisher对象他们将使用不同的默认值。
subscriber.set_default_datareader_qos_with_profile(
"Keep_History_Library", "Keep_All_History_profile");
publisher.set_default_datareader_qos_with_profile(
"Keep_History_Library", "Keep_All_History_profile");
OR
使用工厂调用的_create_with_profile变体:
subscriber.create_datareader_with_profile(
topic, "Keep_History_Library", "Keep_All_History_profile",
listener, StatusKind.STATUS_MASK_ALL);
publisher.create_datawriter_with_profile(
topic, "Keep_History_Library", "Keep_All_History_profile",
null, StatusKind.STATUS_MASK_NONE);