Страница 1 из 1

queue\amqp

Добавлено: 2020.01.22, 13:36
tugrik
Доброго времени суток.
Возник небольшой вопрос.
Дано:
yii2 c компонентом queue, (драйвер amqp (RabbitMq)) через которые выполняются внутренние таски приложения (в супервизоре стоит yii queue/listen).

Дано еще порядка 10 очередей в которые сторонние приложения "пушат" свои сообщения.
На каждую очередь написан свой консольный контроллер который запускается по крону.

Вопрос:
Возможно ли "заставить" компонент queue слушать (уйти от крона) сразу несколько очередей и выполнять что-то похожее на этот псевдокод:

Код: Выделить всё

switch ($queueName) {
case 'queueNameOne':
parseMessageFromQueueNameOne($message);
break;
case 'queueNameTwo':
parseMessageFromQueueNameTwo($message);
break;
case 'queueNameThree':
parseMessageFromQueueNameThree($message);
break;
}
или же это реализовывается не через компонент queue ?

Re: queue\amqp

Добавлено: 2020.01.22, 15:28
ElisDN
Это решается запуском в супервизоре нескольких листенеров:

yii queue/listen queueNameOne
yii queue/listen queueNameTwo
yii queue/listen queueNameThree

Re: queue\amqp

Добавлено: 2020.01.22, 17:00
tugrik
ElisDN писал(а): 2020.01.22, 15:28 Это решается запуском в супервизоре нескольких листенеров:

yii queue/listen queueNameOne
yii queue/listen queueNameTwo
yii queue/listen queueNameThree
Если я все верно понял, у меня есть два решения :
под каждую очередь создать в конфиге свой вариант компонента:

Код: Выделить всё

 'queue-rabbit-q1' => [
            'class' => \yii\queue\amqp_interop\Queue::class,
            'as log' => \yii\queue\LogBehavior::class,
            'ttr' => PHP_INT_MAX,
             'queueName' => 'queueNameOne',
            'serializer' => \yii\queue\serializers\JsonSerializer::class,
        ],
         'queue-rabbit-q2' => [
            'class' => \yii\queue\amqp_interop\Queue::class,
            'as log' => \yii\queue\LogBehavior::class,
            'ttr' => PHP_INT_MAX,
             'queueName' => 'queueNameTwo',
            'serializer' => \yii\queue\serializers\JsonSerializer::class,
        ],
и запустить:
yii queue-rabbit-q1/listen
yii queue-rabbit-q2/listen

или же создать свой класс работы с очередью:

Код: Выделить всё

MyQueue exdends \yii\queue\amqp_interop\Queue::class
в котором переопределить queueName с параметров , так как yii queue/listen не умеет переопределять\прокидывать queueName (как я понял)
и запустить уже
yii queue/listen --queueName queueNameOne
yii queue/listen --queueName queueNameTwo
yii queue/listen --queueName queueNameThree
Верно?

Re: queue\amqp

Добавлено: 2020.01.27, 12:06
tugrik
ап