oracle AQ para trabalhos agendados

0

Temos um processo que atualmente usa o Oracle DBMS_SCHEDULER para executar. O processo é executado toda vez que o backend recebe dados de um dispositivo externo. O agendador do Oracle é configurado de tal forma que um trabalho é criado na recepção de dados externos, o trabalho é executado imediatamente e o trabalho é destruído automaticamente quando concluído.

O problema aqui é que vários dispositivos podem enviar dados ao mesmo tempo. Como o processo envolve a obtenção de bloqueios exclusivos em diferentes pontos durante a execução, ocasionalmente, um trabalho irá pisar em outro que já está em execução (ele é rejeitado com o ORA-20000).

Eu gostaria de usar o mecanismo do Oracle AQ (advanced queueing) para resolver esse problema. Eu imagino uma fila de trabalhos que são executados FIFO. Mesmo que o dispositivo externo B envie dados enquanto o processo está atualmente processando dados do dispositivo externo A, a fila impede o processamento de dados do dispositivo B até que o processamento para o dispositivo A esteja completo.

Não parece haver uma seção específica sobre esse tipo de processamento de AQ na documentação do Oracle, mas parece que seria um cenário bem comum. Alguém já resolveu esse tipo de problema com o Oracle AQ?

    
por mlehmeher 15.06.2015 / 16:53

1 resposta

0

Você pode implementá-lo da seguinte maneira: O programa de job do planejador é implementado como loop infinito - sem falha. Esse loop retira mensagens do AQ e as processa. O trabalho do agendador é submetido apenas uma vez - do sistema de eventos até mesmo aciona AFTER STARTUP ON DATABASE .

Ele não usa nenhuma cadeia do agendador nem nenhuma outra opção avançada do agendador. Simplesmente o trabalho do agendador é disparado pelo gatilho quando o banco de dados é exibido, o trabalho "nunca termina" .

Mas acho que o dbms_scheduler é muito poderoso hoje em dia e existem maneiras de limitar execuções paralelas para um cronograma.

PS: ORA-20000 é um código de erro definido pelo usuário. O banco de dados nunca retorna esse erro por conta própria.

    
por 15.06.2015 / 17:13