在Apache Edgent中加入不同类型的流

时间:2016-12-22 09:44:22

标签: java json apache-edgent

我有3个流:

TStream<Double> tempReadings=topology.poll(tempSensor, 10, TimeUnit.SECONDS);
TStream<Double> co2Readings=topology.poll(co2Sensor, 10, TimeUnit.SECONDS);
TStream<Boolean> stationaryReadings=topology.poll(stationarySensor, 10, TimeUnit.SECONDS);

我目前从3个JSON对象创建3个独立的设备事件:

TStream<JsonObject> tempJson=tempReadings.map(tuple->{
    JsonObject json=new JsonObject();
    json.addProperty("Temperature", tuple);
    return json;
});
TStream<JsonObject> co2Json=co2Readings.map(tuple->{
    JsonObject json=new JsonObject();
    json.addProperty("C02Level", tuple);
    return json;
});
TStream<JsonObject> sensoryJson=stationaryReadings.map(tuple->{
    JsonObject json=new JsonObject();
    json.addProperty("isStationary", tuple);
    return json;
});

我想通过将这些流连接在一起并创建一个具有三个属性(Temperature,C02Level和isStationary)的JSON对象来创建单个事件。

2 个答案:

答案 0 :(得分:1)

你可以union流,但这只会将一个元组放在另一个元组之后,你需要使用相同类型的流。

如果您想一次读取所有3个属性,可以创建一个返回“读数”对象的传感器:

class Reading {
    Double temperature;
    Double c02Level;
    Boolean isStationary;
}

答案 1 :(得分:1)

在这种情况下,&#34;单一民意调查结合阅读元组&#34;方法可能是最好的。

更一般地说,PlumbingStreams.barrier()可用于合并多个流的相应元组。类似的东西:

TStream<JsonObject> combinedReadings =
    PlumbingStreams.barrier(Arrays.asList(tempJson,co2Json,sensoryJson))
    .map(list -> combineTuples(list));


static JsonObject combineTuples(JsonObject list...) {
  JsonObject jo = new JsonObject();
  for (JsonObject j : list) {
    for (Entry<String,JsonElement> e : j.entrySet()) {
      jo.addProperty(e.getKey(), e.getValue());
    }
  }
  return jo;
}