Skip to content

Commit 46953c9

Browse files
committed
Support dispatch
1 parent 9ebad2d commit 46953c9

File tree

11 files changed

+149
-22
lines changed

11 files changed

+149
-22
lines changed

README.md

Lines changed: 19 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ Also you can set Qless queue as default in `config/queue.php`
3131
'default' => env('QUEUE_DRIVER', 'qless'),
3232
```
3333

34-
And redis connection in `config/database.php`
34+
Redis connection in `config/database.php`
3535

3636
```php
3737
'redis' => [
@@ -49,6 +49,23 @@ And redis connection in `config/database.php`
4949
],
5050
```
5151

52+
And add Laravel Qless service provider to app.php
53+
54+
```php
55+
<?php
56+
57+
return [
58+
//...
59+
'providers' => [
60+
//...
61+
/**
62+
* Qless
63+
*/
64+
LaravelQless\LaravelQlessServiceProvider::class,
65+
]
66+
];
67+
```
68+
5269
## Usage
5370

5471
Once you completed the configuration you can use Laravel Queue API. If you used other queue drivers you do not need to change anything else. If you do not know how to use Queue API, please refer to the official Laravel documentation: http://laravel.com/docs/queues
@@ -80,7 +97,7 @@ Than you can put job to all subscribers.
8097
/**
8198
* Put job to few queues
8299
*/
83-
\Queue::pushToSubscriber('this.is.test', TestQless::class, ['test' => 'test']);
100+
\Queue::pushToTopic('this.is.test', TestQless::class, ['test' => 'test']);
84101
// Push job to queue1 and queue2, but not to queue3
85102

86103
```

config/queue.php

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,12 @@
11
<?php
22

33
return [
4+
'default' => 'qless',
5+
46
'connections' => [
57
'qless' => [
68
'driver' => 'qless',
7-
'connection' => 'default',
9+
'connection' => 'qless',
810
'queue' => 'default',
911
'redis_connection' => 'qless',
1012
],

examples/Job/ExampleJob.php

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,11 @@
22

33
namespace LaravelQless\Examples\Job;
44

5-
use LaravelQless\Contracts\QlessJob;
5+
use LaravelQless\Job\AbstractJob;
66
use Qless\Jobs\BaseJob;
77

8-
class ExampleJob implements QlessJob
8+
class ExampleJob extends AbstractJob
99
{
10-
1110
/**
1211
* Execute the job.
1312
*

src/Job/AbstractJob.php

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
<?php
2+
3+
namespace LaravelQless\Job;
4+
5+
use Illuminate\Bus\Queueable;
6+
use Illuminate\Contracts\Queue\ShouldQueue;
7+
use Illuminate\Contracts\Support\Arrayable;
8+
use Illuminate\Foundation\Bus\Dispatchable;
9+
use Qless\Jobs\BaseJob;
10+
use LaravelQless\Contracts\QlessJob;
11+
12+
/**
13+
* Class AbstractJob
14+
* @package LaravelQless\Job
15+
*/
16+
abstract class AbstractJob implements QlessJob, ShouldQueue, Arrayable
17+
{
18+
use Dispatchable, Queueable;
19+
/**
20+
* @var array
21+
*/
22+
protected $data = [];
23+
24+
public function __construct(array $data = [])
25+
{
26+
$this->data = $data;
27+
}
28+
29+
/**
30+
* @param BaseJob $job
31+
* @return mixed
32+
*/
33+
abstract public function perform(BaseJob $job);
34+
35+
/**
36+
* @return array
37+
*/
38+
public function toArray(): array
39+
{
40+
return (array) $this->data;
41+
}
42+
}

src/Queue/QlessConnector.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ class QlessConnector implements ConnectorInterface
2121
*/
2222
public function connect(array $config): QlessQueue
2323
{
24-
$redisConnection = array_get($config, 'redis_connection', 'default');
24+
$redisConnection = array_get($config, 'redis_connection', 'qless');
2525

2626
$redisConfig = Config::get('database.redis.' . $redisConnection, []);
2727

src/Queue/QlessQueue.php

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -101,7 +101,7 @@ public function pushRaw($payload, $queueName = null, array $options = [])
101101
*/
102102
public function push($job, $data = '', $queueName = null)
103103
{
104-
return $this->pushRaw($this->makePayload($job, $data), $queueName);
104+
return $this->pushRaw($this->makePayload($job, (array) $data), $queueName);
105105
}
106106

107107
/**
@@ -240,19 +240,26 @@ public function pushToTopic(string $topicName, string $job, array $data = [], ar
240240
}
241241

242242
/**
243-
* @param string $job
243+
* @param string|object $job
244244
* @param mixed|string $data
245245
* @param array $options
246246
* @return string
247247
*/
248-
protected function makePayload(string $job, $data, $options = []): string
248+
protected function makePayload($job, $data = [], $options = []): string
249249
{
250+
if (is_object($job)) {
251+
$displayName = get_class($job);
252+
$data = array_merge($job->toArray(), $data);
253+
} else {
254+
$displayName = explode('@', $job)[0];
255+
}
256+
250257
$qlessOptions = $data[self::JOB_OPTIONS_KEY] ?? [];
251258
$data[self::JOB_OPTIONS_KEY] = array_merge($qlessOptions, $options);
252259

253260
$payload = json_encode([
254-
'displayName' => explode('@', $job)[0],
255-
'job' => $job,
261+
'displayName' => $displayName,
262+
'job' => is_string($job) ? $job : $displayName,
256263
'data' => $data,
257264
]);
258265

tests/Queue/QlessConnectorTest.php renamed to tests/Queue/ConnectorTest.php

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
use LaravelQless\Queue\QlessConnector;
99
use LaravelQless\Queue\QlessQueue;
1010

11-
class QlessConnectorTest extends TestCase
11+
class ConnectorTest extends TestCase
1212
{
1313
public function testShouldImplementConnectorInterface()
1414
{
@@ -20,7 +20,8 @@ public function testConnect()
2020
{
2121
$connector = new QlessConnector();
2222
$queue = $connector->connect([
23-
'redis_connection' => 'qless'
23+
'redis_connection' => 'qless',
24+
'connection' => 'qless',
2425
]);
2526
$this->assertInstanceOf(QlessQueue::class, $queue);
2627
}

tests/Queue/HandlerTest.php

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,8 @@ protected function getQueue()
3030
'port' => REDIS_PORT,
3131
]),
3232
[
33-
'queue' => 'test_qless_queue'
33+
'queue' => 'test_qless_queue',
34+
'connection' => 'qless',
3435
]
3536
);
3637

tests/Queue/Job.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,10 @@
22

33
namespace LaravelQless\Tests\Queue;
44

5-
use LaravelQless\Contracts\QlessJob;
5+
use LaravelQless\Job\AbstractJob;
66
use Qless\Jobs\BaseJob;
77

8-
class Job implements QlessJob
8+
class Job extends AbstractJob
99
{
1010
public function perform(BaseJob $job)
1111
{

tests/Queue/QlessQueueTest.php renamed to tests/Queue/QueueTest.php

Lines changed: 59 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,16 +2,18 @@
22

33
namespace LaravelQless\Tests\Queue;
44

5+
use Illuminate\Queue\QueueManager;
56
use LaravelQless\Contracts\JobHandler;
67
use LaravelQless\Handler\DefaultHandler;
78
use LaravelQless\Job\QlessJob;
9+
use LaravelQless\Queue\QlessConnector;
810
use LaravelQless\Queue\QlessQueue;
911
use Orchestra\Testbench\TestCase;
1012
use Illuminate\Contracts\Queue\Queue as QueueContract;
1113
use Illuminate\Queue\Queue;
1214
use Qless\Client;
1315

14-
class QlessQueueTest extends TestCase
16+
class QueueTest extends TestCase
1517
{
1618
/**
1719
* @throws \ReflectionException
@@ -173,6 +175,30 @@ public function testJobOptions()
173175
$this->assertEquals(['tag1', 'tag_second'], $job->getData()['tags']);
174176
}
175177

178+
public function testDispatchJob()
179+
{
180+
$this->setEnv();
181+
182+
$queueName = str_random();
183+
184+
$job = new Job(['dispatch' => 'work']);
185+
186+
$dispatch = dispatch($job)->onQueue($queueName)->onConnection('qless');
187+
unset($dispatch);
188+
189+
$queue = $this->getQueue();
190+
191+
$job = $queue->pop($queueName);
192+
193+
$this->assertNotEmpty($job);
194+
195+
$job->fire();
196+
197+
$data = $job->getData();
198+
199+
$this->assertEquals('work', $data['dispatch']);
200+
}
201+
176202
protected function getQueue()
177203
{
178204
$queue = new QlessQueue(
@@ -181,7 +207,8 @@ protected function getQueue()
181207
'port' => REDIS_PORT,
182208
]),
183209
[
184-
'queue' => 'test_qless_queue'
210+
'queue' => 'test_qless_queue',
211+
'connection' => 'qless',
185212
]
186213
);
187214

@@ -190,6 +217,36 @@ protected function getQueue()
190217
return $queue;
191218
}
192219

220+
221+
protected function setEnv()
222+
{
223+
$this->app['config']->set('queue.default', 'qless');
224+
$qlessConfig = [
225+
'driver' => 'qless',
226+
'connection' => 'qless',
227+
'queue' => 'default',
228+
'redis_connection' => 'qless',
229+
];
230+
$this->app['config']->set('queue.connections.qless', $qlessConfig);
231+
232+
$redisConfig = [
233+
'host' => REDIS_HOST,
234+
'password' => null,
235+
'port' => REDIS_PORT,
236+
'database' => 0,
237+
];
238+
239+
$this->app['config']->set('database.redis.qless', $redisConfig);
240+
241+
$queueManager = new QueueManager($this->app);
242+
$queueManager->addConnector('qless', function () {
243+
return new QlessConnector;
244+
});
245+
$queueManager->setDefaultDriver('qless');
246+
247+
$this->app['queue'] = $queueManager;
248+
}
249+
193250
protected function getApplicationProviders($app)
194251
{
195252
$app->bind(JobHandler::class, DefaultHandler::class);

0 commit comments

Comments
 (0)