Skip to main content

AsyncProcessor

Esse serviço é responsável por executar diversas tarefas de modo assíncrono, geralmente "descarregando" operações feitas em tela por usuários (emissão de relatórios, por exemplo).

De modo geral, quando se deseja "jogar um serviço pra tratamento assíncrono", basta executar:

Accelero::runAsyncJob(new GenericAsyncRunnerJobCreator(<CLASSE>::class, <ARRAY_PARAMETROS>));

A classe deve implementar a interface GenericAsyncRunnerInterface. Os parâmetros serão passados para o método runAsync da classe exatamente como foram declarados.

Em geral, quando se deseja dar um feedback pro usuário

Exemplo de classe assíncrona + chamada

class FazCoisaAsync implements GenericAsyncRunnerInterface {
public function __construct(
private readonly UsuarioNotificator $notificator,
) {}
public function runAsync(mixed $args) {
$usu = Usuario::loadByUsuID($args['usuID'] ?? null);
//FAZ COISAS
if (!$usu->getIsNew()) $this->notificator->notifyUsuario(
usu: $usu,
message: 'Tarefa executada com sucesso!',
title: 'Tarefa async'
);
}
}

E a execução pode, por exemplo, ser disparada num controller, iniciada por operação do usuário:

class FazCoisaController {
public function entrypoint(ServerRequestInterface $request, array $params) : ResponseInterface {
$params = [
'usuID' => Accelero::getCurrentLoggedUserObj()->getUsuID();
'param01' => '123',
'param02' => '456',
];

Accelero::runAsyncJob(new GenericAsyncRunnerJobCreator(FazCoisaAsync::class, $params));

return DataFlusher::flush($request, code: DataFlusher::HTTP_OK, msg: 'Operação assíncrona iniciada!');
}
}

A comunicação entre os processos (tela <> asyncprocessor) acontece via MQTT. Monitore as mensagens pra ver os bastidores, se necessário.

Serviços long-running

Alguns serviços "se registram" para ficar em execução contínua no container do asyncprocessor. Eles entram no ar durante a inicialização do processo e ficam rodando direto. O asyncprocessor cuida de monitorar e garantir que esses serviços estão no ar o tempo todo (se matar o serviço, o asyncprocessor "sobe" ele novamente).

O registro desses serviços é feito através de um evento (EventHandler) async_processor_startup que é disparado na inicialização do asyncprocessor.

A execução desses serviços podem ser visualizados com um ps aux de dentro do container.

A seguir, detalhamento desses serviços (Accelero 2.16.0).

IOTreaterLooper

Cuida de monitorar placas e eventos de I/O. Quando uma placa (ou o próprio Accelero) envia um evento de I/O, é esse serviço que faz o tratamento da mensagem.

SynapsisLooper / SynapsisPermanencyTimeLooper

Cuida de mensagens de localização / integração com Synapsis.

AppIntegrationListener

Quando há integração do controle de acesso com aplicativos que querem receber um retorno de passagens realizadas (o visitante cadastrado pelo aplicativo passou na catraca, por exemplo), esse serviço é executado. Note que pode haver mais de um ponto de registro (Livo e SigmaApp, por exemplo), mas o serviço registrado é o mesmo e com o mesmo nome (app_listener), o que garante que apenas uma instância vai ser executada, mesmo que o registro aconteça duas vezes.