Ir para o conteúdo

Datapool

Utilizando Datapools você conseguirá gerenciar de forma eficiente o processamento de itens em lote.

O Datapool pode ser considerado como um gerenciador de filas, que nos permite ter controle e granularidade sobre os itens que precisam ser processados.

Nas seções a seguir, você encontrará detalhes sobre o funcionamento dos Datapools e como utilizar essa funcionalidade nos seus processos de automação.

Datapools list

Criando um Datapool

Para criar um novo Datapool basta clicar em + Novo Datapool e preencher os seguintes campos:

Datapool new

  • Label: O identificador único que será utilizado para acessar o Datapool.
  • Ativo: Se ATIVO, o Datapool estará disponível para ser acessado e consumido.
  • Política de consumo: Você pode escolher entre duas políticas de consumo:
    • FIFO: O primeiro item a ser adicionado ao Datapool também será o primeiro item a ser processado.
    • LIFO: O último item a ser adicionado ao Datapool será o primeiro item a ser processado.
  • Tentar automaticamente: Se habilitado, permite que um item seja reprocessado automaticamente em caso de erro.
    • Tentativas máximas: O número máximo de tentativas para que um item seja processado com sucesso.
  • Abortar em caso de erro: Se habilitado, faz com o que o Datapool fique inativo e não seja mais consumido em caso de erros consecutivos.
    • Máximo de erros antes de ficar inativo: Quantidade máxima de itens processados com erro de forma consecutiva que serão tolerados até que o Datapool fique INATIVO.
  • Tempo máximo de processamento por item (em minutos): Tempo esperado para que um item do Datapool seja processado em condições normais.
  • Gatilho: Você pode definir se o Datapool criado também vai ser responsável por disparar novas tarefas:
    • SEMPRE: Sempre que um novo item for adicionado ao Datapool, uma nova tarefa de um determinado processo de automação será criada.
    • NUNCA: O Datapool nunca será responsável por disparar tarefas de um processo de automação.
    • NENHUMA TAREFA ATIVA: Sempre que um novo item for adicionado, o Datapool irá disparar uma nova tarefa de um processo de automação somente se não existirem tarefas desse processo sendo executadas ou pendentes.
  • Automação padrão: O processo de automação que será utilizado pelo Datapool para disparar novas tarefas, se algum gatilho estiver sendo utilizado.
  • Schema: Os campos que irão compor a estrutura de um item do Datapool. Você pode adicionar novos campos ao esquema clicando em + Add e definindo um label e o tipo de dado esperado.

Adicionando novos itens ao Datapool

Podemos adicionar novos itens ao Datapool de duas maneiras diferentes.

Datapool view

Adicionando cada item manualmente

Clicando em + Adicionar entrada vamos poder adicionar um novo item ao Datapool. Podemos preencher qual será a prioridade desse item em específico e também os valores que esse item recebe.

Além de preencher os valores que foram definidos ao criarmos o Schema, também podemos adicionar novos campos contendo dados adicionais que fazem parte desse item.

Clicando em + Adicionar dentro da janela de preenchimento do item, você conseguirá incluir quantos campos adicionais forem necessários para aquele item em específico.

Datapool add item

Adicionando itens através de um arquivo CSV

Além de adicionar itens manualmente, também podemos incluir vários itens de uma só vez através de um arquivo .csv.

Ao selecionar a opção Importar CSV, podemos baixar um arquivo de exemplo e preencher com as informações dos itens que serão adicionados ao Datapool.

Feito isso, basta subir o arquivo e clicar em Upload para que os itens sejam carregados automaticamente.

Datapool import csv

Gerenciando os itens do Datapool

Para cada item adicionado ao Datapool, podemos visualizar as seguintes informações:

Datapool items list

  • Id: O identificador único do item.
  • Prioriade: Prioridade definida para o item.
  • State: O estado atual do item no Datapool.
  • Criado em: A data em que o item foi adicionado ao Datapool.
  • Tempo de processamento: Tempo gasto no processamento do item.
  • Ciclo de vida: O tempo que foi levado desde a criação do item no Datapool até a finalização do processamento.

Ao expandir os detalhes de um item clicando em +, podemos visualizar as seguintes informações adicionais:

Datapool item details

  • Task Id: O identificador da tarefa responsável por acessar e consumir aquele item do Datapool.
  • Usuário: O usuário responsável por adicionar o item ao Datapool.
  • Data de criação: A data em que o item foi adicionado ao Datapool.
  • Data do processamento: A data em que o item foi puxado para ser processado.
  • Data de finalização: A data em que o processamento do item foi concluído.
  • Pai: O item pai que originou esse item filho. (Essa informação irá ser exibida nos casos onde é feito o retry de um item ou ao reiniciar o processamento de um item).
  • Filho: O item filho que foi originado por esse item. (Essa informação irá ser exibida nos casos onde é feito o retry de um item ou ao reiniciar o processamento de um item).
  • Prioridade: A prioridade definida para o item.
  • Values: Os conjuntos de chave/valor que compõem o item do Datapool. Você conseguirá visualizar os campos padrões que foram definidos através do Schema do Datapool e também adicionar novos campos clicando em + Adicionar.

Além de visualizar as informações de cada item, podemos realizar algumas operações ao acessar o menu do item. Você pode Reiniciar um item que já foi processado e também Deletar um item que ainda está pendente.

Importante

Ao reiniciar ou realizar um reprocessamento automático, um novo item será criado no Datapool.

Essas operações nunca serão feitas em cima de um mesmo item, ao invés disso será criada uma "cópia" desse item no Datapool que irá referenciar o item original (propriedade Pai mencionada anteriormente).

Visualizando os estados de processamento dos itens

Ao adicionar um novo item ao Datapool, ele inicialmente ficará com o estado PENDENTE. Podemos entender os estados que um item pode assumir durante o seu ciclo de vida da seguinte maneira:

PENDENTE: O item está aguardando o processamento, nesse ponto ele estará disponível para ser acessado e consumido.

PROCESSANDO: O item foi puxado para execução e está na fase de processamento.

CONCLUÍDO: O processamento do item foi concluído com sucesso.

ERRO: O processamento do item foi concluído com erro.

TIMEOUT: O processamento do item está em uma fase de timeout (isso pode ocorrer quando o estado de finalização do item não é reportado via código).

Reportando o estado de um item

Aviso

Para que os estados sejam atualizados no Datapool, é necessário que o estado de processamento de cada item (CONCLUÍDO ou ERRO) seja reportado via código.

Caso o estado de processamento do item não seja reportado via código do robô, isso será considerado automaticamente pelo Datapool como um estado de TIMEOUT daquele item.

Nas seções seguintes vamos entender melhor como o estado de um item pode ser reportado via código.

Entendendo o estado de TIMEOUT

O estado de TIMEOUT é baseado no tempo que foi definido na propriedade Tempo máximo de processamento por item (em minutos) ao criar o Datapool.

Caso o processamento de um item exceda o tempo máximo definido, seja por falta do reporte indicando o estado do item ou algum travamento na execução do processo que impeça que o reporte seja feito, automaticamente o Datapool irá indicar que aquele item entrou em um estado de TIMEOUT.

Isso não significa necessariamente um erro, pois um item ainda pode sair do estado de TIMEOUT para um estado de CONCLUÍDO ou ERRO.

Porém, caso o processo não se recupere (em caso de eventuais travamentos) e o reporte do estado do item não seja feito, o Datapool automaticamente vai considerar o status daquele item como ERRO após um período de 24 horas.

Como usar Datapools com o Maestro SDK

Você pode facilmente consumir e reportar o estado dos itens de um Datapool usando o Maestro SDK no código da sua automação.

Instalação do SDK

Caso você ainda não tenha a dependência instalada, basta seguir essas instruções:

pip install botcity-maestro-sdk

Importante

Além de instalar, lembre-se de incluir a dependência no arquivo requirements.txt do bot.

Importando o SDK

Após a instalação, basta importar a dependência e instanciar o Maestro SDK:

# Importando a dependência do Maestro SDK
from botcity.maestro import *

# Desabilitando erros caso não exista conexão com o Maestro
BotMaestroSDK.RAISE_NOT_CONNECTED = False

# Instanciando o Maestro SDK
maestro = BotMaestroSDK.from_sys_args()
# Buscando os detalhes da tarefa atual sendo executada
execution = maestro.get_execution()

Processando os itens do Datapool

# Consumindo o próximo item disponível e reportando o estado de finalização ao final
datapool = maestro.get_datapool(label="Items-To-Process")

while datapool.has_next():
    # Busca o próximo item do Datapool
    item = datapool.next(task_id=execution.task_id)
    if item is None:
        # O item poderia ser 'None', caso outro processo o consumisse antes
        break

    # Processando item...

    item.report_done()

Dica

Para obter o valor de algum campo específico que foi definido no Schema do item, você pode utilizar o método get_value() ou simplesmente passar o label do campo entre [], utilizando a referência do item.

item = datapool.next(task_id=execution.task_id)

dado = item.get_value("label-campo")
# ou
dado = item["label-campo"]

Código completo

from botcity.core import DesktopBot
from botcity.maestro import *

# Desabilitando erros caso não exista conexão com o Maestro
BotMaestroSDK.RAISE_NOT_CONNECTED = False

def main():
    maestro = BotMaestroSDK.from_sys_args()
    execution = maestro.get_execution()

    bot = DesktopBot()
    # Implemente aqui a sua lógica...

    # Obtendo a referência do Datapool
    datapool = maestro.get_datapool(label="Items-To-Process")

    while datapool.has_next():
        # Busca o próximo item do Datapool
        item = datapool.next(task_id=execution.task_id)

        if item is None:
            # O item poderia ser 'None', caso outro processo o consumisse antes
            break

        # Obtendo o valor de algum campo específico do item
        item_data = item["data-label"]

        try:
            # Processando o item...

            # Finalizando como 'CONCLUÍDO' após o processamento
            item.report_done()

        except Exception:
            # Finalizando o processamento do item como 'ERRO'
            item.report_error()

def not_found(label):
    print(f"Element not found: {label}")

if __name__ == '__main__':
    main()

Dica

Consulte as outras operações que podemos fazer com o Datapool utilizando o BotCity Maestro SDK e BotCity Maestro API.