@@ -2129,6 +2129,71 @@ That's it! You can now consume each transport:
2129
2129
If a handler does *not * have ``from_transport `` config, it will be executed
2130
2130
on *every * transport that the message is received from.
2131
2131
2132
+ Process Messages by Batches
2133
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~
2134
+
2135
+ You can declare "special" handlers which will process messages by batch.
2136
+ By doing so, the handler will wait for a certain amount of messages to be
2137
+ pending before processing them. The declaration of a batch handler is done
2138
+ by implementing
2139
+ :class: `Symfony\\ Component\\ Messenger\\ Handler\\ BatchHandlerInterface `. The
2140
+ :class: `Symfony\\ Component\\ Messenger\\ Handler\\ BatchHandlerTrait ` is also
2141
+ provided in order to ease the declaration of these special handlers::
2142
+
2143
+ use Symfony\Component\Messenger\Handler\Acknowledger;
2144
+ use Symfony\Component\Messenger\Handler\BatchHandlerInterface;
2145
+ use Symfony\Component\Messenger\Handler\BatchHandlerTrait;
2146
+
2147
+ class MyBatchHandler implements BatchHandlerInterface
2148
+ {
2149
+ use BatchHandlerTrait;
2150
+
2151
+ public function __invoke(MyMessage $message, Acknowledger $ack = null)
2152
+ {
2153
+ return $this->handle($message, $ack);
2154
+ }
2155
+
2156
+ private function process(array $jobs): void
2157
+ {
2158
+ foreach ($jobs as [$message, $ack]) {
2159
+ try {
2160
+ // Compute $result from $message...
2161
+
2162
+ // Acknowledge the processing of the message
2163
+ $ack->ack($result);
2164
+ } catch (\Throwable $e) {
2165
+ $ack->nack($e);
2166
+ }
2167
+ }
2168
+ }
2169
+
2170
+ // Optionally, you can redefine the `shouldFlush()` method
2171
+ // of the trait to define your own batch size
2172
+ private function shouldFlush(): bool
2173
+ {
2174
+ return 100 <= \count($this->jobs);
2175
+ }
2176
+ }
2177
+
2178
+ .. note ::
2179
+
2180
+ When the ``$ack `` argument of ``__invoke() `` is ``null ``, the message is
2181
+ expected to be handled synchronously. Otherwise, ``__invoke() `` is
2182
+ expected to return the number of pending messages. The
2183
+ :class: `Symfony\\ Component\\ Messenger\\ Handler\\ BatchHandlerTrait ` handles
2184
+ this for you.
2185
+
2186
+ .. note ::
2187
+
2188
+ By default, pending batches are flushed when the worker is idle as well
2189
+ as when it is stopped.
2190
+
2191
+ .. versionadded :: 5.4
2192
+
2193
+ :class: `Symfony\\ Component\\ Messenger\\ Handler\\ BatchHandlerInterface ` and
2194
+ :class: `Symfony\\ Component\\ Messenger\\ Handler\\ BatchHandlerTrait ` were
2195
+ introduced in Symfony 5.4.
2196
+
2132
2197
Extending Messenger
2133
2198
-------------------
2134
2199
0 commit comments