code: public boolean shutdown() {
          LOG.debug("shutdownHook列表与unit列表是分开维护的，当前shutdownHook对象与目标unit对象不是同一个对象！");
          Unit batchUnitProxy = LocalUnitsManager.getLocalUnit(getGroup().getName(), getName());
          BatchUnit batchUnit;
          //in case the unit is proxied, which means if you want to flush the non-flushed cache list, you must get the most original object.
          if (Proxy.isProxyClass(batchUnitProxy.getClass())) {
              batchUnit = (BatchUnit) ProxyBuilder.getProxyBuilder(batchUnitProxy.hashCode()).getMostOriginalObject();
          } else {
              batchUnit = (BatchUnit) batchUnitProxy;
          }
          if (!batchUnit.recordCacheList.isEmpty()) {
              final Map<String, Object> recordCache = new HashMap<>();
              synchronized (batchUnit.recordCacheList) {
                  recordCache.put(VALUES, new ArrayList<>(batchUnit.recordCacheList));
                  recordCacheList.clear();
              }
              SingleRxXian.call(getBatchGroupName(), getBatchUnitName(), recordCache).blockingGet();
          }
          return true;
      }
docs: 执行shutdownHook