3

(Javaプラットフォームを使用して)データをサブスクライブする際に問題が発生します。サブスクライバーがトピックをサブスクライブする場合、そのサブスクライブされたデータをDDSから削除する必要があります。しかし、私の場合、データをサブスクライブするたびに、同じデータが何度もサブスクライブされます。データはDDSから削除されません。QoSを試してみましたが、使い方がわかりません。

読み取ったデータをDDSから削除する方法を提案してください。

4

1 に答える 1

4

この動作は、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サンプル)。

于 2012-07-12T22:46:16.817 に答える