Use spring-boot and @Component with @scheduled and it hangs every 12 hours

Asked

Viewed 146 times

1

I have a project done with Jhipster. He uses spring-boot. I use this application as an order platform where I consume several webservices of an ERP and also sound cronizo the data with android devices in the mobile version of the platform.

To consume ERP Wss, I use a class with Annotation @Component and @Scheduled(fixedDelayString = "90000") so that it works as a job every 90 seconds. It consumes 11 webservices. The problem is that this Job stops working approximately every 12 hours.

I have another similar Job running on the same project, but that does not consume any external resource, just makes calculations.

The 2 Jobs stop at the same time and only a few REST methods work.

Does anyone have any idea what it might be?

follows class:

package br.inf.gati.gts.job;



@Component
public class SyncErpJob {

    private final Logger log = LoggerFactory.getLogger(SyncErpJob.class);

    @Autowired
    private EmpresaFilialRepository empresaFilialRepo;

    @Autowired
    private ClienteRepository clienteRepo;

    @Autowired
    private ProdutoRepository produtoRepo;

    @Autowired
    private CondicaoPagtoRepository condPagtoRepo;

    @Autowired
    private TransportadoraRepository transpRepo;

    @Autowired
    private TabelaPrecoRepository tabPrecoRepo;

    @Autowired
    private TabelaPrecoProdutoRepository tabPrecoProdRepo;

    @Autowired
    private ExcecaoFiscalRepository excecaoRepo;

    @Autowired
    private OperacaoFiscalRepository operacaoRepo;

    @Autowired
    private ParamImpostosRepository impostosRepo;

    @Autowired
    private PedidoVendaRepository pedidoRepo;

    @Autowired
    private ContasReceberRepository contasRepo; 

    @Autowired
    private MailService mailService;

    @Value("${gts.webservice.soap.ativo}")
    public Boolean ativo;

    @Value("${gts.webservice.soap.erp.date.format}")
    public String dateFormatPattern;

    @Value("${gts.webservice.soap.erp.date.timezone}")
    public String timeZoneParam;

    @Value("${gts.webservice.soap.erp.url}")
    private String url;

    @Value("${gts.webservice.soap.erp.port}")
    private String port;

    @Scheduled(fixedDelayString = "${gts.webservice.soap.erp.time}")
    public void ConsumoSOAPErp() {        

        if(ativo){
            log.info("SEJ-MSG001: Percorrendo Webservices de consumo de dados do ERP!");

            AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(SoapClientConfig.class);

            List<EmpresaFilial> listaFiliais = empresaFilialRepo.findAll();
            for (EmpresaFilial filial : listaFiliais){
                log.info("SEJ-MSG003: Empresa:["+filial.getCdEmpresa()+"] Filial:["+filial.getCdFilial()+"]");

                consomeCliente(filial, context);                 
                consomeProduto(filial, context);                 
                consomeCondPagto(filial, context);               
                // demais WS
            }

            context.close();

        }else{
            log.debug("Consumo de werbservices inativo!");
        }    
    }

    private void consomeCondPagto(EmpresaFilial filial, AnnotationConfigApplicationContext context) {

        try{
            CondPagtoWsClient condPagtoListaWs = context.getBean(CondPagtoWsClient.class);

            condPagtoListaWs.setUrl(url);
            condPagtoListaWs.setPort(port);
            condPagtoListaWs.setDefaultUri(url+":"+port+"/WSDLCPGTO.apw");

            CONDSLSTRESPONSE responseList = condPagtoListaWs.getCondPagtoLstResponse(filial.getCdEmpresa(), filial.getCdFilial());
            List<STCPGTO> wsCondPagto = responseList.getCONDSLSTRESULT().getAREGS().getSTCPGTO();
            for (STCPGTO stCond : wsCondPagto){
                log.info("SEJ-MSG020: Cond.Pagto: cdCod:["+stCond.getCE4COD() +"] "
                        + "Cond. Pagto:["+stCond.getCE4COND() +"]"
                        + "dsCondPagto:["+stCond.getCE4DESCRI()+"]");

                try{
                    BigInteger regNumErp = stCond.getCE4RECNO();

                    CondicaoPagto cond = null;
                    try{
                        cond = condPagtoRepo.findByFilialIdAndCdCondPagto(filial.getId(), 
                                StringUtils.truncate(stCond.getCE4COD().trim(), 3));                    
                    }catch (NullPointerException e) {}

                    if (cond == null){
                        cond = new CondicaoPagto();
                        cond.setFilial(filial);
                        cond.setCdEmpresa(          StringUtils.truncate(filial.getCdEmpresa(),2));//c2     
                        cond.setCdFilial(           StringUtils.truncate(filial.getCdFilial(),2));//c2
                        cond.setCdCondPagto(        StringUtils.truncate(stCond.getCE4COD(),3));//c3
                    }                                       

                    cond.setCdCondicao(         StringUtils.truncate(stCond.getCE4COND(),60));//c60
                    cond.setDsCondPagto(        StringUtils.truncate(stCond.getCE4DESCRI(),60));//c60
                    cond.setNrDiasPrazoMedio(   new BigDecimal(stCond.getCE4PRAZO()));//float14,2
                    cond.setDtSincronizacao(    ZonedDateTime.now());
                    cond.setIdAutorCriacao(     Constants.SERVER);

                    CondicaoPagto condSalvo = condPagtoRepo.save(cond);

                    if (condSalvo != null){                     
                        CONDSRETRESPONSE responseRet = condPagtoListaWs.setCondPagtoRetResponse(filial.getCdEmpresa(), filial.getCdFilial(), regNumErp);

                        if (responseRet != null){
                            if (responseRet.getCONDSRETRESULT().getCRET().trim().equalsIgnoreCase(Constants.RET_SUCESSO)){
                                log.info("SEJ-MSG021: Cond. Pagto. Registro ["+regNumErp+"] integrado e notificado com successo!");
                            }else if (responseRet.getCONDSRETRESULT().getCRET().trim().equalsIgnoreCase(Constants.RET_FALHA)) {
                                log.error("SEJ-MSG022: Cond. Pagto. Registro ["+regNumErp+"] integrado e notificado com falha!");
                            }else {
                                log.error("SEJ-MSG024: Cond. Pagto. Registro ["+regNumErp+"] integrado e notificado com falha no retorno!");
                                log.warn("SEJ-MSG025: msg["+responseRet.getCONDSRETRESULT().getCMESSAGE()+"]");
                                log.warn("SEJ-MSG026: ret["+responseRet.getCONDSRETRESULT().getCRET()+"]");
                            }
                        }else{
                            log.error("SEJ-MSG018: Sem retorno da notificação ao ERP!");
                        }                       
                    }else{
                        log.error("SEJ-MSG019: Falha ao integrar Cond. Pagto. registro ["+regNumErp+"]");
                    }
                }catch (Exception e) {
                    log.error("SEJ-ERR005: Erro no consumo de condição de pagamento", e);
                }
            }
        }catch (RuntimeException e) {
            log.error("SEJ-ERR006: Falha de comunicação no consumo de condição de pagamento", e);
        }
    }

    private void consomeProduto(EmpresaFilial filial, AnnotationConfigApplicationContext context) {

        try{
            ProdutoWsClient produtoListaWs = context.getBean(ProdutoWsClient.class);

            produtoListaWs.setUrl(url);
            produtoListaWs.setPort(port);
            produtoListaWs.setDefaultUri(url+":"+port+"/WSDLProd.apw");

            PRODUTOLSTRESPONSE responseList = produtoListaWs.getProdLstResponse(filial.getCdEmpresa(), filial.getCdFilial());
            List<STPROD> wsProdutos = responseList.getPRODUTOLSTRESULT().getAREGS().getSTPROD();
            for (STPROD stProd : wsProdutos){

                log.info("SEJ-MSG012: Produto: cdProduto:["+stProd.getCB1COD() +"] "
                        + "dsProduto:["+stProd.getCB1DESC()+"]");

                try{
                    BigInteger regNumErp = stProd.getCB1RECNO();

                    Produto prod = null;
                    try{
                        prod = produtoRepo.findByCdEmpresaAndCdFilialAndCdProduto(filial.getCdEmpresa(),
                                filial.getCdFilial(),
                                StringUtils.truncate(stProd.getCB1COD().trim(),15));
                    }catch (NullPointerException e) {}


                    if (prod == null){                      
                        prod = new Produto();
                        prod.setFilial(filial);
                        prod.setCdEmpresa(          StringUtils.truncate(filial.getCdEmpresa().trim(),2));//c2
                        prod.setCdFilial(           StringUtils.truncate(filial.getCdFilial().trim(),2));//c2
                        prod.setCdProduto(          StringUtils.truncate(stProd.getCB1COD().trim(),15));//c15
                    }

                    prod.setDsProduto(          StringUtils.truncate(stProd.getCB1DESC().trim(),120));//c120
                    prod.setCdFamilia(          StringUtils.truncate(stProd.getCB1FPCOD().trim(),2));//c2
                    prod.setCdUnidadeMedida(    StringUtils.truncate(stProd.getCB1UM().trim(),2));//c2
                    prod.setCdGrupo(            StringUtils.truncate(stProd.getCB1GRUPO().trim(),4));//c4
                    prod.setCdGrtrib(           StringUtils.truncate(stProd.getCB1GRTRIB().trim(),6));//c6
                    prod.setPcIpi(              new BigDecimal(stProd.getCB1IPI()));//float5,2
                    prod.setlImportZnFranca(    StringUtils.truncate(stProd.getCB1IMPZFRC().trim(),1).equals(Constants.SIM) ? true : false );//c1
                    prod.setCdProdutoSubst(     StringUtils.truncate(stProd.getCB1ALTER().trim(),15));//c15
                    prod.setVlCmvStandard(      new BigDecimal(stProd.getCB1CUSTD()));//float16,6
                    prod.setVlCmvRazao(         new BigDecimal(stProd.getCCMVRAZAO()));//float16,6
                    prod.setIdOrigem(           StringUtils.truncate(stProd.getCB1ORIGEM().trim(),1));//c1
                    prod.setCdClassFiscal(      StringUtils.truncate(stProd.getCB1POSIPI().trim(),10));//c10
                    prod.setQtEstoqueDisp(      new BigDecimal(stProd.getCESTOQUE()));//float16,0
                    prod.setPcReducPis(         new BigDecimal(stProd.getCB1REDPIS()));//float5,2
                    prod.setPcReducCofins(      new BigDecimal(stProd.getCB1REDCOF()));//float5,2
                    prod.setPcPis(              new BigDecimal(stProd.getCB1PPIS()));//float5,2
                    prod.setPcCofins(           new BigDecimal(stProd.getCB1PCOFINS()));//float5,2
                    prod.setIdSitTrib(          StringUtils.truncate(stProd.getCB1SITTRIB().trim(),1));//c1
                    prod.setDsFichaTecnica(     StringUtils.truncate(stProd.getCFICHADESC(),200));//c200

                    //                  campo nr_aliq_icms_interna criado em 30/09/2016 após reunião com cliente para definir os cálculos
                    prod.setNrAliqIcmsInterna(  new BigDecimal(stProd.getCICMSNCM()));//float5,2);
                    //                  campo nr_aliq_icms_externa  criado em 30/09/2016 após reunião com cliente para definir os cálculos
                    //                  Este campo não será usado atualmente, porem foi sugerido manter pelo Analista Fiscal 
                    prod.setNrAliqIcmsExterna(  new BigDecimal(stProd.getCICMSNCM()));//float5,2);

                    prod.setBlobFichaTecnica(   stProd.getCFICHATEC().getBytes());
                    if (stProd.getCFICHATEC().length() > 0 ){
                        log.error("[[TESTE]] tamanho do blob maior que zero stProd.getCFICHATEC()[ " + stProd.getCFICHATEC() + " ]");
                    }

                    prod.setBlobFichaTecnicaContentType(Constants.CONTENT_TYPE_PDF);

                    Boolean lAtivo  = StringUtils.truncate(stProd.getCB1ATIVO().trim(),1).equals(Constants.SIM) ? true : false; //c1
                    Boolean lEnvGts = StringUtils.truncate(stProd.getCB1ENVGTS().trim(),1).equals(Constants.ATIVO) ? true : false; //c1;

                    prod.setlAtivo(             (lAtivo && lEnvGts));

                    try{
                        prod.setCfRentabilidadeprod(new BigDecimal(stProd.getCB1COEFICI().trim()));
                    }catch (NullPointerException e) {
                        prod.setCfRentabilidadeprod(new BigDecimal(0.0));
                    }catch (NumberFormatException e) {
                        prod.setCfRentabilidadeprod(new BigDecimal(0.0));
                    }

                    prod.setDtSincronizacao(ZonedDateTime.now());
                    prod.setIdAutorCriacao(Constants.SERVER);

                    Produto prodSalvo = produtoRepo.save(prod);

                    if (prodSalvo != null){
                        //                  if (prodSalvo != null || !prod.islAtivo()){                     
                        PRODRETRESPONSE responseRet = produtoListaWs.setProdRetResponse(filial.getCdEmpresa(), filial.getCdFilial(), regNumErp);

                        if (responseRet != null){
                            if (responseRet.getPRODRETRESULT().getCRET().trim().equalsIgnoreCase(Constants.RET_SUCESSO)){
                                log.info("SEJ-MSG013: Produto Registro ["+regNumErp+"] integrado e notificado com successo!");
                            }else if (responseRet.getPRODRETRESULT().getCRET().trim().equalsIgnoreCase(Constants.RET_FALHA)) {
                                log.error("SEJ-MSG014: Produto Registro ["+regNumErp+"] integrado e notificado com falha!");
                            }else {
                                log.error("SEJ-MSG015: Produto Registro ["+regNumErp+"] integrado e notificado com falha no retorno!");
                                log.warn("SEJ-MSG016: msg["+responseRet.getPRODRETRESULT().getCMESSAGE()+"]");
                                log.warn("SEJ-MSG017: ret["+responseRet.getPRODRETRESULT().getCRET()+"]");
                            }
                        }else{
                            log.error("SEJ-MSG018: Sem retorno da notificação ao ERP!");
                        }                       
                    }else{
                        log.error("SEJ-MSG019: Falha ao integrar Produto registro ["+regNumErp+"]");
                    }

                }catch (Exception e) {
                    log.error("SEJ-ERR003: Erro no consumo de produtos", e);
                }
            }
        }catch (RuntimeException e) {
            log.error("SEJ-ERR004: Falha de comunicação no consumo de produtos", e);
        }
    }

    private void consomeCliente(EmpresaFilial filial, AnnotationConfigApplicationContext context) {

        try{
            ClienteWsClient clienteListaWs = context.getBean(ClienteWsClient.class);

            clienteListaWs.setUrl(url);
            clienteListaWs.setPort(port);
            clienteListaWs.setDefaultUri(url+":"+port+"/WSDLCLI.apw");

            CLIENTELSTRESPONSE responseList = clienteListaWs.getClientLstResponse(filial.getCdEmpresa(), filial.getCdFilial());
            List<STCLIENTE> wsClientes = responseList.getCLIENTELSTRESULT().getAREGS().getSTCLIENTE();
            for (STCLIENTE stCli : wsClientes){

                log.info("SEJ-MSG004: Cliente: CdCliente:["+stCli.getCA1COD() +"] "
                        + "CdLoja:["+stCli.getCA1LOJA()+"] "
                        + "Nome:["+stCli.getCA1NOME()+"]");
                try{
                    BigInteger regNumErp = stCli.getCA1RECNO();

                    Cliente cliente = null;
                    try{
                        cliente = clienteRepo.findOneByFilialIdAndCdClienteAndCdLoja(   filial.getId(), 
                                StringUtils.truncate(stCli.getCA1COD().trim(),6),
                                StringUtils.truncate(stCli.getCA1LOJA().trim(),4));
                    }catch (NullPointerException e) {}

                    if (cliente == null){
                        cliente = new Cliente();
                        cliente.setFilial(filial);
                        cliente.setCdEmpresa(           StringUtils.truncate(filial.getCdEmpresa().trim(),2)); //c2
                        cliente.setCdFilial(            StringUtils.truncate(filial.getCdFilial().trim(),2));//c2
                        cliente.setCdCliente(           StringUtils.truncate(stCli.getCA1COD().trim(),6));//c6
                        cliente.setCdLoja(              StringUtils.truncate(stCli.getCA1LOJA().trim(),4));//c4
                    }

                    cliente.setNmCliente(           StringUtils.truncate(stCli.getCA1NOME().trim(),60));//c60
                    cliente.setNmClienteReduc(      StringUtils.truncate(cliente.getNmCliente(),20));//c20
                    cliente.setDsEndereco(          StringUtils.truncate(stCli.getCA1END().trim(),80));//c80
                    cliente.setCdTipoCli(           StringUtils.truncate(stCli.getCA1TIPO().trim(),1));//c1
                    cliente.setCdGrptrib(           StringUtils.truncate(stCli.getCA1GRPTRIB().trim(),3));//c3
                    cliente.setSgUf(                StringUtils.truncate(stCli.getCA1EST().trim(),2));//c2
                    cliente.setNmCidade(            StringUtils.truncate(stCli.getCA1MUN().trim(),60));//c60
                    cliente.setNmBairro(            StringUtils.truncate(stCli.getCA1BAIRRO().trim(),30));//c30
                    cliente.setCdCep(               StringUtils.truncate(stCli.getCA1CEP().trim(),8));//c8
                    cliente.setNrDdd(               StringUtils.truncate(stCli.getCA1DDD().trim(),3));//c3
                    cliente.setNrTelefone(          StringUtils.truncate(stCli.getCA1TEL().trim(),15));//c15
                    cliente.setDsEmail(             StringUtils.truncate(stCli.getCA1EMAIL().trim(),120));//c120
                    cliente.setNrCnpjCpf(           StringUtils.truncate(stCli.getCA1CGC().trim(),14));//c14
                    cliente.setNmContato(           StringUtils.truncate(stCli.getCA1CONTATO().trim(),15));//c15
                    cliente.setNrInscr(             StringUtils.truncate(stCli.getCA1INSCR().trim(),18));//c18
                    cliente.setCdRegiao(            StringUtils.truncate(stCli.getCA1REGIAO().trim(),3));//c3
                    cliente.setCdSuframa(           StringUtils.truncate(stCli.getCA1SUFRAMA().trim(),12));//c12
                    cliente.setlContribIcms(        StringUtils.truncate(stCli.getCA1CONTRIB().trim(),1).equalsIgnoreCase("1") ? true: false);//c1
                    cliente.setIdSimplesNacional(   StringUtils.truncate(stCli.getCA1SIMPNAC(),1));//c1
                    cliente.setVlSaldoLimite(       new BigDecimal(stCli.getCLIMCRED()));//float17,2
                    cliente.setInadimplente(        StringUtils.truncate(stCli.getCSITCLI().trim(),1).equalsIgnoreCase(Constants.SIM) ? true: false);//c1
                    cliente.setDtSincronizacao(ZonedDateTime.now());
                    cliente.setIdAutorCriacao(Constants.SERVER);    

                    Boolean lLiberado   = StringUtils.truncate(stCli.getCATIVO().trim(),1).equals(Constants.SIM) ? true : false; //c1

                    cliente.setlLiberado(               lLiberado);

                    Cliente clienteSalvo = clienteRepo.save(cliente);

                    if (clienteSalvo != null){                      
                        CLIRETRESPONSE responseRet = clienteListaWs.setClientRetResponse(filial.getCdEmpresa(), filial.getCdFilial(), regNumErp);

                        if (responseRet != null){
                            if (responseRet.getCLIRETRESULT().getCRET().trim().equalsIgnoreCase(Constants.RET_SUCESSO)){
                                log.info("SEJ-MSG005: Cliente Registro ["+regNumErp+"] integrado e notificado com successo!");
                            }else if (responseRet.getCLIRETRESULT().getCRET().trim().equalsIgnoreCase(Constants.RET_FALHA)) {
                                log.error("SEJ-MSG006: Cliente Registro ["+regNumErp+"] integrado e notificado com falha!");
                            }else {
                                log.error("SEJ-MSG007: Cliente Registro ["+regNumErp+"] integrado e notificado com falha no retorno!");
                                log.warn("SEJ-MSG008: msg["+responseRet.getCLIRETRESULT().getCMESSAGE()+"]");
                                log.warn("SEJ-MSG009: ret["+responseRet.getCLIRETRESULT().getCRET()+"]");
                            }
                        }else{
                            log.error("SEJ-MSG010: Sem retorno da notificação ao ERP!");
                        }                       
                    }else{
                        log.error("SEJ-MSG011: Falha ao integrar Cliente registro ["+regNumErp+"]");
                    }

                }catch (Exception e) {
                    log.error("SEJ-ERR001: Erro no consumo de clientes", e);
                }

            }
        }catch (RuntimeException e) {
            log.error("SEJ-ERR002: Falha de comunicação no consumo de clientes", e);
        }
    }
}

2 answers

0

Check the operating system/container/application server you are using. If, for example, you are using a free Heroku account, this behavior is acceptable. Heroku puts your machine to sleep after a while.

  • I found out. The cause of the problem is not my application, but the Soap server. When I make the response Clienthttp connection, the Soap server makes an internal select and hangs, so it never closes the http connection my Clienthttp is waiting endlessly. Timeout works correctly, but readTimeOut is infinite. Now I need to know how to set this using spring-Ws and setting the property via application.yml file.

0


Is there an Exception? Or simply Scheduler does not start new threads?

I suggest connecting the Jvisualvm the moment the application is locked to inspect the threads on the fly.

I suggest this material for details on how to use the tool.

  • I found out. The cause of the problem is not my application, but the Soap server. When I make the response Clienthttp connection, the Soap server makes an internal select and hangs, so it never closes the http connection my Clienthttp is waiting endlessly. Timeout works correctly, but readTimeOut is infinite. Now I need to know how to set this using spring-Ws and setting the property via application.yml file.

Browser other questions tagged

You are not signed in. Login or sign up in order to post.