在PHP中编写RabbitMQ的订阅方法

时间:2015-12-29 12:20:09

标签: php rabbitmq php-amqplib

我有一个定义如下的函数:

import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;

import javax.imageio.ImageIO;

import Jama.EigenvalueDecomposition;
import Jama.Matrix;

public class eigenvalues {

    double L[][], A[];

    public static void main(String[] args) throws IOException { 
        File file = new File("C:\\Users\\lina\\workspace\\eigen\\koala.jpg");

        BufferedImage image= ImageIO.read(file);
        int width = image.getWidth();
        int height = image.getHeight();
        double[][] L = new double[height][width];

        for (int row = 0; row < height; row++) {
            for (int col = 0; col < width; col++) {
                L[row][col] = image.getRGB(row, col);
            }
        }
        Matrix A=new Matrix(L);
        EigenvalueDecomposition e = A.eig();
        Matrix V = e.getV();
        Matrix D = e.getD();
        System.out.print("A =");
        A.print(9, 6);
        System.out.print("D =");
        D.print(9, 6);
        System.out.print("V =");
        V.print(9, 6);

我正在使用以下功能:

注意:以下行位于不同的类文件中,因此创建包含上述函数的类的对象。

public function subscribe($someQueue)
{
    $callback = function($msg){
        return $msg->body;
    };
    $this->channel->basic_consume( $someQueue, '', FALSE, TRUE, FALSE, FALSE, $callback);
    while(count($this->channel->callbacks)) {
         $this->channel->wait();
    }
}

基本上,我想将每条消息的正文返回给发布到队列的调用函数。

当前输出:

$objRMQ = new RabbitMQ();
$msgBody = $objRMQ->subscribe("someQueue");
echo "message body returned from someMethod: ".$msgBody; 

预期产出:

message body returned from subscribe: NULL

1 个答案:

答案 0 :(得分:0)

由于这个问题已经陈旧但仍未得到答复,我将简要解释一下。你现在可能已经找到了答案,但这可能有助于其他人在将来搜索。

这里的关键概念是&#34;异步执行&#34;。

当您使用basic_consume方法订阅频道时,您不是要求立即执行一次回调,而是要求在消息可用时执行,然后每次发送另一条消息是可用的。

对于AMQPLib,您可以通过反复调用wait()方法等待新消息;即:

while(count($this->channel->callbacks)) {
     $this->channel->wait();
}

仔细考虑这一点,您的代码中存在两个错误:

  • return $msg->body无处可将返回。调用将在wait()方法的实现深处发生,并且您没有得到$this->channel->wait()的输出,因此无法对返回的值执行任何操作。
  • 另一方面,当您从其他类调用$objRMQ->subscribe("someQueue")时,您希望它返回一些内容,但该函数没有return语句。唯一的return语句位于您传递给basic_consume的匿名函数内。

解决方案基本上是所有您对邮件的处理 - echo $msg->body,或者您想要做的任何实际处理 - 在回调中。如果您真的想在收到消息时收集数据,可以将其保存到回调之外可访问的变量中,但请记住,在某些时候您需要突破wait()循环才能执行任何操作那个数据。