1 | <?php |
||
14 | class SqsDriver extends AbstractPrefetchDriver |
||
15 | { |
||
16 | protected $sqs; |
||
17 | protected $queueUrls; |
||
18 | |||
19 | /** |
||
20 | * @param SqsClient $sqs |
||
21 | * @param array $queueUrls |
||
22 | * @param int|null $prefetch |
||
23 | */ |
||
24 | public function __construct(SqsClient $sqs, array $queueUrls = [], $prefetch = null) |
||
25 | { |
||
26 | parent::__construct($prefetch); |
||
27 | |||
28 | $this->sqs = $sqs; |
||
29 | $this->queueUrls = $queueUrls; |
||
30 | } |
||
31 | |||
32 | /** |
||
33 | * {@inheritdoc} |
||
34 | */ |
||
35 | public function listQueues() |
||
54 | |||
55 | /** |
||
56 | * {@inheritdoc} |
||
57 | */ |
||
58 | public function createQueue($queueName) |
||
61 | |||
62 | /** |
||
63 | * {@inheritdoc} |
||
64 | */ |
||
65 | public function countMessages($queueName) |
||
66 | { |
||
67 | $queueUrl = $this->resolveUrl($queueName); |
||
68 | |||
69 | $result = $this->sqs->getQueueAttributes([ |
||
70 | 'QueueUrl' => $queueUrl, |
||
71 | 'AttributeNames' => ['ApproximateNumberOfMessages'], |
||
72 | ]); |
||
73 | |||
74 | if (isset($result['Attributes']['ApproximateNumberOfMessages'])) { |
||
75 | return $result['Attributes']['ApproximateNumberOfMessages']; |
||
76 | } |
||
77 | |||
78 | return 0; |
||
79 | } |
||
80 | |||
81 | /** |
||
82 | * {@inheritdoc} |
||
83 | */ |
||
84 | public function pushMessage($queueName, $message) |
||
85 | { |
||
86 | $queueUrl = $this->resolveUrl($queueName); |
||
87 | |||
88 | $this->sqs->sendMessage([ |
||
89 | 'QueueUrl' => $queueUrl, |
||
90 | 'MessageBody' => $message, |
||
91 | ]); |
||
92 | } |
||
93 | |||
94 | /** |
||
95 | * {@inheritdoc} |
||
96 | */ |
||
97 | public function popMessage($queueName, $duration = 5) |
||
98 | { |
||
99 | if ($message = $this->cache->pop($queueName)) { |
||
100 | return $message; |
||
101 | } |
||
102 | |||
103 | $queueUrl = $this->resolveUrl($queueName); |
||
104 | |||
105 | $result = $this->sqs->receiveMessage([ |
||
106 | 'QueueUrl' => $queueUrl, |
||
107 | 'MaxNumberOfMessages' => $this->prefetch, |
||
108 | 'WaitTimeSeconds' => $duration, |
||
109 | ]); |
||
110 | |||
111 | if (!$result || !$messages = $result->get('Messages')) { |
||
112 | return [null, null]; |
||
113 | } |
||
114 | |||
115 | foreach ($messages as $message) { |
||
116 | $this->cache->push($queueName, [$message['Body'], $message['ReceiptHandle']]); |
||
117 | } |
||
118 | |||
119 | return $this->cache->pop($queueName); |
||
120 | } |
||
121 | |||
122 | /** |
||
123 | * {@inheritdoc} |
||
124 | */ |
||
125 | public function acknowledgeMessage($queueName, $receipt) |
||
126 | { |
||
127 | $queueUrl = $this->resolveUrl($queueName); |
||
128 | |||
129 | $this->sqs->deleteMessage([ |
||
130 | 'QueueUrl' => $queueUrl, |
||
131 | 'ReceiptHandle' => $receipt, |
||
132 | ]); |
||
133 | } |
||
134 | |||
135 | /** |
||
136 | * {@inheritdoc} |
||
137 | */ |
||
138 | public function peekQueue($queueName, $index = 0, $limit = 20) |
||
142 | |||
143 | /** |
||
144 | * {@inheritdoc} |
||
145 | */ |
||
146 | public function removeQueue($queueName) |
||
149 | |||
150 | /** |
||
151 | * {@inheritdoc} |
||
152 | */ |
||
153 | public function info() |
||
154 | { |
||
155 | return [ |
||
156 | 'prefetch' => $this->prefetch, |
||
157 | ]; |
||
158 | } |
||
159 | |||
160 | /** |
||
161 | * AWS works with queue URLs rather than queue names. Returns either queue URL (if queue exists) for given name or null if not. |
||
162 | * |
||
163 | * @param string $queueName |
||
164 | * |
||
165 | * @return mixed |
||
166 | * |
||
167 | * @throws SqsException |
||
168 | */ |
||
169 | protected function resolveUrl($queueName) |
||
183 | } |
||
184 |