在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));
};
$task_connection->connect(); 为什么被注释了?
https://www.workerman.net/doc/workerman/faq/async-task.html,参考的如何实现异步任务文档写法,文档中send数据前并没有调用connect方法
建议先拷贝代码测试,测试没问题再自定义代码,这样好找问题
不好意思自己漏看了。再请教一个问题:比如启动100个task进程,和task建立连接时有什么调度策略吗?是优先连接空闲的进程还是随机连接的?
连空闲的