通讯组件
编辑该页面通讯组件
信使组件帮助应用程序发送和接收消息/从其他应用程序或通过消息队列。
组件是极大地受到马提亚Noback系列博客对命令的公交车和SimpleBus项目。
另请参阅
这篇文章解释了如何使用信使的功能作为一个独立的组件在任何PHP应用程序。读了信使:同步和排队消息处理文章在Symfony应用程序了解如何使用它。ob娱乐下载
安装
1
美元作曲家需要symfony /信使ob娱乐下载
请注意
如果你安装这个组件之外的Symfony应用程序,你必须要求ob娱乐下载供应商/ autoload.php
文件在你的代码,使作曲家提供的类加载机制。读这篇文章为更多的细节。
概念
- 发送方:
- 负责序列化和发送消息的东西。这东西可以是一个message broker或第三方API为例。
- 接收机:
- 负责检索,反序列化和转发消息处理程序(s)。这可能是一个消息队列拆卸器或一个API端点。
- 处理程序:
-
负责处理消息使用业务逻辑适用于消息。处理程序调用
HandleMessageMiddleware
中间件。 - 中间件:
- 中间件可以访问消息及其包装器(信封),而这是通过总线。字面上的“中间的软件”,那些都不是核心关切(业务逻辑)的应用程序。相反,它们是横切关注点在整个应用程序中适用,影响整个消息总线。例如:日志记录,验证消息,启动一个事务,……他们也负责调用链中的下一个中间件,这意味着他们可以调整信封,通过添加邮票甚至取代它,以及中间件链中断。中间件都称为原发货消息时再一次后,收到传输消息。
- 信封:
- 信使具体概念,它给完整的灵活性在消息总线,通过包装的信息,允许通过内部添加有用的信息信封上的邮票。
- 信封上的邮票:
- 信息你需要附加信息:序列化器上下文用于运输、标记识别收到的消息或任何形式的元数据中间件或传输层可以使用。
公共汽车
公共汽车用于分派消息。总线的行为在其命令中间件堆栈。组件提供了一组可以使用的中间件。
当使用消息总线在Symfony的FrameworkBundle,ob娱乐下载中间件为你配置如下:
- SendMessageMiddleware(支持异步处理,日志消息的处理如果你提供一个logger)
- HandleMessageMiddleware(调用注册处理程序(s))
例子:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
使用应用程序\消息\MyMessage;使用应用程序\MessageHandler\MyMessageHandler;使用ob娱乐下载\组件\信使\处理程序\HandlersLocator;使用ob娱乐下载\组件\信使\MessageBus;使用ob娱乐下载\组件\信使\中间件\HandleMessageMiddleware;美元处理程序=新MyMessageHandler ();美元公共汽车=新MessageBus ([新HandleMessageMiddleware (新HandlersLocator ([MyMessage::类= > [美元处理程序]]))));美元公共汽车- >调度(新MyMessage (/ *……* /));
请注意
每一个中间件需要实现MiddlewareInterface。
处理程序
一旦派遣到总线,消息将由一个“消息处理程序”。消息处理程序是一个PHP调用(比如一个函数或者一个类的实例),所需的处理你的信息:
1 2 3 4 5 6 7 8 9 10 11
名称空间应用程序\MessageHandler;使用应用程序\消息\MyMessage;类MyMessageHandler{公共函数__invoke(MyMessage美元消息){/ /消息处理……}}
添加元数据信息(信封)
如果您需要添加元数据或一些配置信息,包装的信封类并添加邮票。例如,设置串行化组时使用消息通过传输层,使用SerializerStamp
邮票:
1 2 3 4 5 6 7 8 9 10
使用ob娱乐下载\组件\信使\信封;使用ob娱乐下载\组件\信使\邮票\SerializerStamp;美元公共汽车- >调度((新信封(美元消息))- >(新SerializerStamp ([/ /组应用于整个消息,所以确保/ /定义组每一个嵌入的对象“组织”= > [“my_serialization_groups”)))));
这里有一些重要的信封邮票附带Symfony的信使:ob娱乐下载
- DelayStamp,推迟处理异步消息。
- DispatchAfterCurrentBusStamp,使信息处理当前总线后执行。阅读更多事务性消息:处理后新消息处理完成。
- HandledStamp邮票,标志着信息操作通过一个特定处理器。允许访问处理程序返回值和处理程序名称。
- ReceivedStamp,一个内部邮票,标志着收到传输信息。
- SentStamp邮票,标志着特定发件人发送的信息。允许访问如果可以从发送者FQCN和别名SendersLocator。
- SerializerStamp、配置串行化组所使用的交通工具。
- ValidationStamp,配置验证组启用验证时使用的中间件。
- ErrorDetailsStamp,一个内部邮票当消息失败由于异常处理程序。
而不是直接处理中间件的消息你收到信封。因此您可以检查信封内容及其邮票,或添加任何:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
使用应用程序\消息\邮票\AnotherStamp;使用ob娱乐下载\组件\信使\信封;使用ob娱乐下载\组件\信使\中间件\MiddlewareInterface;使用ob娱乐下载\组件\信使\中间件\StackInterface;使用ob娱乐下载\组件\信使\邮票\ReceivedStamp;类MyOwnMiddleware实现了MiddlewareInterface{公共函数处理(信封美元信封,StackInterface美元堆栈):信封{如果(零= = !美元信封- >最后(ReceivedStamp::类)){/ /消息就已经收到…/ /可以例如添加另一个邮票。美元信封=美元信封- >(新AnotherStamp (/ *……* /));}其他的{/ /消息只是原发货}返回美元堆栈- >next ()- >处理(美元信封,美元堆栈);}}
上面的示例将消息转发到下一个中间件与额外的邮票如果消息刚刚收到(即至少有一个ReceivedStamp
邮票)。您可以创建自己的邮票通过实现StampInterface。
如果你想要检查所有的邮票在信封,使用$信封- >所有()
按类型分组的方法,该方法返回所有邮票(FQCN)。或者,您可以遍历所有邮票特定类型的使用FQCN作为该方法的第一个参数(如$信封- >所有(ReceivedStamp::类)
)。
请注意
任何邮票使用Symfony的序列化器组件必须是可序列化的,如果通过传输使用ob娱乐下载序列化器基本序列化器。
传输
为了发送和接收消息,你必须配置一个交通工具。运输将负责与你的message broker或第三方。
你自己的发送者
假设你已经有了一个ImportantAction
消息通过消息总线和被处理程序处理。现在,你还想把这消息作为一个电子邮件(使用Mime和梅勒组件)。
使用SenderInterface,你可以创建自己的消息发送者:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17日18 19 20 21日22日23日24日25日26日27 28 29 30 31 32 33 34
名称空间应用程序\MessageSender;使用应用程序\消息\ImportantAction;使用ob娱乐下载\组件\梅勒\MailerInterface;使用ob娱乐下载\组件\信使\信封;使用ob娱乐下载\组件\信使\运输\发送方\SenderInterface;使用ob娱乐下载\组件\Mime\电子邮件;类ImportantActionToEmailSender实现了SenderInterface{公共函数__construct(私人MailerInterface美元梅勒、私人字符串美元toEmail,){}公共函数发送(信封美元信封):信封{美元消息=美元信封- >getMessage ();如果(!美元消息运算符ImportantAction) {扔新\ InvalidArgumentException (sprintf (“这运输只支持“% s”消息。,ImportantAction::类));}美元这- >梅勒- >发送((新电子邮件())- >(美元这- >toEmail)- >主题(的重要作用)- >html (' < h1 > < / h1 > < p >重要行动由“。美元消息- >getUsername ()。“< / p >”));返回美元信封;}}
你自己的接收机
接收器负责得到消息从源和调度应用程序。
想象你已经处理过的一些“订单”在您的应用程序使用里NewOrder
消息。现在你想与第三方或集成遗留应用程序,但你不能用一个API和CSV文件需要使用一个共享的新订单。
你会读这个CSV文件和调度里NewOrder
消息。所有您需要做的是编写自己的CSV接收机:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17日18 19 20 21日22日23日24日25日26日27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48
名称空间应用程序\MessageReceiver;使用应用程序\消息\里NewOrder;使用ob娱乐下载\组件\信使\信封;使用ob娱乐下载\组件\信使\异常\MessageDecodingFailedException;使用ob娱乐下载\组件\信使\运输\接收机\ReceiverInterface;使用ob娱乐下载\组件\序列化器\SerializerInterface;类NewOrdersFromCsvFileReceiver实现了ReceiverInterface{公共函数__construct(私人SerializerInterface美元序列化器、私人字符串美元filePath,){}公共函数得到():iterable{根据您的运输/ /收到信封(这里yourEnvelope美元),/ /在大多数情况下,使用一个连接是最简单的解决方案。如果(零= = =美元yourEnvelope){返回[];}试一试{美元信封=美元这- >序列化器- >解码([“身体”= >美元yourEnvelope(“身体”),“头”= >美元yourEnvelope(“头”)));}抓(MessageDecodingFailedException美元异常){美元这- >连接- >拒绝(美元yourEnvelope(“id”]);扔美元异常;}返回(美元信封- >(新CustomStamp (美元yourEnvelope(“id”))));}公共函数消(信封美元信封):无效{/ /添加消息处理的信息}公共函数拒绝(信封美元信封):无效{/ /自定义的连接美元这- >连接- >拒绝(美元这- >findCustomStamp (美元信封)- >getId ());}}
接收方和发送方在同一总线
允许同一总线上发送和接收消息,防止无限循环,将添加一个消息总线ReceivedStamp消息信封和邮票SendMessageMiddleware这些消息中间件将知道它不应该路线再传输。