Pergunta
· Dez. 11, 2023

ERROR #5034: Invalid status code structure e ERROR #5803: Failed to acquire exclusive lock on instance

Olá a todos, estou tendo um problema, já vi algumas respostas e sugestões, porém nenhuma com sucesso (para o meu problema), bom o retorno que tenho é o seguinte: 

{ "errors":[ { "code":5034, "domain":"%ObjectErrors", "error":"ERROR #5034: Invalid status code structure (\"ERROR #5803: Failed to acquire exclusive lock on instance of 'Onboarding.Modelo.BotCemig'\")", "id":"InvalidStatusCodeStruct", "params":["\"ERROR #5803: Failed to acquire exclusive lock on instance of 'Onboarding.Modelo.BotCemig'\"" ] } ], "summary":"ERROR #5034: Invalid status code structure (\"ERROR #5803: Failed to acquire exclusive lock on instance of 'Onboarding.Modelo.BotCemig'\")" }

Uma explicação rápida do que tenho, eu recebo um arquivo JSON e minha classe salva ele em um banco de dados, é em uma rotina com varias vezes o mesmo processo, porém alguns arquivos funcionam outros não.

Product version: IRIS 2021.1
Discussão (4)1
Entre ou crie uma conta para continuar

O Json é bem extenso, mais de 5 milhões de caracteres, vou colocar aqui em baixo a classe,

 

ClassMethod InserirFatura(pInput As %Library.AbstractStream, Output pOutput As %Stream.Object) As %Status

{

    Set tSC = $System.Status.OK()

    Set %response.ContentType="application/json"

    Try {

  

        Set tObjBody = {}.%FromJSON(%request.Content)

        If $IsObject(tObjBody) {

            Set tArrayFatura = tObjBody.fatura

            Set iterArrayFatura = tArrayFatura.%GetIterator()

            Set tContNovo = 0

            Set tContAlte = 0

            Set tContDupli = 0

           

            TSTART

       

            While iterArrayFatura.%GetNext(.key, .tObjFatura) {

                Set:(tObjFatura.modalidade = "ger. compartilhada-geradora") tUG = $ZCONVERT(tObjFatura.instalacao, "I")

                Set tFatura = ##Class(Onboarding.Modelo.BotCemig).%New()

                If tObjFatura."per_prox_saldo_exp" '= ""{

               

                    Set tMesProx = $PIECE(tObjFatura."per_prox_saldo_exp","/",2)

                    Set tAnoProx = $PIECE(tObjFatura."per_prox_saldo_exp","/",1)

                    Set tDataProx = "01/"_tMesProx_"/"_tAnoProx

                    Set tFatura."per_prox_saldo_exp" = $ZDATEH(tDataProx)

                }

           

                Set tMesPer = $PIECE(tObjFatura.periodo,"/",2)

                Set tAnoPer = $PIECE(tObjFatura.periodo,"/",1)

                Set tDataPer = "01/"_tMesPer_"/"_tAnoPer

                Set tFatura.periodo = $ZDATEH(tDataPer)

                Set tNumSemPorc = $PIECE(tObjFatura.quota,"%",1)

                Set tNumSemVirg = $REPLACE(tNumSemPorc,",",".")    

                Set tFatura.quota = tNumSemVirg

           

                Set tFatura."unidade_geradora" = tUG

                Set tFatura."posto_horario" = tObjFatura."posto_horario"

                Set tFatura."qtd_compensacao" = tObjFatura."qtd_compensacao"

                Set tFatura."qtd_consumo" = tObjFatura."qtd_consumo"

                Set tFatura."qtd_geracao" = tObjFatura."qtd_geracao"

                Set tFatura."qtd_geracao" = tObjFatura."qtd_geracao"

                Set tFatura."qtd_prox_saldo_exp" = tObjFatura."qtd_prox_saldo_exp"

                Set tFatura."qtd_recebimento" = tObjFatura."qtd_recebimento"

                Set tFatura."qtd_saldo_ant" = tObjFatura."qtd_saldo_ant"

                Set tFatura."qtd_saldo_atual" = tObjFatura."qtd_saldo_atual"

                Set tFatura."qtd_saldo_exp" = tObjFatura."qtd_saldo_exp"

                Set tFatura."qtd_transferencia" = tObjFatura."qtd_transferencia"

                Set tFatura.instalacao = $ZCONVERT(tObjFatura.instalacao, "I")

                Set tFatura.modalidade = tObjFatura.modalidade

                Set tRS = ##Class(Onboarding.Repositorio.ConsultaSQL).ConsultaFatura(tFatura.instalacao, tFatura.periodo, tFatura."posto_horario", .tSC)

                If $$$ISERR(tSC) {

                    Throw tSC

                }

                If tRS.%Next() = 0 {

                    Set tFatura."data_criacao" = $PIECE($HOROLOG,",",1)

                    Set tFatura.duplicidade = 1

                    Set tSC = tFatura.%Save()

                    If $$$ISERR(tSC) {

                        Throw tSC

                    }

                    Set tContNovo = tContNovo+1

                }Else{

           

                    Set tFaturaExi = ##Class(Onboarding.Modelo.BotCemig).%OpenId(tRS.ID, .tSC)

               

                    If $$$ISERR(tSC) {

                        Throw tSC

                    }

   

                    If ((tFaturaExi."data_alteracao" = $PIECE($HOROLOG,",",1)) || (tFaturaExi."data_criacao" = $PIECE($HOROLOG,",",1))) {

                        Set tFatura.duplicidade = 1

                        Set tFaturaExi.duplicidade = 2

                        Set tFaturaExi."data_alteracao" = $PIECE($HOROLOG,",",1)

                        Set tFatura."data_criacao" = $PIECE($HOROLOG,",",1)

                        Set tSC = tFatura.%Save()

                        Set tSC = tFaturaExi.%Save()

                        If $$$ISERR(tSC) {

                            Throw tSC

                        }

                        Set tContDupli = tContDupli+1

                    }Else {

                    Set tFaturaExi.modalidade = tFatura.modalidade

                    Set tFaturaExi."per_prox_saldo_exp" = tFatura."per_prox_saldo_exp"

                    Set tFaturaExi."qtd_compensacao" = tFatura."qtd_compensacao"

                    Set tFaturaExi."qtd_consumo" = tFatura."qtd_consumo"

                    Set tFaturaExi."qtd_geracao" = tFatura."qtd_geracao"

                    Set tFaturaExi."qtd_prox_saldo_exp" = tFatura."qtd_prox_saldo_exp"

                    Set tFaturaExi."qtd_recebimento" = tFatura."qtd_recebimento"

                    Set tFaturaExi."qtd_saldo_ant" = tFatura."qtd_saldo_ant"

                    Set tFaturaExi."qtd_saldo_atual" = tFatura."qtd_saldo_atual"

                    Set tFaturaExi."qtd_saldo_exp" = tFatura."qtd_saldo_exp"

                    Set tFaturaExi."qtd_transferencia" = tFatura."qtd_transferencia"

                    Set tFaturaExi.quota = tFatura.quota

                    Set tFaturaExi.duplicidade = 1

     

                    Set tFaturaExi."data_alteracao" = $PIECE($HOROLOG,",",1)

               

                    Set tSC = tFaturaExi.%Save()

                    If $$$ISERR(tSC) {

                        Throw tSC

                    }

                    Set tContAlte = tContAlte+1

                                           

                    }

               

                }

               

           

            }

            TCOMMIT

            Write {"retorno":"OK","tContNovo":(tContNovo),"tContAlte":(tContAlte),"tContDupli":(tContDupli)}.%ToJSON()

        } Else {

            Throw ##class(%Exception.General).%New("Entrada JSON inválida")

        }

    }Catch tException {

        TROLLBACK

        Do ..ReportHttpStatusCode(..#HTTP500INTERNALSERVERERROR)

        Set:'$$$ISERR(tSC) tSC = tException.AsStatus()

        Set tSC = $System.Status.GetErrorText(tSC)

       

    }

    Quit tSC

}

Algumas perguntas:
 - Você salva todos os jsons recebidos, para posteriomente poder reutilizar o que eu deu erro? Pelo menos durante essa análise?
 - Se salva, durante o reenvio de um mesmo json, que anteriormente deu erro ele é processado numa segunda tentativa?

Uma coisa que já observei no seu código é que esta linha: Set tFaturaExi = ##Class(Onboarding.Modelo.BotCemig).%OpenId(tRS.ID, .tSC)

o status de sucesso ou erro volta no terceiro parâmetro e não no segundo, então precisa corrigir: Set tFaturaExi = ##Class(Onboarding.Modelo.BotCemig).%OpenId(tRS.ID, ,.tSC)

No segundo parâmetro é passado a concorrência do objeto.

https://docs.intersystems.com/iris20211/csp/documatic/%25CSP.Documatic.c...

1 - Sim, salvo todos os JSONs.

2 - Faço o reenvio somente dos que dão erro.

3 -  Não tinha reparado nesse ponto de retorno.

-- Já consegui resolver o problema, praticamente refiz toda a lógica de envio do Json, em vez de enviar ele inteiro, quebrei em 300 objetos por vez, tem muito mais envios, porém não quebrou. 

Desculpa a demora para responder, e muito obrigado pela atenção.