/**
* Kafka 接收消息 拆 根据 PB格式
*/
public class KafkaFZParamReceive extends KafkaRecieveBase<List<ConsumerRecord<String, FangzhenData.FzStreamPbFrame>>> {
private List<AddressIpVo> addr;
@Override
@KafkaListener(topics = KafkaTopicEnum.FZ_PARAM_EXPORT_TOPIC)
public void receive(List<ConsumerRecord<String, FangzhenData.FzStreamPbFrame>> crs, Acknowledgment acknowledgment) throws InvalidProtocolBufferException, UnsupportedEncodingException {
List<FangzhenData.FzStreamPbFrame> fzStreamPbFrames = crs.stream()
.map(ConsumerRecord::value)
.filter(Objects::nonNull)
.collect(Collectors.toList());
for (FangzhenData.FzStreamPbFrame fzStreamPbFrame : fzStreamPbFrames) {
if (fzStreamPbFrame.getHead() == null) {
continue;
}
getAddr(fzStreamPbFrame.getHead());
dealFzParam(fzStreamPbFrame);
}
acknowledgment.acknowledge();
}
private void dealFzParam(FangzhenData.FzStreamPbFrame fzStreamPbFrame) throws InvalidProtocolBufferException {
FangzhenData.FzStreamHead head = fzStreamPbFrame.getHead();
ByteString value = fzStreamPbFrame.getPayload().getValue();
FangzhenData.FangzhenParamResults fangzhenParam = FangzhenData.FangzhenParamResults.parseFrom(value);
Map<Long, FangzhenParamVo> startMap = new HashMap<>();
for (FangzhenData.FangzhenParamResult fangzhenParamResult : fangzhenParam.getParamsResultList()) {
FangzhenParamVo fangzhenParamVo = new FangzhenParamVo();
if (!ValidUtil.isNumber(fangzhenParamResult.getValue())) {
continue;
}
if (!startMap.containsKey(fangzhenParamResult.getStart())) {
fangzhenParamVo.setStart((int) fangzhenParamResult.getStart());
fangzhenParamVo.setEnd((int) fangzhenParamResult.getEnd());
fangzhenParamVo.setValue(Integer.parseInt(fangzhenParamResult.getValue()));
startMap.put(fangzhenParamResult.getStart(), fangzhenParamVo);
} else {
fangzhenParamVo = startMap.get(fangzhenParamResult.getStart());
fangzhenParamVo.setValue(Integer.parseInt(fangzhenParamResult.getValue()) + fangzhenParamVo.getValue());
}
}
}
PB格式
syntax = "proto3";
package HLProtobuf;
//找机会统一下此PB文件的包路径和格式
import "google/protobuf/any.proto";
import "google/protobuf/timestamp.proto";
option java_package = "com.hlht.core.pb";
option java_outer_classname = "FangzhenData";
//流式数据
message FzStreamPbFrame {
FzStreamHead head = 1;
google.protobuf.Any payload = 2;
}
//信息头
message FzStreamHead {
// 信宿
string did = 1;
// 包头组装好的数据
string headH = 2;
// 数据部分组装好的数据
string dataH = 3;
// 识别字,数据库code字段
string code = 4;
}
// 单个原始数据
message FangzhenParam {
//数据起始位
uint64 start = 1;
//数据结束位
uint64 end = 2;
// 参数识别字
string paramWord = 3;
// 要计算的值
string value = 4;
}
// 参数数组
message FangzhenParams {
// 参数数据列表
repeated FangzhenParam params = 1;
}
// 单个结果数据
message FangzhenParamResult {
//数据起始位
uint64 start = 1;
//数据结束位
uint64 end = 2;
// 参数识别字
string paramWord = 3;
// 原始值
string origin = 4;
// 要计算的值
string value = 5;
}
// 参数结果数组
message FangzhenParamResults {
// 处理结果
repeated FangzhenParamResult paramsResult = 1;
}