Estou implementando uma classe que pega uma tarefa e executa, durante esta execução, ela atualiza a tabela no banco e eu leio essas informações para mostrar na tela o progresso.
A questão é que não estou conseguindo mostrar na tela pois aparentemente tudo esta sendo executado em uma mesma transação, inclusive o laço (while)…
Enquanto o while não termina, o banco não é atualizado… e eu preciso que a cada loop do while, a base seja atualizada.
Vocês podem notar que a transação eu abro em outro metodo.
publicTaskexecute(Tasktask){intcheck=0;intamount=task.getTaamount();inttime2check=10;intsteps=amount/time2check;inti=0;while(i<task.getTaamount()){if(executeTransaction(task)==true){i++;updateTaskDone(i,task);}else{i=task.getTaamount();}}task.setTadatefinish(newDate());task.setTastatus(Short.valueOf("3"));em.merge(task);returntask;}@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)publicbooleanexecuteTransaction(Tasktask){try{Stringserial;if(task.getTaseed()==null){serial=SerializationFactory.getSerialization("DEFAULT").getSerializedString(task.getTasize());}else{serial=SerializationFactory.getSerialization("DEFAULT").getSerializedString(task.getTasize(),task.getTaseed());}inttcode=codeFacade.countCodeBySerial(task.getCompany().getIdcompany(),serial);if(tcode==0){Codec=newCode();c.setCompany(task.getCompany());c.setTask(task);c.setCodate(newDate());c.setCostatus(Short.valueOf("1"));c.setCoserial(serial);codeFacade.create(c);}else{System.out.println("Serial já existe!!!");}returntrue;}catch(Exceptione){System.out.println("Erro no EJB do task - transaction");e.printStackTrace();context.setRollbackOnly();System.out.println(e.getMessage()+" "+e.getLocalizedMessage());returnfalse;}}
Eu NÃO uso EJB, mas uso Spring que tem esse conceito de controle de transação por anotações e talz.
Na época que eu tive este problema, eu fiz uma nova classe só para possuir o método (no seu caso) ‘executeTransaction(Task task)’ com ‘requires_new’, vou chamar aqui de ‘TaskFacadeAux’.
Mas o segredo era que eu NÃO podia injetar diretamente assim:
Muito obrigado pela dica!
Fiz a alteração mas o comportamento foi o mesmo... :shock:
Um abs
@Stateless@TransactionManagement(TransactionManagementType.CONTAINER)publicclassTaskAuxFacadeimplementsTaskAuxFacadeLocal{@ResourceprivateEJBContextcontext;@EJBprivateCodeFacadeLocalcodeFacade;@EJBprivateCompanyEJBLocalcompanyEJB;@EJBprivateUnitFacadeLocalunitFacade;// Add business logic below. (Right-click in editor and choose// "Insert Code > Add Business Method")@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)publicbooleanexecuteTransaction(Tasktask){try{Stringserial;if(task.getTaseed()==null){serial=SerializationFactory.getSerialization("DEFAULT").getSerializedString(task.getTasize());}else{serial=SerializationFactory.getSerialization("DEFAULT").getSerializedString(task.getTasize(),task.getTaseed());}inttcode=codeFacade.countCodeBySerial(task.getCompany().getIdcompany(),serial);if(tcode==0){Codec=newCode();c.setCompany(task.getCompany());c.setTask(task);c.setCodate(newDate());c.setCostatus(Short.valueOf("1"));c.setCoserial(serial);codeFacade.create(c);Unitu=newUnit();u.setUncreateddate(newDate());u.setCompany(task.getCompany());u.setCode(c);u.setLine(task.getLine());u.setUnstatus(Short.valueOf("1"));u.setUnstore(Short.valueOf("1"));//em.persist(u);unitFacade.create(u);}else{System.out.println("Serial já existe!!!");}returntrue;}catch(Exceptione){System.out.println("Erro no EJB do task - transaction");e.printStackTrace();context.setRollbackOnly();System.out.println(e.getMessage()+" "+e.getLocalizedMessage());returnfalse;}}}
@Stateless//@TransactionManagement(TransactionManagementType.CONTAINER)publicclassTaskFacadeextendsAbstractFacade<Task>implementsTaskFacadeLocal{@EJBprivateTaskAuxFacadeLocaltaskAuxFacade;@ResourceprivateEJBContextcontext;@EJBprivateCodeFacadeLocalcodeFacade;@EJBprivateCompanyEJBLocalcompanyEJB;@EJBprivateUnitFacadeLocalunitFacade;protectedEntityManagergetEntityManager(){returnem;}publicTaskFacade(){super(Task.class);}publicList<Task>findTaskByCompany(intidcompany){try{Companycompany=companyEJB.findCompanyById(idcompany);//Query q = em.createQuery("SELECT t FROM Task t WHERE t.company = :company AND t.tadatefinish is null order by t.tadatecreate desc");Queryq=em.createQuery("SELECT t FROM Task t WHERE t.company = :company order by t.tadatecreate desc");q.setParameter("company",company);returnq.getResultList();}catch(Exceptionerro){returnnull;}}publicList<Task>findLineBySearch(intidcompany,Stringsearch){try{Companycompany=companyEJB.findCompanyById(idcompany);Queryq=em.createQuery("SELECT t FROM Task t WHERE t.company = :company AND t.tadatefinish is null AND t.tacode like '%"+search+"%' or t.taseed like '%"+search+"%' or t.line.liname like '%"+search+"%' order by t.tadatecreate desc");q.setParameter("company",company);returnq.getResultList();}catch(Exceptionerro){returnnull;}}publicbooleanupdateTaskDone(intcountDone,Tasktask){try{task.setTadone(countDone);em.merge(task);returntrue;}catch(Exceptione){returnfalse;}}publicTaskexecute(Tasktask){intcheck=0;intamount=task.getTaamount();inttime2check=10;intsteps=amount/time2check;inti=0;while(i<task.getTaamount()){//taskAuxFacade.executeTransaction(task);if(taskAuxFacade.executeTransaction(task)==true){i++;updateTaskDone(i,task);}else{i=task.getTaamount();}}task.setTadatefinish(newDate());task.setTastatus(Short.valueOf("3"));em.merge(task);returntask;}//@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)publicbooleanexecuteTransaction(Tasktask){try{Stringserial;if(task.getTaseed()==null){serial=SerializationFactory.getSerialization("DEFAULT").getSerializedString(task.getTasize());}else{serial=SerializationFactory.getSerialization("DEFAULT").getSerializedString(task.getTasize(),task.getTaseed());}inttcode=codeFacade.countCodeBySerial(task.getCompany().getIdcompany(),serial);if(tcode==0){Codec=newCode();c.setCompany(task.getCompany());c.setTask(task);c.setCodate(newDate());c.setCostatus(Short.valueOf("1"));c.setCoserial(serial);codeFacade.create(c);Unitu=newUnit();u.setUncreateddate(newDate());u.setCompany(task.getCompany());u.setCode(c);u.setLine(task.getLine());u.setUnstatus(Short.valueOf("1"));u.setUnstore(Short.valueOf("1"));//em.persist(u);unitFacade.create(u);}else{System.out.println("Serial já existe!!!");}returntrue;}catch(Exceptione){System.out.println("Erro no EJB do task - transaction");e.printStackTrace();//context.setRollbackOnly();System.out.println(e.getMessage()+" "+e.getLocalizedMessage());returnfalse;}}}
Você está utilizando um Bean sem informações de estado e sem usar JTA.
Logo o escopo da transação só termina quando termina o método chamado do Bean.
Para resolver o seu problema você deve utilizar JTA, definindo o começo da transação e o final dela,
usando o javax.transaction.UserTransaction definindo o begin( ) e o commit( ). Com isso você terá o controle da Transação.
A
alex.brito
Cara, não sei se ajuda, mas vale como alternativa.
Dentro do While você pode força o commit executando um flush.
em.flush();
Tenta ai …
[]'s
kleins
hehehe…
Nem fazendo lookup esta funcionando…
Agora a tarnsação esta apenas na classe auxiliar que é um EJB… e nada…
Tentei como vc falou, mas pelo jeito eu teria que trocar o tipo de transação para resource_local, certo? Pra mim não é viavel.
Deu esta exception.
Caused by: javax.persistence.TransactionRequiredException
Valeuu
/* * To change this template, choose Tools | Templates * and open the template in the editor. */*/@Stateless@TransactionManagement(TransactionManagementType.BEAN)publicclassTaskFacadeextendsAbstractFacade<Task>implementsTaskFacadeLocal{//@EJB//private TaskAuxFacadeLocal taskAuxFacade;@ResourceprivateEJBContextcontext;@ResourceprivateUserTransactionut;@EJBprivateCodeFacadeLocalcodeFacade;@EJBprivateCompanyEJBLocalcompanyEJB;@EJBprivateUnitFacadeLocalunitFacade;protectedEntityManagergetEntityManager(){returnem;}publicTaskFacade(){super(Task.class);}publicTaskexecute(Tasktask){intcheck=0;intamount=task.getTaamount();inttime2check=10;intsteps=amount/time2check;inti=0;while(i<task.getTaamount()){//taskAuxFacade.executeTransaction(task);if(executeTransaction(task)==true){i++;updateTaskDone(i,task);}else{i=task.getTaamount();}}task.setTadatefinish(newDate());task.setTastatus(Short.valueOf("3"));em.merge(task);returntask;}//@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)publicbooleanexecuteTransaction(Tasktask){try{ut.begin();Stringserial;if(task.getTaseed()==null){serial=SerializationFactory.getSerialization("DEFAULT").getSerializedString(task.getTasize());}else{serial=SerializationFactory.getSerialization("DEFAULT").getSerializedString(task.getTasize(),task.getTaseed());}inttcode=codeFacade.countCodeBySerial(task.getCompany().getIdcompany(),serial);if(tcode==0){Codec=newCode();c.setCompany(task.getCompany());c.setTask(task);c.setCodate(newDate());c.setCostatus(Short.valueOf("1"));c.setCoserial(serial);codeFacade.create(c);Unitu=newUnit();u.setUncreateddate(newDate());u.setCompany(task.getCompany());u.setCode(c);u.setLine(task.getLine());u.setUnstatus(Short.valueOf("1"));u.setUnstore(Short.valueOf("1"));//em.persist(u);unitFacade.create(u);ut.commit();em.flush();}else{System.out.println("Serial já existe!!!");}returntrue;}catch(Exceptione){try{System.out.println("Erro no EJB do task - transaction");e.printStackTrace();//context.setRollbackOnly();ut.rollback();System.out.println(e.getMessage()+" "+e.getLocalizedMessage());}catch(IllegalStateExceptionex){Logger.getLogger(TaskFacade.class.getName()).log(Level.SEVERE,null,ex);}catch(SecurityExceptionex){Logger.getLogger(TaskFacade.class.getName()).log(Level.SEVERE,null,ex);}catch(SystemExceptionex){Logger.getLogger(TaskFacade.class.getName()).log(Level.SEVERE,null,ex);}returnfalse;}}}
Abs
johnny quest:
Você está utilizando um Bean sem informações de estado e sem usar JTA.
Logo o escopo da transação só termina quando termina o método chamado do Bean.
Para resolver o seu problema você deve utilizar JTA, definindo o começo da transação e o final dela,
usando o javax.transaction.UserTransaction definindo o begin( ) e o commit( ). Com isso você terá o controle da Transação.