Skip to main content
Uma execução de função de lógica é limitada pelo seu timeoutSeconds (máximo de 900 segundos). Qualquer coisa que não consiga terminar nesse intervalo — uma re-sincronização completa, uma distribuição por registro, uma API de terceiros que impõe limitações de taxa — precisa ser dividida em execuções menores. enqueueJob faz exatamente isso: solicita aos workers do Twenty que executem mais tarde uma das funções de lógica do seu aplicativo, em seu próprio processo, com seu próprio tempo limite. O chamador retorna imediatamente.

Colocar uma execução na fila

Importe enqueueJob de twenty-sdk/logic-function e aponte-o para o universalIdentifier da função de lógica que você quer executar.
src/logic-functions/sync-all-contacts.ts
A função de destino recebe payload como argumento do handler, exatamente como qualquer outro gatilho. Ela deve pertencer à mesma aplicação que quem a chama — colocar na fila a função de outra aplicação é rejeitado com Logic function not found.
enqueueJob retorna assim que o job é aceito, não quando ele é executado. Ele não retorna o resultado do destino — faça o destino gravar o que produzir no repositório de chave-valor ou em um registro do workspace se você precisar ler isso de volta.

Opções do job

A prioridade ainda não é configurável. Jobs em fila sempre são executados na prioridade mais baixa, então o trabalho da plataforma nunca é atrasado por jobs da aplicação. O controle sobre prioridade estará disponível em breve.
A execução em fila herda o usuário ativo da função que a colocou na fila, portanto age com as mesmas permissões.

Use assim: pagine uma sincronização longa

O formato clássico é uma função que coloca a si mesma na fila com o próximo cursor. Cada execução faz uma página de trabalho bem dentro do seu próprio tempo limite, e a cadeia para quando não resta nada.
src/logic-functions/sync-contacts-page.ts

Ramificar por registro

Quando o trabalho é naturalmente por item, coloque um job por item na fila e deixe os workers processarem em paralelo em vez de fazer o loop inline.

Boas práticas para trabalho de longa duração

Duas regras cobrem quase todo job longo: faça recursão em vez de loop e processe um fragmento limitado por execução. Uma execução que tenta fazer tudo é o modo de falha — ela atinge o tempo limite e, com uma nova tentativa, começa tudo de novo do zero. Em vez disso, defina o tamanho de um fragmento para que ele termine confortavelmente dentro de timeoutSeconds, persista sua posição e coloque a próxima execução na fila.
src/logic-functions/enrich-companies-batch.ts
O que torna isso robusto:
  • Defina o tamanho do fragmento a partir do item mais lento, não da média. CHUNK_SIZE × tempo do item em pior caso precisa caber em timeoutSeconds com alguma folga, ou o final de um fragmento é perdido quando a execução é interrompida.
  • Deixe a condição de parada explícita. Faça recursão apenas enquanto um fragmento completo for retornado. Uma cadeia que para apenas em “sem resultados” continuará para sempre se a origem algum dia retornar uma página curta no meio do caminho.
  • Persista o progresso antes de colocar a próxima execução na fila, assim um elo com falha reinicia a partir do último fragmento concluído em vez do começo.
  • Mantenha cada fragmento idempotente. Reprocessar um fragmento após uma nova tentativa não deve gerar escrita em dobro — faça as gravações com base no registro ou id externo que você está processando.
  • Prefira uma cadeia fragmentada em vez de uma grande ramificação quando o trabalho aciona um serviço de terceiros com limitação de taxa: uma cadeia com delayMs se regula sozinha, enquanto milhares de jobs colocados na fila de uma vez se tornam elegíveis imediatamente.
Novas tentativas executam novamente o handler inteiro. Mantenha os handlers em fila idempotentes antes de definir retryLimit acima de 0.