Tenho uma tarefa que leva cerca de 45 minutos para ser concluída e precisa acontecer todos os dias (sincronizando usuários com vários bancos de dados externos, etc.).
Para lidar com o trabalho, configurei uma fila cron com hook_cron_queue_info()
o seguinte:
function mymodule_cron_queue_info() {
$queues = array();
$queues['update_users_queue'] = array(
'worker callback' => '_mymodule_process_user_queue_item',
'time' => 120,
);
return $queues;
}
Encho a fila usando esta função:
function mymodule_queue_all_users_for_synching() {
//...query for users...
$queue = DrupalQueue::get('update_users_queue');
foreach($users as $user) {
$queue->createItem($user);
}
}
A função de preenchimento de fila é chamada como uma tarefa cron. Eu uso o Elysia Cron , então minha implementação hook_cronapi()
é:
function mymodule_cronapi($op, $job = NULL) {
$items = array();
$items['queue_users_for_synch'] = array(
'description' => 'Queue all user accounts for synching.',
'rule' => '0 3 * * *', // Run this job every day at 3am.
'callback' => 'mymodule_queue_all_users_for_synching',
);
return $items;
}
A função de trabalho para cada item da fila, definida em, mymodule_cron_queue_info
é como:
function _mymodule_process_user_queue_item($item) {
//...synchronize user ($item)...
}
Minha pergunta é: quando o cron realmente começará a processar a fila?
Digamos que eu preencha a fila todos os dias às 3 da manhã e queira processá-la em 120 segundos a cada 30 minutos até que ela termine - preciso criar outra tarefa cron?
Respostas:
Quando o Drupal executa tarefas cron, ele lida automaticamente com qualquer fila cron definida nos módulos, in
drupal_cron_run()
; as primeirashook_cron()
implementações são invocadas e as filas cron são esvaziadas.Na implementação
hook_cronapi()
, você pode adicionar uma entrada para outra função que lida com a fila cron do seu módulo.A alternativa é permitir que o Drupal lide com a fila cron para você, mas isso acontece quando as tarefas do cron Drupal são executadas. Se você quiser esvaziar a fila do cron do seu módulo com mais frequência, poderá adicionar apenas uma nova tarefa do cron manipulada pelo módulo Elysia Cron.
O módulo Elysia Cron lida com as filas cron
elysia_cron_run()
; esta função está sendo chamada deelysia_cron_cron()
(uma implementação dehook_cron()
),drush_elysia_cron_run_wrapper()
(um retorno de chamada do comando Drush) e de seu próprio cron.php . Se você seguiu as instruções no arquivo INSTALL.txt (em particular na "ETAPA B: ALTERAR O SISTEMA CRONTAB (OPCIONAL)") e substituiu qualquer chamada de http://example.com/cron.php por http: // example .com / sites / all / modules / elysia_cron / cron.php , o módulo Elysia Cron já deve estar lidando com as filas do cron. O código sugerido pode ser usado para acelerar o processamento das filas cron usadas no seu módulo, se houver efetivamente a necessidade de fazê-lo.fonte
cron.php
? Se for esse o caso, isso acontece a cada minuto (veja meu primeiro comentário na resposta de @ David).elysia_cron_run
com filas cron sendo processadas automaticamente toda vez que o cron.php do Elysia é solicitado.A fila será preenchida por meio do gancho Elysia cronapi no horário definido.
No entanto, a fila será processada sempre que ocorrer a execução cron padrão do Drupal.
Veja este fragmento de processamento de retorno de chamada do trabalhador no final do núcleo: drupal_cron_run
fonte
cron.php
script Elysia a cada minuto , o que permite que o Elysia controle o tempo das tarefas com uma resolução minuciosa. Porém, nenhuma tarefa é executada a cada minuto - e foi isso que me fez pensar que precisava criar uma tarefa para trabalhar especificamente em filas?drupal_cron_run
estiver sendo chamado, seu retorno de chamada do trabalhador da fila cron será processado.drupal_cron_run
não é chamado a partir docron.php
script Elysia (quando o Elysia está ativado);elysia_cron_run
é usado em seu lugar.hook_cron_queue_info
Elysia cron, a menos que especifique seu próprio retorno de chamada do trabalhador, conforme odrupal_cron_run
snippet da função principal acima.elysia_cron_run
não chamadrupal_cron_run
, mas faz chamadamodule_invoke_all('cron_queue_info')
e faz algumas fantasia-calças manipulação que faz fumaça sair meus ouvidos multi-canal.conforme indicado acima, ao usar o Elysia Cron, suas filas não são processadas.
você (e drupal) não tem acesso a filas que seriam executadas em drupal_run_cron
a solução alternativa é criar uma tarefa cron personalizada - (isso será visível para elysia cron) para processar todas as filas ou uma que você deseja e chamar o processamento da fila lá. ou seja:
agora o processamento de filas pode ser controlado pelo ElysiaCron
fonte
Não uso o Elysia, mas minha solução sempre foi assim:
Ele lida apenas com um item, para cada execução do cron. Talvez você queira mudar isso.
fonte
Eu também tenho tentado entender isso, pois estou usando a API da fila pela primeira vez junto com o Elysia cron. Após uma inspeção mais detalhada, você pode ver que o Elysia cron executa itens da fila quando a função elysia_cron_run é chamada. Veja este trecho da linha 1044 no arquivo elysia_cron.module :
Isso ajudou a desmistificar o processamento da fila para mim ao usar o Elysia cron.
fonte