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

1

I have a project done with JHipster. It uses spring-boot. I use this application as an ordering platform where I use several webservices from an ERP and also synchronize 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") to run as a job every 90 seconds. It consumes 11 webservices. The problem is that this Job stops running at about every 12 hours.

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

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

Does anyone have an 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);
        }
    }
}
    
asked by anonymous 02.02.2017 / 19:06

2 answers

0

Does an exception occur? Or simply the scheduler does not start new threads?

I suggest connecting JVisualVM at the time the application is locked to inspect the on the fly threads.

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

    
13.02.2017 / 13:40
0

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

    
03.03.2017 / 04:10