0

这是为了更清楚地了解 WSO2 CEP 中生成的 JSON 事件的 JSON 映射。

我为此配置了两个存储桶。我有一个字符串 ( Suresh 7 LeadSE),我将其转换为 JSON 对象。第一个存储桶正在获取输入字符串,我编写了一个 siddhi 扩展来将其转换为 JSON。

FirstBucket 将以字符串形式获取输入并将其转换为 JSON 并将其放入名为 parsedPacketTopic 的主题中。现在我想从这个 JSON 中获取各个元素。我正在尝试通过 SecondBuke 配置来解决这个问题。但是,我不知道如何将生成的 JSON 值映射到 SecondBucket 中。

我得到了字段的空值,expInYears我不知道如何将生成的 JSON 准确地映射到这些字段。empNameposition

有人可以帮忙吗?

代码

FirstBucket 配置

    <cep:input brokerName="localAgentBroker" topic="rawPacketTopic/1.0.0">
        <cep:tupleMapping queryEventType="Tuple" stream="rawPacketStream">
          <cep:property inputDataType="payloadData" inputName="rawPacket"
            name="rawPacket" type="java.lang.String"/>
        </cep:tupleMapping>
    </cep:input>
   <cep:query name="Queryfirst">
        <cep:expression><![CDATA[from rawPacketStream[rawPacket!="null"]
         insert into parsePacketStream customExtn:testFun(rawPacket) as pac]]>    
   </cep:expression>
        <cep:output brokerName="activemqJmsBroker" topic="parsedPacketTopic">
          <cep:mapMapping>
            <cep:property name="parsedPac" valueOf="pac"/>
          </cep:mapMapping>
        </cep:output>
    </cep:query>

rawPacketTopic 的流定义

{"streamId":"rawPacketTopic:1.0.0","name":"rawPacketTopic","version":"1.0.0","nickName":"PVT_Data","description":"PVT_Data","metaData":[{"name":"clientType","type":"STRING"}],"payloadData":[{"name":"rawPacket","type":"STRING"}]}

parsedPacketTopic 的流定义

{"streamId":"parsedPacketTopic:1.0.0","name":"parsedPacketTopic","version":"1.0.0","description":"PVTsinJson","metaData":[{"name":"ClientType","type":"STRING"}],"payloadData":[{"name":"parsedPac","type":"STRING"},
{"name":"expInYears","type":"INT"},{"name":"empName","type":"STRING"},{"name":"position","type":"STRING"}]}

i am getting the parsedPac json value as {"expInYears":7,"empName":"Suresh","position":"LeadSE"}

第二桶配置

<cep:input brokerName="activemqJmsBroker" topic="parsedPacketTopic">
    <cep:mapMapping queryEventType="Tuple" stream="parsedPacketStream">
      <cep:property inputDataType="payloadData" inputName="parsedPac" name="parsedPac" type="java.lang.String"/>
       <cep:property inputDataType="payloadData" inputName="expInYears" name="expInYears" type="java.lang.Integer"/>
      <!--<cep:property inputDataType="payloadData" inputName="empName" name="empName" type="java.lang.String"/>
      <cep:property inputDataType="payloadData" inputName="position" name="position" type="java.lang.String"/>-->
    </cep:mapMapping>
</cep:input>
<cep:query name="SecondQuery">
    <cep:expression><![CDATA[from parsedPacketStream[parsedPac !="null"]
insert into displayPacketStream * ]]></cep:expression>
    <cep:output brokerName="activemqJmsBroker" topic="displayTopic">
      <!--<cep:mapMapping>
        <cep:property name="expInYears" valueOf="expInYears"/>
        <cep:property name="empName" valueOf="empName"/>
        <cep:property name="position" valueOf="position"/>
      </cep:mapMapping> -->
      <cep:textMapping>Experience is - {expInYears}</cep:textMapping>
    </cep:output>
</cep:query>

displayTopic的流定义

{"streamId":"displayTopic:1.0.0","name":"displayTopic","version":"1.0.0","description":"PVTsinJson","metaData":[{"name":"ClientType","type":"STRING"}],
"payloadData":[{"name":"expInYears","type":"INT"},{"name":"empName","type":"STRING"},{"name":"position","type":"STRING"}]}
4

1 回答 1

1

我认为您正在尝试 WSO2 CEP 2.1.0 中不直接支持的 JSON 映射。

如果我正确理解了您的问题,我认为您正在将原始输入从第一个 cep 存储桶中的扩展转换为 JSON,然后基于此编写第二个查询。但是,由于不直接支持 JSON 输入映射,因此第二个查询将只能看到整个字符串而不是 JSON 对象。

在您的场景中将原始输入转换为JSON是否有特定要求?

如果没有,使用您的自定义扩展,您可以将其转换为 JSON 以外的 CEP 2.1.0 支持的格式(例如 Map、Tuple、XML),您应该能够毫无问题地处理这些格式。

另一种方法可能是通过 REST API 发送 JSON 转换的事件,如 [1] 中提供的文档示例中所示。默认情况下,此 API 会将 JSON 事件转换为元组事件。

无论如何,下一个 CEP 3.0.0 版本将支持 JSON 输入映射。

[1] http://docs.wso2.org/wiki/display/CEP210/Build+Analyzer

高温下,

于 2013-07-25T12:27:39.753 回答