Проблема с использованием jsoup в рекурсивной структуре пула потоков - PullRequest
0 голосов
/ 16 октября 2018

Проблема, с которой я столкнулся на самом деле, заключается в том, что я хочу собирать данные из многих URL-адресов, и из-за того факта, что я могу получить только следующий URL-адрес, который мне нужно проанализировать, путем синтаксического разбора актуального, а проблема заключается в том, чтовремени ответа сервера, если запрос не был отправлен одновременно, это заняло бы слишком много времени, я решил использовать рекурсивную структуру FixedThreadPool с использованием Jsoup.

Но похоже, что чем больше потоков запущено,чем больше ошибок делает программа, и я не могу найти проблему.

import java.io.IOException;
import java.util.Vector;
import java.util.concurrent.Callable;
import java.util.concurrent.Semaphore;
import java.util.concurrent.ThreadPoolExecutor;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;

public class MyCallable implements Callable
{
   private final Tree ak;
   private final ThreadPoolExecutor executor;
   private final Node root;
   private long id;

   public MyCallable(Node Root, Tree aka, ThreadPoolExecutor tpe)
   {
       this.ak = aka;
       this.executor = tpe;
       this.root = Root;
   }

   @Override
    public Object call() throws Exception, IOException {
        Document doc = Jsoup.connect(this.root.getLink()).get();
        Elements links = doc.select("a[href]");
        int i = 0;
        for (Element link : links) {
            String adresse = link.attr("abs:href");
            if(adresse.contains("/keyword/"){
                Node neu = this.ak.addifnotexists(link.text(),adresse, this.id ,root , false); 
                if (neu != null){
                    i++;
                    this.executor.submit(new MyCallable(neu,this.ak,this.executor));
                }
            }
        }
        throw new UnsupportedOperationException("Not supported yet.");
    }

}

РЕДАКТИРОВАТЬ: @ akshaya pandey

import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;
import java.util.ArrayList;
import java.util.Vector;
public class Tree
{
    Vector<Node> allNodes = new Vector<Node> (25000, 1000);
    public synchronized Node addifnotexists(String Kategoriename, String Link, long id, Node Root, boolean first) throws InterruptedException{
        boolean existsalready = false;
        if (!first){
            existsalready = doesexist(Kategoriename, Link);
        }  
        if (!existsalready){
            allNodes.add(new Node(Kategoriename, Link, id, Root, new String[10][101], first));  
        }
        if (existsalready) {
            return null;
        }
        System.out.println(allNodes.size());
        return allNodes.get(allNodes.size()-1);
    }
    private synchronized boolean doesexist (String kategorie, String lilink) { 
        int start = 0;
        int end = 0;
        int j = 0;
        int i = 0;
        String Kat;
        char[] Kate;
        for (Node node : allNodes){  
            if (node.getKategorie().equals(kategorie)){
                Kat = node.getLink();
                Kate = Kat.toCharArray();
                for (char bstb : Kate){
                    if (bstb == ('/')){
                        i++;
                        if (i == 5){
                            start = j;
                        }
                        if (i == 6){
                            end = j;
                        }
                    }
                    j++;
                }
                Kat = Kat.substring(Math.abs(start), Math.abs(end+1));
                Kate = lilink.toCharArray();
                i = 0;
                j = 0;
                for (char bstb : Kate){
                    if (bstb == ('/')){
                        i++;
                        if (i == 5){
                            start = j;
                        }
                        if (i == 6){
                            end = j;
                        }
                    }
                    j++;
                }
                String linkvergleich = lilink.substring(Math.abs(start), Math.abs(end+1));
                if(linkvergleich.equals(Kat)){
                    return true;
                }
            }
        }
        return false;
    }

}


import java.util.ArrayList;
import java.io.*;
public class Node implements Serializable
{
    private final Node root;
    private final String kategorie;
    private final String link;
    private final String[][] bestsellerliste;
    private final long ID;
    private ArrayList <Node> naechster = new ArrayList <Node>();
    public Node(String Kategoriename, String Link, long id, Node Root , String[][] Produktliste, boolean erster)
    {
        this.root = Root;
        this.kategorie = Kategoriename;
        this.link = Link;
        this.bestsellerliste = Produktliste;
        if (!erster){
            this.root.setNaechster(this);
        }
        this.ID = id;
        //System.out.println(Kategoriename);
    }
    public synchronized Node getRoot()
    {
        return this.root;
    }
    public synchronized String getKategorie()
    {
        return this.kategorie;
    }
    public synchronized String getLink()
    {
        return this.link;
    }
    public synchronized  String[][] getBestsellerliste()
    {
        return this.bestsellerliste;
    }
    public synchronized void setNaechster(Node next){
        naechster.add(next);
    }
    public synchronized void deleteNaechster(Node next){
        naechster.remove(next);
    }
    public synchronized ArrayList <Node> getNaechster(){
        return this.naechster;
    }
    public synchronized long getID(){
        return this.ID;
    }
}
...