@Override
 public boolean testMessage(Message msg) {
   if (msg.hasHeader()) {
     MessageHeader header = msg.getHeader();
     if (header.hasProperties()) {
       Map<String, ByteString> props = MapUtils.buildMap(header.getProperties());
       ByteString value = props.get(OPT_MOD);
       if (null == value) {
         return false;
       }
       int intValue = Integer.valueOf(value.toStringUtf8());
       if (0 != intValue) {
         return false;
       }
       return true;
     } else {
       return false;
     }
   } else {
     return false;
   }
 }
 private void publishNums(ByteString topic, int start, int num, int M) throws Exception {
   for (int i = 1; i <= num; i++) {
     PubSubProtocol.Map.Builder propsBuilder =
         PubSubProtocol.Map.newBuilder()
             .addEntries(
                 PubSubProtocol.Map.Entry.newBuilder()
                     .setKey(OPT_MOD)
                     .setValue(ByteString.copyFromUtf8(String.valueOf((start + i) % M))));
     MessageHeader.Builder headerBuilder = MessageHeader.newBuilder().setProperties(propsBuilder);
     Message msg =
         Message.newBuilder()
             .setBody(ByteString.copyFromUtf8(String.valueOf((start + i))))
             .setHeader(headerBuilder)
             .build();
     publisher.publish(topic, msg);
   }
 }