Bom dia pessoal.
Tenho uma integração funcionando entre o Fluig e o RM. Basicamente, ao encerrar um fluxo BPM no Fluig, é gravado uma autorização de hora extra no RM.
O problema é que nem todas estão sendo gravadas. Acredito que devido a indisponibilidade, ou lentidão, do host ou tbc. Só que mesmo isso acontecendo, o processo é finalizado, o que gera uma confusão com o usuário (processo finalizado como aprovado, mas informação não gravada no RM).
A integração está acontecendo no evento de afterTaskComplete.
Como vocês checam se a gravação aconteceu realmente? O correto é realizar uma leitura após a gravação? Ou há como pegar o erro na gravação e parar o processo?
Obrigado!
Olá Marcus. Acredito que o RM deve retornar algum erro quando a gravação não ocorre, você pode verificar no seu log ou fazendo um try/catch no seu script. No caso de ter um erro retornado, o problema é que o evento afterTaskComplete não interrompe o processo em casos de erro. Uma opção seria utilizar o evento beforeStateEntry na sua atividade final, pois esse evento interrompe a execução caso seja lançado algum throw com erro
Obrigado pela resposta Diogo. Foi difícil achar o retorno, no final, depois de muita analise do log, vi que o retorno acontecia em dataset.values[0][1] . Sua resposta me deu algumas pistas, e no final acabei usando o evento beforeTaskSave, no caso, se 3 tentativas fossem realizadas e o retorno do dataset não fosse ‘true’ (string mesmo), ai era lançado um throw.
Marcus, os eventos "after" são executados após efetivação dos dados no fluig. Mesmo que seu código hoje já esteja tratando alguma exceção essa não será capturada e elevada gerando validação.
Minha sugestão é, sempre quando precisar executar uma integração de escrita sempre o faça numa atividade de serviço automatizada com captura de erro. Se ocorrer falha, tu pode lançar a exceção que será direcionada a uma atividade para tratar a falha e/ou pode definir X tentativas o que reduziria problemas de timeout ou sistema fora.
Caso não queria modificar dessa forma, ao menos mude sua integração para o beforeStateEntry, conforme sugestão do @Diogo, isso permite que a validação ocorra, nesse caso seu throw será lançado ao usuário como mensagem de validação impedindo o processo de prosseguir.
Obrigado pela resposta Rafael. Com ajuda do comentário do Diogo, acima, eu consegui fazer usando o beforeTaskSave. Lá eu tento gravar 3 vezes, e caso retorne erro, lanço um throw. Mas sua ideia utilizando a atividade serviço é muito boa… vi que posso até determinar o intervalo das tentativas. Pretendo realizar alguns testes, mas você saberia me dizer como é o retorno se, no Aproval, ocorrer um erro na gravação? Digo, se eu colocar o intervalo em 3min, será que ele fica com aquela barra de progressão parada durante este tempo, ou ele retorna o erro caso a primeira tentativa de errado?
No caso usando a atividade de serviço, ela é executada de forma assíncrona, ou seja, o usuário completou a pendência ela sai da caixa dele e o sistema que se responsabiliza por executar a atividade de serviço em segundo plano, conforme intervalo definido.
Marcus, se a resposta te ajudou com o problema, não esqueça de marcá-la.