Skip to content

[Messenger] Fix message handlers with multiple from_transports #52693

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged

Conversation

valtzu
Copy link
Contributor

@valtzu valtzu commented Nov 22, 2023

Q A
Branch? 6.3
Bug fix? yes
New feature? no
Deprecations? no
Issues Fix #48529
License MIT

When you define multiple AsMessageHandler attributes or messenger.message_handler tags with otherwise same definitions but with different transports, the last definition overwrites all previous ones, despite debug:messenger showing it correctly:

 The following messages can be dispatched:

 -------------------------------------------------------------------------------------------------------------------- 
  App\Message\TriggeringMessage                                                                                       
      handled by App\MessageHandler\TriggeringMessageHandler (when from_transport=a)                                  
      handled by App\MessageHandler\TriggeringMessageHandler (when from_transport=b)                                  
      handled by App\MessageHandler\TriggeringMessageHandler (when method=handleTriggeringMessage, from_transport=a)  
      handled by App\MessageHandler\TriggeringMessageHandler (when method=handleTriggeringMessage, from_transport=b)  

Example code:

#[AsMessageHandler(fromTransport: 'a', handles: TriggeringMessage::class)]
#[AsMessageHandler(fromTransport: 'b', handles: TriggeringMessage::class)]
class TriggeringMessageHandler
{
    public function __invoke(): void
    {
        echo __FUNCTION__."\n";
    }

    #[AsMessageHandler(fromTransport: 'a', handles: TriggeringMessage::class)]
    #[AsMessageHandler(fromTransport: 'b', handles: TriggeringMessage::class)]
    public function handleTriggeringMessage(): void
    {
        echo __FUNCTION__."\n";
    }
}

When sending a TriggeringMessage to both a & b transports, I get following bin/console messenger:consume a b output on 6.3:

[critical] Error thrown while handling message App\Message\TriggeringMessage. Removing from transport after 0 retries. Error: "No handler for message "App\Message\TriggeringMessage"."
__invoke
handleTriggeringMessage

And with this fix:

__invoke
handleTriggeringMessage
__invoke
handleTriggeringMessage

@valtzu valtzu force-pushed the messenger-multiple-from-transports-fix branch from 736b017 to bff3cc1 Compare November 22, 2023 19:13
@OskarStark OskarStark changed the title [Messenger] Fix message handlers with multiple from_transports [Messenger] Fix message handlers with multiple from_transports Nov 23, 2023
@nicolas-grekas
Copy link
Member

Thank you @valtzu.

@nicolas-grekas nicolas-grekas merged commit bf01d35 into symfony:6.3 Nov 24, 2023
This was referenced Nov 26, 2023
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants