Kdyby\Events nepředává do consumeru
- f1376964
- Člen | 13
Ahoj,
řeším již 3. den předávání zpráv přes RabbitMQ. Vše mám
nainstalováno / nastaveno.
Z aplikace odešlu do publisheru zprávu, ten mi zobrazí v RabbitMQ Manageru přijatou zprávu, ale za živého boha mi ji nechce přijmout consumer.
Budu rád za každou pomoc
Můj kód:
Odesílání do Rabbitu
$this->producer->publish(\Nette\Utils\Json::encode([
'order_id' => $orderEntity->id
]));
A consumer zatím jednoduchý, aby mi vytvořil TXT soubor pro kontrolu
\Events\Consumers\OrderConsumer
public function process(\PhpAmqpLib\Message\AMQPMessage $msg)
{
$content = "test";
$fp = fopen(__DIR__ . "/finish.txt","wb");
fwrite($fp,$content);
fclose($fp);
}
A nastavení configu:
rabbitmq:
connection:
user: ***
password: ***
producers:
orderProducer:
contentType: application/json
exchange: {name: 'order-producer', type: direct}
deliveryMode: 2
autoSetupFabric: on
consumers:
orderProducer:
exchange: {name: 'order-producer', type: direct}
queue: {name: 'order-producer'}
callback: [\Events\Consumers\OrderConsumer, process]
deliveryMode: 2
autoSetupFabric: on
- David Matějka
- Moderator | 6445
a ten consumer ti bezi, jo? kdyztak ho zkus spustit s --debug
prepinacem, treba to rekne vic
- Marek Šneberger
- Člen | 130
Když si vytáhneš definitions, máš tam správně nastavené (propojené) bindings? To určuje, který exchange se přeleje do které queue.
- Marek Šneberger
- Člen | 130
Bohužel ne. Buďto si je musíš naklikat přes RabbitMQ management plugin, nebo tam nahrát přímo definitions.json
- f1376964
- Člen | 13
Dostal jsem se k tomu až nyní.
Bohužel mi to nepředává stále do consumeru.
Přidal jsem Queues, který bere z Exchange data, ale už je dále neposílá do consumeru. Chyba je tedy stále původní. Možná jsem špatně vyplnil Queue, nebo exchange, nicméně předávají si zprávy mezi sebou, ale už ne zpět do consumeru. Kde eviduji, kam má předat zprávu. To bere pouze sám callback v configu?
- jiri.pudil
- Nette Blogger | 1032
Tak ho spusť :) viz https://github.com/…/en/index.md#…
Now, how to run a consumer? There's a command for it that can be executed like this:
$ php www/index.php rabbitmq:consumer -m 50 uploadPicture
- jiri.pudil
- Nette Blogger | 1032
Ajo, jasně, musíš zaregistrovat ještě Kdyby/Console:
extensions:
console: Kdyby\Console\DI\ConsoleExtension
- David Matějka
- Moderator | 6445
Jak myslis „nezavola mi ho script“? Kdyz publikujes zpravu do rabbita, tak se ulozi do fronty a ten konzolovy consumer tu zpravu zpracuje
- jiri.pudil
- Nette Blogger | 1032
Prostě si ten consumer pustíš jako separátní proces a necháš ho běžet, buďto přímo, nebo přes nějaký tool jako např. supervisord, který ti ho bude pouštět znovu, pokud se z nějakého důvodu ukončí
- f1376964
- Člen | 13
Skvěle, již jsme skoro u cíle. Supervisord mi hází tu samou chybu, co předtím aplikace, tedy:
[2016–08–09 14–09–45] PHP Notice: Trying to get property of non-object in ***app/router/RouterFactory.php:281 @ CLI: ****html/index.php rabbitmq:consumer -w -m 1 orderProducer
Editoval f1376964 (9. 8. 2016 14:11)
- f1376964
- Člen | 13
Mockrát děkuji za pomoc, rozchodil jsem to takřka do finále :)
Poslední věc:
Script se mi zavolá celkem 5×, občas se stane že supervisord skončí chybou: Exited too quickly (process log may have details) a již se nenahodí.
Mám tam stále vytvoření txt souboru s tím, že se mi vytvoří při každém poslání do rabbitMQ, soubor celkem 5×.
Nastavení programu supervisordu:
command=/usr/bin/php ***/html/index.php rabbitmq:consumer -w -m 1 orderProducer
directory=***/html
user=root
autostart=true
startsecs=0
autorestart=unexpected
Editoval f1376964 (9. 8. 2016 15:44)
- jiri.pudil
- Nette Blogger | 1032
Není to prostě jen tím, že ten consumer spouštíš s -m 1
,
tj. po zpracování jedné zprávy se sám ukončí? Pokud ne, podívej
se do aplikačních logů, pokud ani tam nic, nastav tomu programu
v supervisord stdout_logfile
a koukni do něj, jestli něco
nevypíše.
K druhému problému: když si ten consumer zaregistruješ jako službu a v tom callbacku jej předáš přes zavináč, jako je to v dokumentaci, můžeš standardně pracovat se závislostmi :)
- f1376964
- Člen | 13
Opět se vracím ke starému problému.
RabbitMQ zpracuje danou zprávu, udělá to co má, ale poté supervisord sám skončí (hodí status exited; – bez jediné chyby) a již se nespustí. Daná zpráva zůstane stále ve frontě a pokud zase spustím supervisord, opět zpracuje jenom tu jednu první a ukončí se.
<?php
[program:order_producer]
command=/usr/bin/php ***/html/index.php rabbitmq:consumer -w orderProducer
directory=***/html
user=root
autostart=true
autorestart=true
stderr_logfile=/var/log/supervisor/order_producer.log
stdout_logfile=/var/log/supervisor/order_producer.log
redirect_stderr=true
environment=PATH="/usr/bin"
?>
Logy jsou prázdné bez chyb a i když nastavím -m 1, nebo -m 5000, furt to skončí na té první a nejde to dále. Potřebuji, aby to pracovalo neustále a ani se mi nedaří, aby to staré zprávy mazalo – tedy, aby to nedělalo věci pořád dokola. To mi to prozměnu hodí chybu:
<?php
[PhpAmqpLib\Exception\AMQPProtocolChannelException]
PRECONDITION_FAILED - inequivalent arg 'auto_delete' for exchange 'imagesLi
stener' in vhost '/': received 'false' but current is 'true'
?>
Nicméně i kdybych toto vyřešil, tak ten problém s tím, že supervisord se sám nenastartuje, mi to nevyřeši.