(Javaプラットフォームを使用して)データをサブスクライブする際に問題が発生します。サブスクライバーがトピックをサブスクライブする場合、そのサブスクライブされたデータをDDSから削除する必要があります。しかし、私の場合、データをサブスクライブするたびに、同じデータが何度もサブスクライブされます。データはDDSから削除されません。QoSを試してみましたが、使い方がわかりません。
読み取ったデータをDDSから削除する方法を提案してください。
(Javaプラットフォームを使用して)データをサブスクライブする際に問題が発生します。サブスクライバーがトピックをサブスクライブする場合、そのサブスクライブされたデータをDDSから削除する必要があります。しかし、私の場合、データをサブスクライブするたびに、同じデータが何度もサブスクライブされます。データはDDSから削除されません。QoSを試してみましたが、使い方がわかりません。
読み取ったデータをDDSから削除する方法を提案してください。
この動作は、QoS設定ではなく、にアクセスする方法が原因で発生しますDataReader
。データを取得するときは、おそらくread()
ループ内で次のようなものを呼び出しています。
FooReader.read(
dataSeq, infoSeq, 10,
ANY_SAMPLE_STATE.value,
ANY_VIEW_STATE.value,
ANY_INSTANCE_STATE.value);
このread()
ように呼び出されたメソッドは、で現在利用可能なすべてのサンプルを返しますFooReader
。後もread()
、これらのサンプルはで引き続き使用可能です。FooReader
これがread()
メソッドの動作です。読み取りを「ピーク」と考えてください。次回read()
この方法でメソッドを呼び出すと、からの新しい更新によって上書きされていない限り、以前に表示したすべてのサンプルが表示されますDataWriter
。
問題を解決するには、次のようread()
にをに置き換えることができます。take()
FooReader.take(
dataSeq, infoSeq, 10,
ANY_SAMPLE_STATE.value,
ANY_VIEW_STATE.value,
ANY_INSTANCE_STATE.value);
この方法は、破壊的な読み取りを行うという点でこのtake()
方法とは異なります。read()
データを読み取るだけでなく、から削除しFooReader
ます。そうすれば、同じサンプルを2回受け取ることはありません。実際、とtake()
は対照的に一貫して使用する場合read()
、サンプルを2回表示することはできません。
問題を解決する別の方法は、次のように、に固執するread()
ことですが、要求されたSAMPLE_STATE
をからANY
に調整するNOT_READ
ことです。
FooReader.read(
dataSeq, infoSeq, 10,
NOT_READ_SAMPLE_STATE.value,
ANY_VIEW_STATE.value,
ANY_INSTANCE_STATE.value);
そうすれば、以前に読んだことがないサンプルだけを読むことができます。この場合との違いtake()
は、データがで利用可能なままであるというFooReader
ことです。これは、後でデータを再読み取りする場合に役立つ可能性があります(この場合、以前に読み取ったデータを取得するのANY
ではなく、サンプル状態を使用する必要があります)。NOT_READ
サンプル)。