public static void start(List<Fetcher> fetchers) {

    try {

      for (Fetcher fetcher : fetchers) {
        Fetch fetch = fetcher.getFetch();
        if (fetch == null) {
          continue;
        }
        Link link = new Link(fetch.getTitle(), fetch.getUrl());
        link.setRoot(fetch.getUrl());
        fetch(fetcher.createRequest(), fetcher.getRegexRule(), link, 10000);
        EventInst.getInstance().getAsyncEventBus().post(fetcher);
      }

    } catch (Exception ex) {
      Logger.getLogger(FetchUtils.class.getName()).log(Level.SEVERE, null, ex);
    }
  }
  public static void fetch(HttpRequest request, RegexRule regexRule, Link link, int limit) {
    try {

      HttpResponse response = request.getResponse(link);
      Raw raw = ParseUtils.getRaw(response, regexRule, limit);
      Transaction ts = new Transaction();
      LinkWriter linkWriter = new LinkWriter(ts);
      LinkReader linkReader = new LinkReader();
      for (Link childLink : raw.getLinks()) {
        childLink.setDepth(link.getDepth() + 1);
        childLink.setCreateDate(new Date(System.currentTimeMillis()));
        childLink.setExpired(false);
        childLink.setFetched(false);
        childLink.setId(UuidUtils.base58Uuid());
        childLink.setRoot(link.getRoot());

        if (childLink.getDepth() < request.getDepth()
            && linkReader.countHash(childLink.getHash()) == 0) {
          linkWriter.add(childLink);
        }
      }
      // 保存内容啊。。
      ContentWriter contentWriter = new ContentWriter(ts);
      contentWriter.add(raw.getContent());
      DescriptionWriter descriptionWriter = new DescriptionWriter(ts);
      descriptionWriter.add(raw.getDescription());
      ts.save();

    } catch (Exception ex) {
      Logger.getLogger(FetchUtils.class.getName()).log(Level.SEVERE, null, ex);
    }
  }