Gatilhos programados
Nesta página
Os Trigger programados permitem executar a lógica do lado do servidor em uma programação regular definida por você. Você pode usar triggers programados para realizar trabalho que ocorre de modo periódico, como atualizar um documento a cada minuto, gerando um relatório por noite, enviando uma newsletter semanal por e-mail.
Criar um gatilho programado
Para criar um trigger agendado na IU do Atlas App Services:
Clique em Triggers em Build no menu de navegação esquerdo.
Clique em Create a Trigger para abrir a página de configuração do trigger.
Selecione Scheduled para o Trigger Type.
Para criar um trigger agendado com o App Services CLI:
Adicione um arquivo de configuração trigger agendado ao subdiretório
triggers
de um diretório de aplicativo local.Observação
Você não pode criar um Trigger que seja executado em um agendamento Basic usando a CLI do App Services. Todas as configurações de Triggers agendados importados devem especificar uma expressão CRON.
Os arquivos de configuração do trigger agendado têm o seguinte formato:
/triggers/<triggers name>.json{ "type": "SCHEDULED", "name": "<Trigger Name>", "function_name": "<Trigger Function Name>", "config": { "schedule": "<CRON expression>" }, "disabled": <boolean> } Implante o trigger:
appservices push
Configuração
Os Triggers Agendados têm as seguintes opções de configuração:
Campo | Descrição |
---|---|
Trigger Type type: <string> | Selecione Scheduled. |
Schedule Type config.schedule: <string> | Obrigatório. Você pode selecionar Basic ou Advanced. Uma agenda Básica executa o Trigger periodicamente com base no intervalo definido, como "a cada cinco minutos" ou "toda segunda-feira". Uma programação avançada executa o acionador com base na expressão CRON personalizada que você define. |
Skip Events on Re-Enable skip_catchup_event: <boolean> | Desabilitado por padrão. Se habilitado, quaisquer eventos de alteração ocorridos enquanto esse trigger esteve desabilitado não serão processados. |
Event Type function_name: <string> | Na seção Event Type, você escolhe qual ação será executada quando o trigger for acionado. Você pode optar por executar uma função ou usar o AWS EventBridge. ObservaçãoUm Trigger Agendado não passa nenhum argumento para sua Função vinculada. |
Trigger Name name: <string> | O nome do trigger. |
Expressões de CRON
As expressões CRON são cadeias de caracteres definidas pelo usuário que usam a sintaxe de tarefa padrão do cron para definir quando um trigger agendado deve ser executado. o App Services executa expressões Trigger CRON com base na horaUTC . Sempre que todos os campos em uma expressão CRON coincidem com a data e a hora atuais, o App Services aciona o trigger associado à expressão.
Sintaxe de Expressão
Formatar
Expressões CRON são strings compostas de cinco campos delimitados por espaço. Cada campo define uma parte granular da agenda na qual seu trigger associado é executado:
* * * * * │ │ │ │ └── weekday...........[0 (SUN) - 6 (SAT)] │ │ │ └──── month.............[1 (JAN) - 12 (DEC)] │ │ └────── dayOfMonth........[1 - 31] │ └──────── hour..............[0 - 23] └────────── minute............[0 - 59]
Campo | Valid Values | Descrição |
---|---|---|
minute | [0 - 59] | Representa um ou mais minutos em uma hora. ExemploSe o campo |
hour | [0 - 23] | Representa uma ou mais horas dentro de um dia em um relógio de 24 horas. ExemploSe o campo |
dayOfMonth | [1 - 31] | Representa um ou mais dias em um mês. ExemploSe o campo |
month | 1 (JAN) 7 (JUL) 2 (FEB) 8 (AUG) 3 (MAR) 9 (SEP) 4 (APR) 10 (OCT) 5 (MAY) 11 (NOV) 6 (JUN) 12 (DEC) | Representa um ou mais meses dentro de um ano. Um mês pode ser representado por um número (por exemplo, ExemploSe o campo |
weekday | 0 (SUN) 1 (MON) 2 (TUE) 3 (WED) 4 (THU) 5 (FRI) 6 (SAT) | Representa um ou mais dias em uma semana. Um dia da semana pode ser representado por um número (por exemplo, ExemploSe o campo |
Valores do Campo
Cada campo em uma expressão CRON pode conter um valor específico ou uma expressão que avalia para um conjunto de valores. A tabela a seguir descreve valores e expressões de campos válidos:
Tipo de Expressão | Descrição | |
---|---|---|
All Values (*) | Corresponde a todos os valores de campo possíveis. Disponível em todos os campos de expressão. ExemploA expressão CRON a seguir programa um trigger para ser executado uma vez a cada minuto todos os dias:
| |
Specific Value (<Value>) | Corresponde a um valor de campo específico. Para campos diferentes de Disponível em todos os campos de expressão. ExemploA seguinte expressão CRON agenda um trigger para ser executado uma vez por dia às 11h UTC:
| |
List of Values (<Expression1>,<Expression2>,...) | Corresponde a uma lista de duas ou mais expressões de campo ou valores específicos. Disponível em todos os campos de expressão. ExemploA expressão CRON seguinte agenda um trigger para ser executado uma vez por dia em janeiro, março e julho às 11h UTC:
| |
Range of Values (<Start Value>-<End Value>) | Corresponde a uma faixa contínua de valores entre campos, incluindo dois valores de campo específicos. Disponível em todos os campos de expressão. ExemploA expressão CRON a seguir programa um gatilho para ser executado uma vez por dia, de 1º de janeiro até o final de abril, às 11:00 AM UTC:
| |
Modular Time Step (<Field Expression>/<Step Value>) | Corresponde a qualquer momento em que o valor da etapa divide uniformemente o valor do campo sem nenhum restante (ou seja, quando Disponível nos campos de expressão ExemploA expressão CRON a seguir programa um gatilho para ser executado nos 0º, 25º e 50º minutos de cada hora:
|
Exemplo
Uma loja online deseja gerar um relatório diário de todas as vendas do dia anterior. Ela registra todas as ordens na collection store.orders
como documentos que se assemelham ao seguinte:
{ _id: ObjectId("59cf1860a95168b8f685e378"), customerId: ObjectId("59cf17e1a95168b8f685e377"), orderDate: ISODate("2018-06-26T16:20:42.313Z"), shipDate: ISODate("2018-06-27T08:20:23.311Z"), orderContents: [ { qty: 1, name: "Earl Grey Tea Bags - 100ct", price: Decimal128("10.99") } ], shippingLocation: [ { location: "Memphis", time: ISODate("2018-06-27T18:22:33.243Z") }, ] }
Para gerar o relatório diário, a loja cria um Trigger agendado que dispara todos os dias às 7:00 AM UTC
. Quando o Trigger é acionado, ele chama sua função Atlas Function vinculada, generateDailyReport
, que executa uma consulta de agregação na coleção store.orders
para gerar o relatório. A Função então armazena o resultado da agregação na coleção store.reports
.
{ "type": "SCHEDULED", "name": "reportDailyOrders", "function_name": "generateDailyReport", "config": { "schedule": "0 7 * * *" }, "disabled": false }
exports = function() { // Instantiate MongoDB collection handles const mongodb = context.services.get("mongodb-atlas"); const orders = mongodb.db("store").collection("orders"); const reports = mongodb.db("store").collection("reports"); // Generate the daily report return orders.aggregate([ // Only report on orders placed since yesterday morning { $match: { orderDate: { $gte: makeYesterdayMorningDate(), $lt: makeThisMorningDate() } } }, // Add a boolean field that indicates if the order has already shipped { $addFields: { orderHasShipped: { $cond: { if: "$shipDate", // if shipDate field exists then: 1, else: 0 } } } }, // Unwind individual items within each order { $unwind: { path: "$orderContents" } }, // Calculate summary metrics for yesterday's orders { $group: { _id: "$orderDate", orderIds: { $addToSet: "$_id" }, numSKUsOrdered: { $sum: 1 }, numItemsOrdered: { $sum: "$orderContents.qty" }, totalSales: { $sum: "$orderContents.price" }, averageOrderSales: { $avg: "$orderContents.price" }, numItemsShipped: { $sum: "$orderHasShipped" }, } }, // Add the total number of orders placed { $addFields: { numOrders: { $size: "$orderIds" } } } ]).next() .then(dailyReport => { reports.insertOne(dailyReport); }) .catch(err => console.error("Failed to generate report:", err)); }; function makeThisMorningDate() { return setTimeToMorning(new Date()); } function makeYesterdayMorningDate() { const thisMorning = makeThisMorningDate(); const yesterdayMorning = new Date(thisMorning); yesterdayMorning.setDate(thisMorning.getDate() - 1); return yesterdayMorning; } function setTimeToMorning(date) { date.setHours(7); date.setMinutes(0); date.setSeconds(0); date.setMilliseconds(0); return date; }
Otimização de desempenho
Use a API de query com uma expressão $match para reduzir o número de documentos examinados pela Função. Isso ajuda sua função a melhorar o desempenho e não atingir os limites de memória da função.
Consulte a seção Exemplo de um Trigger Agendado usando uma expressão $match.
Exemplos adicionais
Para obter exemplos adicionais de Triggers integrados a um aplicativo App Services, confira o exemplo de Triggers no Github.