问题标签 [symfony-messenger]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
40 浏览

orocrm - OroCRM - 如何使用 Symfony Messenger 组件

我们使用 oro/crm 4.1.0 版本,在这个版本中核心团队开始使用 symfony 4.4.2 版本和 symfony/symfony 包(包括 symfony/messenger)。但是信使组件没有被使用。例如,没有 config/package/messenger.yml 文件,我无法将 messenger 块添加到 config.yml。也许我看错了一些东西,但是我怎样才能连接和使用这个组件呢?

0 投票
1 回答
1494 浏览

php - Symfony MessageHandler 计算消息被发送的次数

我正在使用 Symfony Messenger,我想继续在处理程序中发送消息,直到它被发送多次。

我怎样才能跟踪它?

到目前为止,这是我的处理程序类的代码:

0 投票
1 回答
405 浏览

php - 如何在信封中设置事件名称和延迟时间?

我正在使用 symfony 4 + enqueue ( https://github.com/sroze/messenger-enqueue-transport + https://packagist.org/packages/enqueue/pheanstalk ) 在 beanstalk 中运行异步作业。

现在我有:

但我希望在延迟后处理这项工作。

文档让我像这样重构它:

这里的问题是我看不到在哪里放置事件的名称(article.publish

(基于https://github.com/sroze/messenger-enqueue-transport#setting-custom-configuration-on-your-message

0 投票
1 回答
2057 浏览

php - Symfony 信使队列与绑定键 - 重试策略

我正在为我工​​作的公司实施信使。我发现路由键有问题。

我想将一条消息发送到两个队列。另外两个应用程序将处理此队列。一切正常,但是当处理程序抛出异常时我发现了问题。它将消息发送一到两个重试队列,因为重试队列通过绑定键匹配,这对于这个队列是相同的。

最后重试了 3 次,我的 dlqs 上有 16 条消息。你能帮我解决这个问题吗?是否可以基于队列而不是路由键创建重试策略?

我的配置看起来像:

我用这样的邮票发送事件:

处理程序:

我在兔子身上发现的: 兔子

现在我正在尝试这样的配置:

并使用两个正在运行的控制台命令:

但它的工作原理是一样的。

0 投票
2 回答
2489 浏览

redis - 处理成功后如何删除redis流

我在 Messenger 中使用 redis 作为传输,我认为在处理流程后删除是自动的,但可惜不是。处理成功后,我不知道如何删除重复流。

我使用 symfony 4.4.latest 和 redis server 6.0

谢谢

0 投票
2 回答
1394 浏览

php - symfony messenger 可以“批量”处理消息吗

我想知道,因为我在 symfony 或其他资源上找不到任何东西,如果 php 的 symfony/messenger 可以使用任何异步传输处理“批量”消息。

例如。从总线上抓取 20 条消息,处理这 20 条消息,然后确认或拒绝任何消息。

我知道 RabbitMQ 具有从队列中获取 n 条消息的功能,并在一次运行中处理所有消息。在某些情况下,这将比扩展异步工作线程具有更好的性能。

有没有人有任何线索、资源或经验?还是我试图通过违背 symfony/messenger 的想法来解决问题?

[更新]

我知道批量消息不是(异步)消息传递概念的一部分。应单独处理每条消息。但是一些消息代理已经实现了一项功能,可以从队列中“获取”X 条消息并处理它们(通过发送确认或拒绝,或其他方式)。我知道在一次迭代中处理多条消息会增加任何消费者的复杂性,但在某些情况下它会提高性能。

我已经多次使用在一次迭代中使用多个消息的概念,但从未使用 php 的 symfony/messenger。

0 投票
1 回答
247 浏览

php - 如何避免在 Symfony Messenger 中处理来自“子”类的消息?

我想我在文档中遗漏了一些东西,但问题很简单。

假设我有一条关于 class 的消息,MessageOne并且MessageTwoextends MessageOne

我也有MessageOneHandler哪个应该处理MessageOne

并且MessageTwoHandler应该只处理MessageTwo

问题是何时MessageTwo调度它由MessageHandlerOne和处理MessageHandlerTwo。是的,由于继承,这是完全明智的,一切在逻辑上都是正确的,但是有什么“symfony”方法可以防止这种情况发生吗?

当然,我可以通过重做这些类的继承来解决这个问题,但是有没有更好的方法呢?

此外debug:messenger,按预期显示所有内容,每个消息类一个处理程序,没有继承问题。

0 投票
0 回答
867 浏览

php - Symfony 4 Messenger 问题

我在信使组件上遇到问题,

我有两个消息类和两个处理程序,当我执行

我得到这些结果:

结果一

结果二

正如您在两个结果中看到的那样,我每次都有不同的处理程序(DeliveryMQHandlerOrderMQHandler),但我需要两者。

如果有人知道这是我的信使配置文件:

DeliveryMQHandler :

OrderMQHandler :

消息类太大而无法在此处显示,但它们实现得很好,我很确定它们不是问题,因为getContent()方法结果每次都可以。

自动装配属性在 services.yml 中设置为 true 当我执行以下命令时,不同的类被很好地列出:php bin/console debug:container

最后是错误的堆栈跟踪php bin/console messenger:consume -vvv堆栈跟踪

编辑: 两个类的结构=> OrderMQ 类:

DeliveryMQ 类:

0 投票
1 回答
2298 浏览

symfony - Symfony5 messenger,相同消息处理程序的并行队列

Symfony 信使:

https://symfony.com/doc/current/messenger.html

问题:

Pool#1 =(user1创建一个JobJob拆分为 10 个信使Message
Pool#2 =(user2创建一个JobJob拆分为 10 个信使Message
...
Pool#100 =(user100创建一个JobJob拆分为 10 个信使Message

Pool#100 将不会被执行,直到所有先前的 Pool 都不会完成。

目标:

我需要并行队列,所有池都将单独运行,因此每个池都有个人队列。

代码示例:

配置/包/messenger.yaml src/消息/Job.php src/MessageHandler/JobHandler.php src/Controller/JobController.php

更多信息:

我想继续使用它,但找不到最简单的解决方案来传递一些唯一的队列名称或 ID,然后告诉工人他必须只处理这个 Pool of Messages.
我找到了自定义传输https://symfony.com/doc/current/messenger/custom-transport.html,但我不确定它是否有帮助。至少我认为只有定制运输是不够的。
我阅读了有关Actor models https://www.brianstorti.com/the-actor-model/的信息,但如果可能的话,我只想使用 Messenger+Redis。

可能这里没有解决方案,这个信使还不能处理并行队列。无论如何,我很高兴得到任何帮助。
谢谢!

0 投票
0 回答
230 浏览

php - 当第一个发生错误时,symfony messenger 中两个不同总线之间的事务分离

假设我们有以下代码:

两辆公共汽车都设置了 DoctrineTransactionMiddleware。让我们假设在处理过程中messageBus我们坚持一些实体但发生异常 -DoctrineTransactionMiddleware在这种情况下提供回滚事务,所以稍后我们进入上述代码中的 catch 块。一切都处理得很好,因此在eventBus中创建的事务已eventBus成功提交,但 entityManager 也有在此期间持久存在的实体messageBus- 所以最后这些实体也被保存到数据库中,这是不需要的行为。

我在学说文档中读过

当使用显式事务划分并发生异常时,应立即回滚事务并通过调用 EntityManager#close() 关闭 EntityManager

DoctrineTransactionMiddleware 没有这样做——我必须在执行调度close()之前在 catch 块中显式执行方法——然后我从. 也许我理解错了这个想法,它就像那个 OR DoctrineMiddleware 错过了执行 close() 方法。IMO DoctrineTransactionMiddleware 应该在没有开发人员干预的情况下提供这样的执行。eventBusmessageBus