-1

データ中心のパブリッシュ サブスクライブ モデルに openDDS を使用しています。パブリッシャーは継続的にデータを送信し、サブスクライバーはそれを受信します。ただし、サブスクライバーの場合、指定した条件に基づいてフィルター処理されたデータを受信する必要があります。

パブリッシャーとサブスクライバーの両方で使用されるトピック構造が次のとおりであるとします。

module Messenger {

#pragma DCPS_DATA_TYPE "Messenger::ChannelData"
#pragma DCPS_DATA_KEY "Messenger::ChannelData subject_id"

  struct ChannelData {
            string from;
            string subject;
            long subject_id;
            string text;
            long   count;
  };
};

OpenDDS には、コンテンツ フィルタリング トピックと呼ばれる 1 つの概念があります。私が使用したのと同じです。

コード :

  // Register Type (Messenger::Message)
    Messenger::ChannelDataTypeSupport_var ts =
      new Messenger::ChannelDataTypeSupportImpl();

    if (ts->register_type(participant.in(), "") != DDS::RETCODE_OK) {
      ACE_ERROR_RETURN((LM_ERROR,
                        ACE_TEXT("%N:%l main()")
                        ACE_TEXT(" ERROR: register_type() failed!\n")), -1);
    }

    // Create Topic (Movie Discussion List)
    CORBA::String_var type_name = ts->get_type_name();
    DDS::Topic_var topic =
      participant->create_topic("Movie Discussion List",
                                type_name.in(),
                                TOPIC_QOS_DEFAULT,
                                DDS::TopicListener::_nil(),
                                OpenDDS::DCPS::DEFAULT_STATUS_MASK);

 DDS::ContentFilteredTopic_var cft =
         participant->create_contentfilteredtopic("MyTopic-Filtered",
         topic,
         "count <= 0 ",DDS::StringSeq());

しかし、上記のコードでは、フィルター条件count <=0をハードコーディングしています。

では、サブスクライバーがフィルタリングされたデータを受信するための動的フィルター条件を提供する方法はありますか?

4

1 に答える 1