- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我想用 React 做一个异步路由器到经销商消息传递,但它不工作。 http://zguide.zeromq.org/php:rtdealer中的代码正在工作,但我无法确定我在做什么不同。我正在使用 libzmq 4.0.5
这是我的代码:
$context = new React\ZMQ\Context($loop);
$worker = $context->getSocket(\ZMQ::SOCKET_DEALER);
$worker->setSockOpt(\ZMQ::SOCKOPT_IDENTITY, 'A');
$worker->connect('tcp://127.0.0.1:5556');
$worker->send('END');
$worker->on('error', function ($e) {
var_dump($e->getMessage());
});
$worker->on('messages', function($msg) use ($worker) {
echo 'Dealer messages'. PHP_EOL;
var_dump($msg);
});
$worker->on('message', function($msg) use ($worker) {
echo 'Dealer message'. PHP_EOL;
var_dump($msg);
});
$router = $context->getSocket(\ZMQ::SOCKET_ROUTER);
$router->bind('tcp://127.0.0.1:5556');
$i = 0;
$loop->addPeriodicTimer(1, function (React\EventLoop\Timer\Timer $timer) use (&$i, $router) {
echo 'Time to send!'. PHP_EOL;
$i++;
$router->send('A', \ZMQ::MODE_SNDMORE);
$router->send('END');
});
$router->on('messages', function($msg) use ($router) {
echo 'Router messages'. PHP_EOL;
var_dump($msg);
});
$router->on('message', function($msg) {
echo 'Router message'. PHP_EOL;
var_dump($msg);
});
$loop->run();
问题是只有经销商发送第一条消息“END”。之后,路由器尝试发送消息,但经销商没有收到消息。
另外,这个函数好像只调用了一次:
// \React\ZMQ\SocketWrapper
public function handleReadEvent()
{
$messages = $this->socket->recvmulti(ZMQ::MODE_NOBLOCK);
echo 'Receiving...'; // Added
var_dump($messages); // Added
if ($messages !== false) {
if (count($messages) === 1) {
$this->emit('message', array($messages[0]));
}
$this->emit('messages', array($messages));
}
}
输出是:
Receiving...array(2) {
[0]=>
string(1) "A"
[1]=>
string(3) "END"
}
Router messages
array(2) {
[0]=>
string(1) "A"
[1]=>
string(3) "END"
}
Time to send!
Time to send!
Time to send!
Time to send!
Time to send!
...
编辑:
修改了dealer连接之前绑定(bind)路由器的代码,问题依旧:
$loop = React\EventLoop\Factory::create();
$context = new React\ZMQ\Context($loop);
$router = $context->getSocket(\ZMQ::SOCKET_ROUTER);
$router->bind('tcp://127.0.0.1:5556');
$loop->addPeriodicTimer(10, function (React\EventLoop\Timer\Timer $timer) use ($router) {
echo 'Router sending messages with an interval of 10 seconds'. PHP_EOL;
$router->send('A', \ZMQ::MODE_SNDMORE);
$router->send('END');
});
$router->on('messages', function($msg) use ($router) {
echo 'Router messages'. PHP_EOL;
var_dump($msg);
});
$router->on('message', function($msg) {
echo 'Router message'. PHP_EOL;
var_dump($msg);
});
$worker = $context->getSocket(\ZMQ::SOCKET_DEALER);
$loop->addPeriodicTimer(5, function (React\EventLoop\Timer\Timer $timer) use ($worker) {
echo 'After 5 seconds from router binding, connect the dealer and send something'. PHP_EOL;
$worker->setSockOpt(\ZMQ::SOCKOPT_IDENTITY, 'A');
$worker->connect('tcp://127.0.0.1:5556');
$worker->send('END');
$timer->getLoop()->cancelTimer($timer); // Cancel the timer after connecting
});
$worker->on('error', function ($e) {
var_dump($e->getMessage());
});
$worker->on('messages', function($msg) use ($worker) {
echo 'Dealer messages'. PHP_EOL;
var_dump($msg);
});
$worker->on('message', function($msg) use ($worker) {
echo 'Dealer message'. PHP_EOL;
var_dump($msg);
});
$loop->run();
这是终端输出:
After 5 seconds from router binding, connect the dealer and send something
Receiving...array(2) {
[0]=>
string(1) "A"
[1]=>
string(3) "END"
}
Router messages
array(2) {
[0]=>
string(1) "A"
[1]=>
string(3) "END"
}
Router sending messages with an interval of 10 seconds
Router sending messages with an interval of 10 seconds
Router sending messages with an interval of 10 seconds
Router sending messages with an interval of 10 seconds
Router sending messages with an interval of 10 seconds
Router sending messages with an interval of 10 seconds
Router sending messages with an interval of 10 seconds
Router sending messages with an interval of 10 seconds
最佳答案
我终于解决了这个问题。在@Jason 的评论 Not having used PHP/React, are you certain your namespacing is correct? 的帮助下,我查看了调用的 send
方法。这个方法看起来像这样:
// \React\ZMQ\SocketWrapper
public function send($message)
{
echo 'Inside send, sending message'. PHP_EOL; //This line was added by myself
$this->buffer->send($message);
}
然后,我想:好吧,如果我这样调用这个方法:
$router->send('A', \ZMQ::MODE_SNDMORE);
第二个参数永远不会被传递。
然后,我看到sendmulti
方法没有在SocketWrapper
中实现,__call
方法在这个SocketWrapper中实现
类直接调用 ZMQ api for PHP 中实现的方法,因此我尝试调用 sendmulti
将这两个参数包装在一个数组中。它起作用了,所以我尝试调用第一个传递相同数组的 send
方法,我不知道为什么但它也起作用了,所以诀窍是调用:
$router->send(array('A', \ZMQ::MODE_SNDMORE));
$router->send(array('END'));
代替:
$router->send('A', \ZMQ::MODE_SNDMORE);
$router->send('END');
此外,请注意位于 GitHub 存储库中的 ZMQ PHP API,它是错误的。 PhpStorm 以某种方式下载了位于某处的另一个 ZMQ PHP API,该 API 似乎是正确的,sendmulti
方法原型(prototype)在此 API 中如下所示:
public function sendmulti(array $message, $mode = 0)
令人惊讶的是,以下对该方法的调用似乎给出了相同的结果:
$router->send(array('A', \ZMQ::MODE_SNDMORE));
$router->send(array('A'), \ZMQ::MODE_SNDMORE);
关于php - React ZMQ,路由器到经销商,不工作。 ZMQ 4.0.5,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30469459/
当我尝试运行文件时收到此错误? can't find package zmq while executing "package require zmq" 如何在 Ubuntu 中安装 zmq? 谢谢
我已经使用 Installation on Linux / bsd without root access 中提到的步骤安装了 zmq已成功安装,但在启动应用程序时出现错误。我在没有根访问权限的环境中
我正在尝试通过 czmqz (4.0.2) 使用 libzmq (4.2.2) 在 Python 程序和我的 C++ 应用程序之间建立 IPC 通信 channel 。 我正在使用 ZMQ 发布者/订
更新我的问题 如何在我的 python zmq 服务器中表示到达的消息以显示其内容? 根据这种行为,我是否可以假设 btnState 数据无论如何都会发送到 python 服务器? 上下文: 我正在发
我有一个客户端使用一对套接字与单个服务器通信: context = zmq.Context() socket = context.socket(zmq.PAIR) socket.setsockopt(
我有一个名为 GenericMessage 的类,显示在下面的第一个代码片段中(在 GenericMessage.hxx 中定义)。 我有一个名为 TestFE.cpp 的 .cpp 文件(参见下面的
我试图在 Go 应用程序中包含 ZMQ 套接字,但 zmq4 和 gozmq(Go 的引用 ZMQ 绑定(bind)库)都给我带来了问题。我想了解为什么 zmq4 特别不能在我的系统上导入。 我运行的
我遇到了一个关于 ZeroMQ 的问题,因为我在 ZMQ 套接字上为 zmq::proxy 和 zmq::poll 使用了指针。这样做会发生错误 88 的异常(非套接字上的套接字操作)。 实际上 Ze
我正在尝试在 MQL5 中设置一个 PUB 套接字,在 Python 中设置一个 SUB 套接字来接收消息。 我在 MQL5 中有这个: #include Context context("hell
我想用 React 做一个异步路由器到经销商消息传递,但它不工作。 http://zguide.zeromq.org/php:rtdealer中的代码正在工作,但我无法确定我在做什么不同。我正在使用
我有一个 Python 脚本,我在其中绑定(bind)了多个(例如 5 个)ZMQ 接收器套接字,如下所示: receiver_1 = context.socket(zmq.PULL) receive
在Linux-Ubuntu上安装ZeroMQ,一个网站 https://tuananh.org/2015/06/16/how-to-install-zeromq-on-ubuntu/ 说要运行以下命令
如何创建允许多个发布者和这些发布者的多个订阅者的网络? 还是绝对有必要使用消息代理? import time import zmq from multiprocessing import Proces
我研究 zmq 有一段时间了,并实现了一个简化的 poc - 模仿我的基础架构设计 - 使用它(特别是使用 NetMQ 包装器),取得了很好的效果。 我的情况是这样的: 将来我计划在一台机器上运行多个
我一直在阅读 ZMQ documentation在心跳上并阅读应该使用乒乓方法而不是用于偏执海盗模式的方法 For Paranoid Pirate, we chose the second appro
我正在寻找一种支持 ZMQ 的解决方案,用于连接到 0 或 1 个对等点的绑定(bind)端点之间的通信,仅此而已。通信是双向的,连接可以随时结束或切断;并且可以与新的对等点或同一对等点重新建立连接。
我正在使用 ZMQ PUB 套接字来发布不同主题的新闻。但是其中一些消息的计算成本很高。有没有办法有一个 on_subscribe 回调,这样我就可以只计算实际需要的东西? 最佳答案 只是为了记录我找
我有兴趣了解 ZMQ 在发送消息之前是否已经压缩了消息,这样我自己就不会这样做,因为压缩消息两次是多余的。 如果确实这样做,它是自动的,还是有一个选项参数可以指定? 我正在使用java,但这确实不重要
我在我的 Java 应用程序中使用 ZMQ。我发现它的行为不均匀,即如果我发送大约 100 条消息,其中一个消费者说需要 1 秒,那么如果我们继续增加消费者,所花费的时间将变为 2,1.5,3,这样。
所以我有 8 个工作线程(PULL 套接字),它们从单个绑定(bind)的 PUSH 套接字提供数据。它们每秒处理大量数据,有时会随机崩溃。显然,我应该尝试处理这些崩溃,但我很好奇这个系统目前的弹性如
我是一名优秀的程序员,十分优秀!