首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >拉威尔的工作正在处理,但什么也不做

拉威尔的工作正在处理,但什么也不做
EN

Stack Overflow用户
提问于 2021-03-18 20:31:30
回答 1查看 2.7K关注 0票数 1

我已经核对了关于这个问题的多个答案,但似乎没有一个正确的解决办法。我正在启动一个作业,它在sync模式下工作得很好,但在database驱动程序中却完全不工作。

queue.php

代码语言:javascript
运行
复制
'default' => env('QUEUE_CONNECTION', 'sync'),

.env

代码语言:javascript
运行
复制
QUEUE_DRIVER=database

我是如何解雇这份工作的。我试着删除onConnection('database'),但是它会在sync驱动程序上运行

代码语言:javascript
运行
复制
SendNotifications::dispatch(array("message" => "test"))->onConnection('database');

我正在执行以下命令来侦听

代码语言:javascript
运行
复制
php artisan queue:work database

当我启动作业时,它会被写入jobs表中,几秒钟后,它就会得到processed。问题是:这不是开火。如果我删除onConnection('database'),它可以在sync模式下工作,没有任何问题。

代码语言:javascript
运行
复制
class SendNotifications implements ShouldQueue {

 public function __construct(){
 }

public function handle(){
   // here i'm connecting to a notifications api
 }

}

handle()内部的示例

代码语言:javascript
运行
复制
if($this->event_name === "example"){
            $room = $this->getRoomByID($example_id_variable); // database_call
            if(empty($room) === true) {
              return;
            }
            $notify_receivers = getBlabla(); //get the receivers from the database (complex query)
            if(empty($notify_receivers) === false){
              foreach($notify_receivers as $receiver){
                $this->sendMessageAPI($receiver, $this->payload);
              }
            }
          }

sentMessageAPI

代码语言:javascript
运行
复制
public function sendMessageAPI($id, $payload) {
    $curl = curl_init();

    $post_fields = array(
        "key" => "key",
        "secret" => "secret",
        "channelId" => $id,
        "message" => $payload
    );
    curl_setopt_array($curl, array(
        CURLOPT_URL => "https://www.piesocket.com/api/publish",
        CURLOPT_RETURNTRANSFER => true,
        CURLOPT_CUSTOMREQUEST => "POST",
        CURLOPT_POSTFIELDS => json_encode($post_fields),
        CURLOPT_HTTPHEADER => array(
            "Content-Type: application/json"
        ),
    ));

    $response = curl_exec($curl);
}

我正在使用xampp在本地主机上运行这个程序。知道它为什么不是真的开火吗?我已经检查了数据库表jobs中的jobs列,它是正确的。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-03-19 00:02:23

首先,您需要在您的QUEUE_CONNECTION文件中使用QUEUE_DRIVER而不是QUEUE_DRIVER。这将消除对onConnection('database')的需求,并使数据库成为默认的。如果要强制单个作业运行同步,则可以使用dispatch_now

你能扩展一下“不开火”吗?你说过它在几秒钟后就会被处理,那么任务是根本没有被捡起来,还是只是没有正常工作呢?作业是否进入failed_jobs表?

另外要注意的是,如果您在示例中更改了作业类,那么您必须重新启动队列工作器。工作人员不一定要重读类,而且可能使用的是旧类或错误类。对于本地测试,我建议使用queue:listen或探索--once参数。https://laravel.com/docs/8.x/queues#the-queue-work-command

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66698719

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档