refactor: Workerman 消费改用 Laravel Queue Worker,database/redis 统一支持(实测 redis 消费通过);默认消费 default,ai 队列;WORKERMAN_QUEUES/MAX_TRIES/TIMEOUT 配置;2 个队列消费测试

This commit is contained in:
ak
2026-08-11 19:27:43 +08:00
parent 34ea046906
commit 1c8a801238
16 changed files with 164 additions and 54 deletions
+74
View File
@@ -0,0 +1,74 @@
<?php
namespace Tests\Feature;
use Tests\Fixtures\PingJob;
use Illuminate\Contracts\Debug\ExceptionHandler;
use Illuminate\Foundation\Testing\RefreshDatabase;
use Illuminate\Queue\Worker as QueueWorker;
use Illuminate\Queue\WorkerOptions;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Log;
use Tests\TestCase;
class WorkermanQueueTest extends TestCase
{
use RefreshDatabase;
/**
* Workerman 消费者复用 Laravel Queue Worker:验证能真实消费 database 队列任务。
*/
public function test_worker_consumes_database_job(): void
{
config(['queue.default' => 'database']);
Log::spy();
dispatch(new PingJob);
$this->assertSame(1, DB::table('jobs')->count());
$this->runWorkerOnce('database', 'default');
$this->assertSame(0, DB::table('jobs')->count());
Log::shouldHaveReceived('info')->withArgs(fn ($message) => str_contains($message, 'WM_PING_CONSUMED'));
}
/**
* 多队列(default,ai)支持:ai 队列任务也能被消费。
*/
public function test_worker_consumes_multiple_queues(): void
{
config(['queue.default' => 'database']);
Log::spy();
dispatch((new PingJob)->onQueue('ai'));
$this->runWorkerOnce('database', 'default,ai');
$this->assertSame(0, DB::table('jobs')->count());
Log::shouldHaveReceived('info')->withArgs(fn ($message) => str_contains($message, 'WM_PING_CONSUMED'));
}
private function runWorkerOnce(string $connection, string $queues): void
{
$worker = new QueueWorker(
app('queue'),
app('events'),
app(ExceptionHandler::class),
fn () => app()->isDownForMaintenance(),
);
$options = new WorkerOptions(
name: 'laralog-test',
backoff: 0,
memory: 128,
timeout: 30,
sleep: 0,
maxTries: 2,
);
$worker->runNextJob($connection, $queues, $options);
}
}