Pool thread consulta webservice e salva no banco

Olá Boa tarde !!

Amigos, estou precisando de uma ajuda.

Eu tenho uma massa de dados em um tabela do banco de dados quando a aplicação é inicializada é feito a leitura desta tabela e para cada resgistro eu faço um acesso em um webservice o resultado desta consulta é guardado no banco em uma outra tabela.

Usei um codigo de exemplo de um pool de thread para vazer varias consultas no webservice ao mesmo tempo e em seguida salva no banco.
mas parece que a thread perde os valores quando vai inserir o resultado no final.

aqui vai um pedaço do codigo que estou usando, desde já fico grato !

 public Orchestrator(TbPlane plane) {
        daostep = Lookup.getDefault().lookup(DaoStep.class);
        steps = daostep.getStepPlane(plane);
        daoctrl = Lookup.getDefault().lookup(DaoCtrl.class);
        daoweb = Lookup.getDefault().lookup(DaoWebsrv.class);
        filtros = Lookup.getDefault().lookup(DaoFiltros.class);
        pool = new ThreadPool(30);
        key=pool.registerTaskGroup(1);
    }

    public void start(){
        running=true; 
        daoctrl.initDao();
        
        TbWebsrv wsrvruy=daoweb.getRow(1);
        param=daoweb.getParam(wsrvruy);
        int ii=0;
        while(daoctrl.hasNext()){
            for (final TbProcessa p : daoctrl.getList()) {
                try {
                    System.out.println("pool thread :"+pool.numThreads());
                    while(pool.queue()>=30){
                        System.out.println("Wating...");
                        try {
                            Thread.sleep(5000);
                        } catch (InterruptedException ex) {
                            Exceptions.printStackTrace(ex);
                        }
                    }
                    pool.add(key, new Thread( new RThread(param, p)));
                    System.out.println("Fila :"+pool.queue());
                    System.out.println("Benef :"+p.getTbProcessaPK().getCdbenef()+" linha :"+ii);
                } catch (Throwable ex) {
                    Exceptions.printStackTrace(ex);
                }
            }            
        }

e aqui o codigo da thread

public  class RThread implements Runnable{
    
    private final TbProcessa p;
    private final List<TbWebsrvParam> service;
    
    public  RThread( List<TbWebsrvParam> service, TbProcessa p){
        this.service=service ;               
        this.p=p;          
        
    }
    
    
    public void run() {   
        System.out.println("Processando ...");
      
        XmltoObject<RESULTADO> procxml = new XmltoObject<>();
        procxml.setAlias("RESULTADO", RESULTADO.class); 
        DaoRuy dao=Lookup.getDefault().lookup(DaoRuy.class);
        WsrvProcessa exec  = Lookup.getDefault().lookup(WsrvProcessa.class);
        exec.getDefaultParam(service);
        exec.setPesquisa("beneficio", p.getTbProcessaPK().getCdbenef());
        exec.setPesquisa("nascimento", DateUtil.parseString(p.getDtNasc()));        
        p.setStep(1);

        RESULTADO r = procxml.Xml2Object(exec.ProcessaAcesso());
        dao.insRetorno(r,p); 
        
        System.out.println("Processado ...");
    }
}

obrigado !!

O que vc precisa?

Bom depois de colocar a parte do metodo run em um bloco sincronizado uma parte do problema resolveu.

mas eu algo sai errado e ainda não achei o motivo

meu pool é feito da seguinte forma :

public PoolThread(int nthread) {
        queue = new ArrayBlockingQueue<Runnable>(30, true);
        pool = new ThreadPoolExecutor(
                nthread,
                nthread,
                10,
                TimeUnit.SECONDS,
                queue);
        pool.setRejectedExecutionHandler(new RejectedExecutionHandler() {

            public void rejectedExecution(Runnable r, ThreadPoolExecutor executor) {
                try {
                    executor.getQueue().put(r);
                } catch (InterruptedException ex) {
                    Exceptions.printStackTrace(ex);
                }
            }
        });
    }

Depois e executar um primeiro While , terminar e consultar o webservice e inserir no banco eu chamado o shutdown e o awaitTermination
antes de chamar um segundo while, mas parece que o awaitTermination não espera todas a thread terminarem.

Alguém já passou por isso ?

Não usamos mais pool dessa forma…depois do java 5 a coisa ficou extremamente facil com a java.util.concurrent e a especificação para pool do JSE.
Veja novos (que não são mais novos) recursos

Realmente fica mais facil fazer desta forma.
Mas eu precisa saber alguma coisas durante a execução, por exemplo:

se a fila está muito grande
quantas thread já foram executadas

neste caso a saida seria fazer uma implementar do threadfactory ?

Da para fazer sim…escolha alguma implementação da ExecutorService e veja oq vc pode fazer…