-
Notifications
You must be signed in to change notification settings - Fork 25
Expand file tree
/
Copy pathQueueEvent.php
More file actions
222 lines (189 loc) · 4.77 KB
/
Copy pathQueueEvent.php
File metadata and controls
222 lines (189 loc) · 4.77 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
<?php
declare(strict_types=1);
/**
* This file is part of CodeIgniter Queue.
*
* (c) CodeIgniter Foundation <admin@codeigniter.com>
*
* For the full copyright and license information, please view
* the LICENSE file that was distributed with this source code.
*/
namespace CodeIgniter\Queue\Events;
use CodeIgniter\I18n\Time;
use CodeIgniter\Queue\Entities\QueueJob;
use Throwable;
class QueueEvent
{
private readonly Time $timestamp;
public function __construct(
private readonly string $type,
private readonly string $handler,
private readonly ?string $queue = null,
private readonly array $metadata = [],
?Time $timestamp = null,
) {
$this->timestamp = $timestamp ?? Time::now();
}
/**
* Get event type
*/
public function getType(): string
{
return $this->type;
}
/**
* Get handler name
*/
public function getHandler(): string
{
return $this->handler;
}
/**
* Get queue name
*/
public function getQueue(): ?string
{
return $this->queue;
}
/**
* Get timestamp
*/
public function getTimestamp(): Time
{
return $this->timestamp;
}
/**
* Get all metadata
*/
public function getAllMetadata(): array
{
return $this->metadata;
}
/**
* Get metadata value by key
*/
public function getMetadata(string $key, mixed $default = null): mixed
{
return $this->metadata[$key] ?? $default;
}
/**
* Check if this is a job-related event
*/
public function isJobEvent(): bool
{
return str_starts_with($this->type, 'queue.job.');
}
/**
* Check if this is a worker-related event
*/
public function isWorkerEvent(): bool
{
return str_starts_with($this->type, 'queue.worker.');
}
/**
* Check if this is an operation event (like queue.cleared)
*/
public function isOperationEvent(): bool
{
return str_contains($this->type, 'queue.')
&& ! $this->isJobEvent()
&& ! $this->isWorkerEvent()
&& ! $this->isConnectionEvent();
}
/**
* Check if this is a connection event
*/
public function isConnectionEvent(): bool
{
return str_starts_with($this->type, 'queue.handler.');
}
// Job-related convenience methods (metadata-based)
/**
* Get job ID (for job events)
*/
public function getJobId(): ?int
{
$job = $this->getMetadata('job');
return $job instanceof QueueJob ? $job->id : $this->getMetadata('job_id');
}
/**
* Get job priority (for job events)
*/
public function getPriority(): ?string
{
$job = $this->getMetadata('job');
return $job instanceof QueueJob ? $job->priority : $this->getMetadata('priority');
}
/**
* Get number of attempts (for job events)
*/
public function getAttempts(): ?int
{
$job = $this->getMetadata('job');
return $job instanceof QueueJob ? $job->attempts : $this->getMetadata('attempts');
}
/**
* Get job status (for job events)
*/
public function getStatus(): ?int
{
$job = $this->getMetadata('job');
return $job instanceof QueueJob ? $job->status : $this->getMetadata('status');
}
/**
* Get job class name (for job events)
*/
public function getJobClass(): ?string
{
return $this->getMetadata('job_class');
}
/**
* Get processing time in seconds (for job events)
*/
public function getProcessingTime(): float
{
return (float) $this->getMetadata('processing_time', 0.0);
}
/**
* Get processing time in milliseconds (for job events)
*/
public function getProcessingTimeMs(): int
{
return (int) ($this->getProcessingTime() * 1000);
}
/**
* Get exception (for failed events)
*/
public function getException(): ?Throwable
{
return $this->getMetadata('exception');
}
/**
* Get exception message (for failed events)
*/
public function getExceptionMessage(): ?string
{
$exception = $this->getException();
return $exception?->getMessage();
}
/**
* Check if event has failed
*/
public function hasFailed(): bool
{
return $this->getException() !== null;
}
/**
* Convert to array for serialization
*/
public function toArray(): array
{
return [
'type' => $this->type,
'handler' => $this->handler,
'queue' => $this->queue,
'metadata' => $this->metadata,
'timestamp' => $this->timestamp->toDateTimeString(),
];
}
}