我有一个定义如下的函数:
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
答案 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()
循环才能执行任何操作那个数据。