第 23 章 转变
转换是 JBoss EAP 消息中配置的对象,有助于将消息从一个地址转移到另一个地址。转换可归类为以下类型:
- 专用
- 邮件仅转用到新地址,从未发送到旧地址。
- 非独占性
- 将向旧地址发送邮件,并且也会将邮件的副本发送到新地址。非独占移动可用于分割消息流。
转换只会将邮件转移到同一服务器上的地址。如果您要转用其他服务器上的地址,常见的模式是转为使用本地存储和转发队列,然后设置一个从该队列消耗并转发到不同服务器上的地址的网桥。
因此,转义是一个非常复杂的概念。与网桥结合使用时,转换可用于创建有趣而复杂的路由。可以将其视为消息的路由表类型。通过将转换与网桥相结合,您可以在多个地理分布式服务器之间创建可靠路由连接的分布式网络,从而创建全局消息传递网格。有关如何使用 网桥的更多信息,请参阅配置 核心网桥。
可以对转换进行配置,以应用 Transformer 和
可选消息过滤器。可选的消息过滤器有助于仅引发与指定过滤器匹配的消息。有关过滤器的更多信息,请参阅 Filter Expressions 和 Message Selectors。
转换器用于将消息转换为另一种形式。当指定转换器时,所有转换的消息都会由 Transformer 进行转换 。
所有转换器都必须实施 org.apache.activemq.artemis.core.server.cluster.Transformer
接口:
package org.apache.activemq.artemis.core.server.cluster; import org.apache.activemq.artemis.core.server.ServerMessage; public interface Transformer { ServerMessage transform(ServerMessage message); }
若要使 JBoss EAP 消息传递能够实例化您的转换器实施实例,您必须将它包含在 JBoss EAP 模块中,然后将该模块作为导出的依赖关系添加到 org.apache.activemq.artemis
模块。如需有关如何 创建自定义模块 的信息,请参阅 JBoss EAP 配置指南中 的自定义模块。要将依赖项添加到 org.apache.activemq.artemis
模块,打开文件 EAP_HOME/modules/system/layers/base/org/apache/activemq/artemis/main/module.xml
,并将您的 <module>
添加到 <dependencies>
列表中,如下例所示。
<module xmlns="urn:jboss:module:1.3" name="org.apache.activemq.artemis">
<resources>
...
</resources>
<dependencies>
...
<module name="YOUR_MODULE_NAME" export="true"/>
</dependencies>
</module>
23.1. 独占转义
以下是在配置中可能出现排他性的问题示例:
<divert name="prices-divert" address="jms.topic.priceUpdates" forwarding-address="jms.queue.priceForwarding" filter="office='New York'" transformer-class-name="org.apache.activemq.artemis.jms.example.AddForwardingTimeTransformer" exclusive="true"/>
在本例中,配置了一个名为 price -divert
的转换,它将任何发送到 address jms.topic. priceUpdates
的消息映射到名为 priceUpdates 的 Jakarta Messaging 主题,它对应于名为 priceUpdates
的本地 Jakarta Messaging 队列,它对应于名为
priceForwarding 的本地 Jakarta Messaging
队列。
我们还指定消息过滤器字符串,以便仅 丢弃
值为 New York
的消息。所有其他消息将继续路由到正常地址。若未指定,过滤器字符串为可选,则所有消息都将被视为匹配项。
请注意,指定了转换器类。在这个示例中,转换器只是添加一个标头来记录发生移动的时间。
此示例实际将消息转移到本地存储和转发队列,该队列配置了将消息转发到另一服务器上的地址的网桥。如需了解更多详细信息 ,请参阅配置 核心网桥。