Skip to content

Commit 59d7b75

Browse files
committed
Handle unresolved handlers via failure pipeline in Worker
1 parent e11d8a0 commit 59d7b75

2 files changed

Lines changed: 32 additions & 3 deletions

File tree

src/Worker/Worker.php

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -42,11 +42,10 @@ public function process(
4242
$this->logger->info('Processing message #{message}.', ['message' => $messageId]);
4343
}
4444

45-
$handler = $this->handlerResolver->resolve($message->getType());
46-
4745
$request = new ConsumeRequest($message, $queueName);
48-
$finishHandler = new ConsumeFinalHandler($handler->handle(...));
4946
try {
47+
$handler = $this->handlerResolver->resolve($message->getType());
48+
$finishHandler = new ConsumeFinalHandler($handler->handle(...));
5049
return $this->consumeMiddlewareDispatcher->dispatch($request, $finishHandler)->getMessage();
5150
} catch (Throwable $exception) {
5251
$request = new FailureHandlingRequest($request->getMessage(), $exception, $request->getQueueName(), $retryProducer);

tests/Unit/WorkerTest.php

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
use Yiisoft\Test\Support\Container\SimpleContainer;
1111
use Yiisoft\Test\Support\Log\SimpleLogger;
1212
use Yiisoft\Queue\Exception\MessageFailureException;
13+
use Yiisoft\Queue\Message\Handler\HandlerNotFoundException;
1314
use Yiisoft\Queue\Message\Handler\HandlerResolver;
1415
use Yiisoft\Queue\Message\GenericMessage;
1516
use Yiisoft\Queue\Message\MessageInterface;
@@ -108,6 +109,35 @@ public function testMessageFailureIsHandledSuccessfully(): void
108109
self::assertSame($finalMessage, $result);
109110
}
110111

112+
public function testUnresolvableHandlerIsHandledByFailurePipeline(): void
113+
{
114+
$message = new GenericMessage('unsupported', null);
115+
$queueName = 'test-queue';
116+
$handlerResolver = new HandlerResolver([], new SimpleContainer());
117+
118+
$finalMessage = new GenericMessage('final', null);
119+
/** @var FailureMiddlewareInterface&MockObject $failureMiddleware */
120+
$failureMiddleware = $this->createMock(FailureMiddlewareInterface::class);
121+
$failureMiddleware
122+
->expects(self::once())
123+
->method('processFailure')
124+
->with(self::callback(
125+
static fn(FailureHandlingRequest $request): bool => $request->getException() instanceof HandlerNotFoundException,
126+
))
127+
->willReturn(new FailureHandlingRequest($finalMessage, new RuntimeException('unused'), $queueName));
128+
129+
/** @var FailureMiddlewareFactoryInterface&MockObject $failureMiddlewareFactory */
130+
$failureMiddlewareFactory = $this->createMock(FailureMiddlewareFactoryInterface::class);
131+
$failureMiddlewareFactory->method('createFailureMiddleware')->willReturn($failureMiddleware);
132+
$failureDispatcher = new FailureMiddlewareDispatcher($failureMiddlewareFactory, [$queueName => ['simple']]);
133+
134+
$worker = $this->createWorkerByParams($handlerResolver, failureMiddlewareDispatcher: $failureDispatcher);
135+
136+
$result = $worker->process($message, $queueName);
137+
138+
self::assertSame($finalMessage, $result);
139+
}
140+
111141
private function createHandlerResolver(MessageInterface $message, callable $handler): HandlerResolver
112142
{
113143
$container = new SimpleContainer();

0 commit comments

Comments
 (0)