1

私は現在、実装している pub サブシステムにRTI DDSを使用しています。一部のトピックでは、必要に応じて再送信できるように履歴の深さを 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>

以下は、リーダー用にファイルKeep_All_History_profileからをロードするために Java で記述されたコードです。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;
        }  

データリーダーと同様に

       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);
}
4

1 に答える 1

3

見えるものを見る理由:

Subscriber.DATAREADER_QOS_DEFAULT と Publisher.DATAREADER_QOS_DEFAULT を使用しており、「is_default_qos」ブール値が Keep_Last 深さ 1 プロファイルに設定されています。

内部で行っていること:

プロファイル「Foo」に is_default_qos フラグが設定されている場合、*_ QOS_DEFAULTフラグを使用すると、それが使用されるプロファイルになります。他のプロファイルの参加者プロファイルを使用している場合でも。

*_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");

また

ファクトリ コールの _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);
于 2015-02-23T22:52:34.037 に答える