一個publisher發布消息 多個個customer接受消息
1:准備工作參照:
http://www.cnblogs.com/spicy/p/7886820.html
2,:路由:
3: 方法:”

public function callFunc($msg) { echo " [x] Received ", $msg->body, "\n"; if($msg->body==2){ sleep(50); }else{ sleep($msg->body); } // sleep(substr_count($msg->body, '.')); echo " [x] Done", "\n"; } public function worker() { set_time_limit(0); $connection = new AMQPStreamConnection('localhost', 5672, 'bitch', 'bitch'); $channel = $connection->channel(); $channel->queue_declare('hello', false, true); $receiver = new self(); #下面第四個參數如果為true表示開啟確認模式,也就是消費以后會告知rabbitmq服務器該條消息已經處理完畢,這樣可以方式消息處理一半掛掉了,結果服務器也刪除了這條未處理完畢的消息 $channel->basic_consume('hello', '', false, true, false, false, [$receiver, 'callFunc']); while(true) { $channel->wait(); } $channel->close(); $connection->close(); } public function task() { $re = input('uid'); $connection = new AMQPStreamConnection('localhost', 5672, 'bitch', 'bitch'); $channel = $connection->channel(); $channel->queue_declare('hello', false, true); for($i=1; $i<11; $i++){ $msg = new AMQPMessage($i); $channel->basic_publish($msg, '', 'hello'); echo "第".$i.'發送完畢'; } $channel->close(); $connection->close(); }
4:在命令行啟動三個worker
發布10條消息:
結果:
結論一: rabbitmq服務器會依次把消息分發給每個worker, 不關每個消息會執行多久
結論二: 如果其中一個worker在執行過程中掛掉了,那么分給它的消息就丟失了,這個在下面的例子解決
解決結論二現象: 其中一個消費worker掛掉以后,分發給這個worker的消息就全部丟失掉了
第一步:
第二步:
第三步實驗:啟動2個worker,然后強制退出第一個,就會發現本來給worker1 的消息最后重新分發給了 worker2