AsyncTcpConnection无法触发onMessage

zach

问题描述

在gateway中使用AsyncTcpConnection把任务发给task_worker去处理,参考了异步任务文档https://www.workerman.net/doc/workerman/faq/async-task.html
发现task_worker的onMessage一直无法触发,如果在send前加上connect就能触发。看到也有人提问过类似问题但是没有解答

public static function onWorkerStart($businessWorker)
{
    if ($businessWorker->id == 0) {
        Timer::add($msgInterval, function () {
        // 与远程task服务建立异步连接,ip为远程task服务的ip,如果是本机就是127.0.0.1,如果是集群就是lvs的ip
        $task_connection = new AsyncTcpConnection('Text://127.0.0.1:12345');
        //                       $task_connection->connect();
        // 发送数据
        $task_connection->send(json_encode($taskData));
        // 异步获得结果
        $task_connection->onMessage = function(AsyncTcpConnection $task_connection, $task_result) {
            // 执行结果
                var_dump($task_result);
            // 获得结果后记得关闭异步连接
                $task_connection->close();
            };
        });
    }
}

// task worker,使用Text协议
$task_worker = new Worker('Text://0.0.0.0:12345');
// task进程数可以根据需要多开一些
$task_worker->count = 1;
// task进程名称
$task_worker->name = 'TaskWorker';
$task_worker->onWorkerStart = function(Worker $worker)
{
    echo "Worker starting...\n";
};
$task_worker->onConnect = function($connection)
{
    echo "new connection from ip " . $connection->getRemoteIp() . "\n";
};
// 设置业务处理函数
$task_worker->onMessage = function($connection, $task_data)
{
    // 假设发来的是json数据
    $task_data = json_decode($task_data, true);
    trace([$task_data,'msg'=>'发送后'],'crontab');
    // 根据task_data处理相应的任务逻辑.... 得到结果,这里省略....
    $task_result = 'done';
    // 发送结果
    $connection->send(json_encode($task_result));
};
421 1 0
1个回答

walkor 打赏

$task_connection->connect(); 为什么被注释了?

×
🔝