Kdyby\Events nepředává do consumeru

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
f1376964
Člen | 13
+
0
-

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
f1376964
Člen | 13
+
0
-

Ještě dodám, že Managementu Rabbitu vidím normálně v Exchanges přijatou zprávu, , i dané jméno produceru

David Matějka
Moderator | 6445
+
0
-

a ten consumer ti bezi, jo? kdyztak ho zkus spustit s --debug prepinacem, treba to rekne vic

Marek Šneberger
Člen | 130
+
0
-

Když si vytáhneš definitions, máš tam správně nastavené (propojené) bindings? To určuje, který exchange se přeleje do které queue.

f1376964
Člen | 13
+
0
-

definitions mám prázdný, asi tam bude ta chyba. Myslle jsem, že jej definuje sám Events?

This exchange → … no bindings …

Jak se to prosím definuje?

Marek Šneberger
Člen | 130
+
0
-

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
+
0
-

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?

Spectator
Člen | 48
+
0
-

Opravdu ten consumer běží? Jak ho pouštíš?

f1376964
Člen | 13
+
0
-

V nette jej mám jako samostatnou třídu s funkcí process. Mám jej evidován v Nette v configu a nikde jej nepouštím (?), jediná zmínka o něm (pokud nepočítám v services) je právě v callbacku

jiri.pudil
Nette Blogger | 1032
+
0
-

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
f1376964
Člen | 13
+
0
-

Vytiskne mi to hlavní stránku a v error logu mám:

[2016–08–09 12–24–48] HTTP code: No route for HTTP request. in *****/Nette/Application/Application.php:110 @ CLI: index.php rabbitmq:consumer -m 50 uploadPicture

jiri.pudil
Nette Blogger | 1032
+
0
-

Ajo, jasně, musíš zaregistrovat ještě Kdyby/Console:

extensions:
	console: Kdyby\Console\DI\ConsoleExtension
f1376964
Člen | 13
+
0
-

Díky za rady.

Tak přes konzoli se mi zavolá, ale nezavolá mi ho script – pošle jej tedy do zprávy, ale zprávu už nepředá dále.

David Matějka
Moderator | 6445
+
0
-

Jak myslis „nezavola mi ho script“? Kdyz publikujes zpravu do rabbita, tak se ulozi do fronty a ten konzolovy consumer tu zpravu zpracuje

f1376964
Člen | 13
+
0
-

Myslel jsem, že se to dělá automaticky? Že po frontě se automaticky zavolá konzolový consumer? Jak se toto řeší automaticky? Zavolat exec v systému?

jiri.pudil
Nette Blogger | 1032
+
+1
-

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
+
0
-

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
+
0
-

Config je správný:

[program:order_producer]
command=/usr/bin/php ***html/index.php rabbitmq:consumer -w -m 1 orderProducer
directory=***html
autostart=true
user=root
autorestart=true
numprocs=1
David Matějka
Moderator | 6445
+
0
-

to ConsoleExtension mas teda zapnuty, jo? a zkousel si smazat cache?

f1376964
Člen | 13
+
0
-

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)

f1376964
Člen | 13
+
0
-

Stejně tak nechápu, to se volá statická funkce process? Nejde zavolat celou třídu s tím, aby se mi načetl construct?

Děkuji.

jiri.pudil
Nette Blogger | 1032
+
+1
-

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
+
0
-

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.