データ中心のパブリッシュ サブスクライブ モデルに 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をハードコーディングしています。
では、サブスクライバーがフィルタリングされたデータを受信するための動的フィルター条件を提供する方法はありますか?