1

我已经检查了有关此问题的多个答案,但似乎没有适当的解决方案。我正在解雇一份工作,它在模式下运行良好,但在驱动程序sync中根本不工作。database

队列.php

'default' => env('QUEUE_CONNECTION', 'sync'),

.env

QUEUE_DRIVER=database

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

SendNotifications::dispatch(array("message" => "test"))->onConnection('database');

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

php artisan queue:work database

当我解雇这份工作时,它会被写入jobs表格,几秒钟后,它会变成processed. 问题是:它没有开火。如果我删除onConnection('database')它,它可以在sync没有任何问题的模式下工作。

class SendNotifications implements ShouldQueue {

 public function __construct(){
 }

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

}

里面的例子handle()

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);
              }
            }
          }

发送消息API

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 在本地主机上运行它。任何想法为什么它实际上没有发射?我检查了payload数据库表中的列jobs,它是正确的。

4

1 回答 1

2

首先,您需要在文件中使用QUEUE_CONNECTIONnot 。这应该消除对数据库的需求并使数据库成为您的默认值。如果要强制单个作业运行同步,可以使用.QUEUE_DRIVER.envonConnection('database')dispatch_now

你能扩大“不开火”吗?您说它会在几秒钟后得到处理,那么这项工作是根本没有被接走还是没有按预期运行?这份工作是否failed_jobs上桌?

另一个需要注意的重要事项是,如果您更改示例中的作业类,则必须重新启动队列工作程序。SendNotifications工人不一定会重新阅读课程,并且可能正在使用较旧或不正确的课程。对于本地测试,我建议queue:listen或者探索这个--once论点。https://laravel.com/docs/8.x/queues#the-queue-work-command

于 2021-03-19T00:02:23.427 回答