private static void divideAndAddMessages(Collection<Message> messages, Message message, int maxBytes) throws SparkplugException, JsonProcessingException { Topic topic = message.getTopic(); SparkplugBPayload payload = message.getPayload(); List<Metric> metrics = payload.getMetrics(); final int metricCount = message.getPayload().getMetricCount(); final int size = toJsonString(message).getBytes().length; // Check if the message can be divided if (metricCount <= 1) { throw new SparkplugException("Cannot divide SparkplugBPayload with only " + metricCount + " metric(s)"); } int newMessageCount = size / maxBytes + ((size % maxBytes > 0) ? 1 : 0); int metricsPerMessageCount = metricCount / newMessageCount + ((metricCount % newMessageCount > 0) ? 1 : 0); int index = 0; while (index < metricCount) { int toIndex = metricCount < (index + metricsPerMessageCount) ? metricCount : index + metricsPerMessageCount; // build a new Message with the payload containing the next subset (count) of metrics Message newMessage = new MessageBuilder(topic, new SparkplugBPayloadBuilder().setTimestamp(payload.getTimestamp()).setUuid(payload.getUuid()) .setSeq(payload.getSeq()).addMetrics(new ArrayList<Metric>(metrics.subList(index, toIndex))) .createPayload()).build(); String jsonMessage = toJsonString(newMessage); if (jsonMessage.getBytes().length < maxBytes) { messages.add(newMessage); } else { divideAndAddMessages(messages, newMessage, maxBytes); } index += metricsPerMessageCount; } }
public SparkplugBPayload buildFromByteArray(byte[] bytes) throws Exception { SparkplugBProto.Payload protoPayload = SparkplugBProto.Payload.parseFrom(bytes); SparkplugBPayloadBuilder builder = new SparkplugBPayloadBuilder(protoPayload.getSeq()); // Set the timestamp if (protoPayload.hasTimestamp()) { builder.setTimestamp(new Date(protoPayload.getTimestamp())); } // Set the sequence number if (protoPayload.hasSeq()) { builder.setSeq(protoPayload.getSeq()); } // Set the Metrics for (SparkplugBProto.Payload.Metric protoMetric : protoPayload.getMetricsList()) { builder.addMetric(convertMetric(protoMetric)); } // Set the body if (protoPayload.hasBody()) { builder.setBody(protoPayload.getBody().toByteArray()); } // Set the body if (protoPayload.hasUuid()) { builder.setUuid(protoPayload.getUuid()); } return builder.createPayload(); }