www.state-it.info

Gran base de respuestas a las preguntas de los desarrolladores
Header decor

¿por Qué en yii2 colas trabajan sólo los desencadenadores: Queue::EVENT_BEFORE_PUSH y Queue::EVENT_AFTER_PUSH?

EVOSandru6 2018-10-09 17:54:10

Buen día,

Configure el apoyo очердей como en la documentación:

https://github.com/yiisoft/yii2-queue

Mismos cola trabajan normalmente. Como el controlador señaló 'db', y ha creado una tabla de mysql como en el dock

Más adelante en el marco de:

https://github.com/yiisoft/yii2-queue/blob/master/...

Tratando de escuchar los eventos. Para mí la más Interesante de seguir:

Queue::EVENT_AFTER_EXEC
ExecEvent
Después de cada éxito de la ejecución del trabajo


Pero no puedo entrar en él aunque la cola отабатывает con éxito.

./yii queue/listen --color --verbose --isolate
----------------------
2018-10-09 14:43:10 [156] common\trabajos\DownloadJob (attempt: 1 pid: 4297) - Started
2018-10-09 14:43:11 [156] common\trabajos\DownloadJob (attempt: 1 pid: 4297) - Done (0.379 s)

Pesca de:

EVENT_BEFORE_PUSH
EVENT_AFTER_PUSH

No pillo:

EVENT_BEFORE_EXEC
EVENT_AFTER_EXEC
EVENT_AFTER_ERROR
EVENT_WORKER_START
EVENT_WORKER_LOOP
EVENT_WORKER_STOP

El ejemplo de la captura de:

$afterExecAlert = function($event) {
            throw new \Exception('Hurra - EVENT_AFTER_EXEC');
        };
Yii::$app->queue->on(Queue::EVENT_AFTER_EXEC, $afterExecAlert);

Yii::$app->queue->push(new DownloadJob([
            'url' => 'https://picsum.photos/200/500',
            'file' => $full_path,
        ]));


Config:

'queue' => [
            'class' => \yii\queue\db\Queue::class,
            'db' => 'db', // DB connection component or its config
            'tableName' => '{{%queue}}', // Table name
            'channel' => 'default', // Queue channel key
            'mutex' => \yii\mutex\MysqlMutex::class, // Mutex used to sync queries
            'as log' => \yii\queue\LogBehavior::class
        ],


Por favor, dígame en que la causa de la?

Total answers: 1

Zhuravljov 2018-10-10 11:06:56

Envío y recepción de mensajes se produce en diferentes procesos. Usted вешаете el procesador de EVENT_AFTER_EXEC en el proceso que envía el mensaje. Воркер-el proceso de pro es que no sabe nada, y él триггерит EVENT_AFTER_EXEC.

Complete el controlador de eventos en forma de comportamiento, así como por el tipo de LogBehavior) y conéctelo en general configurac. Esto resuelve el problema.

EVOSandru6 2018-10-10 11:26:50

Gracias, si he comprendido correctamente, es necesario tan:

'queue' => [
            'class' => \yii\queue\db\Queue::class,
            'db' => 'db', // DB connection component or its config
            'tableName' => '{{%queue}}', // Table name
            'channel' => 'default', // Queue channel key
            'mutex' => \yii\mutex\MysqlMutex::class, // Mutex used to sync queries
            'as log' => \yii\queue\LogBehavior::class,
            'on '.yii\queue\Queue::EVENT_BEFORE_EXEC => function($event) {
                throw new \Exception('oops');
            }
        ],


En throw new \Exception('oops'); yo no caigo.

Tal vez no me di cuenta de Pronto en la terminología, sólo que con Laravel vino a Yii2 recientemente.

Y si globalmente навешать todavía consigue, el controlador se encargará de todo completar exitosamente воркеры. Pero si la lógica de tales finalizaciones puede variar?


Zhuravljov 2018-10-10 12:42:55

si he comprendido correctamente, es necesario tan


Técnicamente sí, es su opción. Pero escribir código en конфигах es una mala práctica. Para ello, hay Behavior-mas. En términos de Laravel y Symfony es algo tipo EventListener. En Yii2 no individual event manager. Диспетчиризация se produce en el nivel de cualquier clase heredado de `\yii\base\Component`. Se crea heredero `\yii\base\Behavior`, en el que desea implementar controladores de eventos. Y se conecta en la configurac:

'queue' => [
    'class' => \yii\queue\db\Queue::class,
    'as xxx' => \...\MyQueueBehavior::class,
],


Y si globalmente навешать todavía consigue, el controlador se encargará de todo completar exitosamente воркеры. Pero si la lógica de tales finalizaciones puede variar?


Sí, absolutamente de todo. En el procesador de пробрасывается parámetro de tipo `\yii\queue\JobEvent` en él, entre otras cosas, la referencia se ejecuta la tarea. Por él y construye la condición de que controlar, y lo que no.


EVOSandru6 2018-10-10 14:26:31

Gracias, pero en la fecha en la comprensión de la.

Así si se puede o no varios controladores en конфиге навешать?

Si hay un ejemplo en la documentación con el comportamiento de?


Zhuravljov 2018-10-10 15:12:29

en la fecha en la comprensión de la.


Es principios básicos. De conducta están bien descritas en la documentación yii2.


Zhuravljov 2018-10-10 15:53:23

Aqu como crear el comportamiento. En el mismo comportamiento de un evento se puede colgar de un solo procesador. Pero al componente puede conectar varios comportamientos, que en el mismo evento la cabeza de sus controladores. Los registros de LogBehavior así se escriben a través de un evento.


EVOSandru6 2018-10-22 17:44:01

Con actitudes claro, se meten a los componentes o los modelos como la obtención de la funcionalidad de.

1) Supongamos que ha creado el comportamiento con el evento EVENT_AFTER_EXEC (donde el motor?)
2) A qué componente de colgar este evento?


Zhuravljov 2018-10-22 18:29:52

A un componente de la cola, como se describe anteriormente:

'queue' => [
    'class' => \yii\queue\db\Queue::class,
    'as xxx' => \...\MyQueueBehavior::class, // <--
],


Preguntas relacionadas:

Footer decor

© www.state-it.info | Base of answers to questions for developers and programmers.