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 !!