4.9. 消息传递服务器配置变化
在 JBoss EAP 7 中,ActiveMQ Artemis 取代了 HornetQ 作为 Jakarta 消息传递支持提供商。这部分论述了如何迁移配置和相关消息传递数据。
4.9.1. 消息传递子系统服务器配置变化 复制链接链接已复制到粘贴板!
org.jboss.as.messaging 模块扩展(位于 EAP_HOME/modules/system/layers/base/)已被 org.wildfly.extension.messaging-activemq 扩展模块替代。
urn:jboss:domain:messaging:3.0 子系统配置命名空间已被 urn:jboss:domain:messaging-activemq:4.0 命名空间替代。
管理模型
大多数情况下,尽量使元素和属性名称与之前发行版中使用的名称相似。下表列出了其中一些更改:
| HornetQ 名称 | ActiveMQ 名称 |
|---|---|
| hornetq-server | server |
| hornetq-serverType | serverType |
| connectors | connector |
| discovery-group-name | discovery-group |
新 messaging-activemq 子系统调用的管理操作已从 /subsystem=messaging/hornetq-server= 更改为 /subsystem=messaging-activemq/server=。
您可以通过调用 migrate 操作,将现有的 JBoss EAP 6 messaging 子系统配置迁移到 JBoss EAP 7 服务器上的 messaging-activemq 子系统。
/subsystem=messaging:migrate
/subsystem=messaging:migrate
在执行 migrate 操作之前,您可以调用 describe-migration 操作,以检查要执行的管理操作列表,以便从现有 JBoss EAP 6 messaging 子系统配置迁移到 JBoss EAP 7 服务器上的 messaging-activemq 子系统。
/subsystem=messaging:describe-migration
/subsystem=messaging:describe-migration
migrate 和 describe-migration 操作还会显示无法自动迁移的资源或属性的 migration-warnings 列表。
消息传递子系统迁移和提升兼容性
describe-migration 和 migration 操作为 messaging 子系统提供了额外的配置参数。如果您要将消息传递配置为允许旧版 JBoss EAP 6 客户端连接 JBoss EAP 7 服务器,您可以按照如下所示将布尔值 add-legacy-entries 参数添加到 describe-migration 或 migrate 操作:
/subsystem=messaging:describe-migration(add-legacy-entries=true) /subsystem=messaging:migrate(add-legacy-entries=true)
/subsystem=messaging:describe-migration(add-legacy-entries=true)
/subsystem=messaging:migrate(add-legacy-entries=true)
如果布尔值参数 add-legacy-entries 设为 true,messaging-activemq 子系统将创建 legacy-connection-factory 资源,并将 legacy-entries 添加到 jms-queue 和 jms-topic 资源。
如果布尔值参数 add-legacy-entries 设为 false,则 messaging-activemq 子系统中不会创建传统资源,并且传统的消息传递客户端将无法与 JBoss EAP 7 服务器通信。这是默认值。
有关正向和向后兼容性的更多信息,请参阅为 JBoss EAP 配置 Messaging 中的向后和提升兼容性。
如需有关管理 CLI migrate 和 describe-migration 的更多信息,请参阅管理 CLI 迁移操作。
forward-when-no-sumers 属性的行为变化
JBoss EAP 7 中的 forward-when-no-consumers 属性的行为已经改变。
在 JBoss EAP 6 中,当 forward-when-no- Consumers 设置为 false 时,当集群中没有消费者时,消息会被重新分发到群集中的所有节点。
JBoss EAP 7 中已更改此行为。如果 forward-when-no-consumers 设为 false,且集群中没有使用者,则信息不会被重新分发。相反,它们会被保留在发送到的原始节点上。
默认集群负载均衡策略更改
JBoss EAP 7 中的默认群集负载平衡策略已更改。
在 JBoss EAP 6 中,默认的群集负载平衡策略类似于 STRICT,后者类似于将旧的 forward-when-no-consumers 参数设置为 true。在 JBoss EAP 7 中,默认值现在是 ON_DEMAND,它类似于将旧的 forward-when-no-consumers 参数设置为 false。有关这些设置的更多信息,请参阅为 JBoss EAP 配置 Messaging 中的集群连接属性。
消息传递子系统 XML 配置
XML 配置已根据新的 messaging-activemq 子系统进行了显著更改,现在提供的 XML 架构与其他 JBoss EAP 子系统更加一致。
强烈建议您不要尝试修改 JBoss EAP messaging 子系统 XML 配置,以符合新的 messaging-activemq 子系统。相反,可调用传统的子系统 migrate 操作。此操作将编写新的 messaging-activemq 子系统的 XML 配置,作为其执行的一部分。
4.9.2. 迁移消息传递数据 复制链接链接已复制到粘贴板!
您可以使用以下方法之一将消息传递数据从上一版本迁移到 JBoss EAP 的当前版本:
-
对于基于文件的消息传递系统,您可以使用导出和导入方法将消息传递数据从 JBoss EAP 6.4 和之前的 JBoss EAP 7.x 版本迁移到 JBoss EAP 7.4。使用此方法,您可以导出来自上一发行版本的消息传递数据,并使用管理 CLI
import-journal操作导入数据。请注意,您只能在基于文件的消息传递系统中使用此方法。 - 您可以通过配置 Jakarta 消息传递网桥,将消息传递数据从 JBoss EAP 6.4 迁移到 JBoss EAP 7.4。您可以将这种方法用于基于文件和 JDBC 消息传递系统。
由于作为 Jakarta 消息传递支持提供商从 HornetQ 更改为 ActiveMQ Artemis,消息传递数据的格式和位置在 JBoss EAP 7.0 及更高版本中发生变化。如需了解有关消息传递数据文件夹名称和 6.4 和 7.x 版本之间的位置的更改的详细信息,请参阅映射消息传递文件夹名称。
4.9.2.1. 使用导出和导入来迁移消息传递数据 复制链接链接已复制到粘贴板!
使用此方法,您可以将之前版本的消息传递数据导出到 XML 文件,然后使用 import-journal 操作导入该文件。
将消息传递数据导出到 XML 文件。
- 导入 XML 格式的消息传递数据。
您不能使用导出和导入方法在使用基于 JDBC 的日志进行存储的系统之间移动消息传递数据。
从 JBoss EAP 6.4 导出消息传递数据
由于消息传递支持提供商从 HornetQ 更改为 ActiveMQ Artemis,消息传递数据的格式和位置在 JBoss EAP 7.0 及更高版本中有所变化。
要从 JBoss EAP 6.4 导出消息传递数据,您必须使用 HornetQ exporter 实用程序。HornetQ exporter 实用程序生成消息传递数据并将其导出从 JBoss EAP 6.4 到 XML 文件。此命令要求您指定 JBoss EAP 6.4 随附的所需 HornetQ JAR 的路径,将路径传递到 messagingbindings/、messagejournal/、messagepaging/ 和 messaginglargemessages/ 文件夹作为参数,并指定输出文件,在其中编写导出的 XML 数据。
以下是 HornetQ exporter 程序所需的语法。
java -jar -mp MODULE_PATH org.hornetq.exporter MESSAGING_BINDINGS_DIRECTORY MESSAGING_JOURNAL_DIRECTORY MESSAGING_PAGING_DIRECTORY MESSAGING_LARGE_MESSAGES_DIRECTORY > OUTPUT_DATA.xml
$ java -jar -mp MODULE_PATH org.hornetq.exporter MESSAGING_BINDINGS_DIRECTORY MESSAGING_JOURNAL_DIRECTORY MESSAGING_PAGING_DIRECTORY MESSAGING_LARGE_MESSAGES_DIRECTORY > OUTPUT_DATA.xml
创建自定义模块,以确保正确版本的 HornetQ JAR(包括安装有补丁或升级的任何 JAR)已加载并提供给 exporter 实用程序。使用您首选的编辑器,在 EAP6_HOME/modules/org/hornetq/exporter/main/ 目录中创建一个新的 module.xml 文件并复制以下内容:
自定义模块是在 modules/ 目录中创建的,而不是 module/system/layers/base/ 目录。
按照以下步骤导出数据。
- 停止 JBoss EAP 6.4 服务器。
- 如上所述,创建自定义模块。
运行以下命令以导出数据:
java -jar jboss-modules.jar -mp modules/ org.hornetq.exporter standalone/data/messagingbindings/ standalone/data/messagingjournal/ standalone/data/messagingpaging standalone/data/messaginglargemessages/ > OUTPUT_DIRECTORY/OldMessagingData.xml
$ java -jar jboss-modules.jar -mp modules/ org.hornetq.exporter standalone/data/messagingbindings/ standalone/data/messagingjournal/ standalone/data/messagingpaging standalone/data/messaginglargemessages/ > OUTPUT_DIRECTORY/OldMessagingData.xmlCopy to Clipboard Copied! Toggle word wrap Toggle overflow - 确保完成 命令时,日志中没有任何错误或警告消息。
- 使用您的操作系统可用的工具来验证所生成输出文件中的 XML。
从 JBoss EAP 7.x 导出消息传递数据
按照以下步骤导出来自 JBoss EAP 7.x 的消息传递数据。
打开一个终端,前往 JBoss EAP 7.x 安装目录,再以
admin-only模式启动服务器。EAP_HOME/bin/standalone.sh -c standalone-full.xml --start-mode=admin-only
$ EAP_HOME/bin/standalone.sh -c standalone-full.xml --start-mode=admin-onlyCopy to Clipboard Copied! Toggle word wrap Toggle overflow 打开一个新终端,前往 JBoss EAP 7.x 安装目录,再连接管理 CLI。
EAP_HOME/bin/jboss-cli.sh --connect
$ EAP_HOME/bin/jboss-cli.sh --connectCopy to Clipboard Copied! Toggle word wrap Toggle overflow 使用以下管理 CLI 命令导出消息传递日志数据:
/subsystem=messaging-activemq/server=default:export-journal()
/subsystem=messaging-activemq/server=default:export-journal()Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 确保完成 命令时,日志中没有任何错误或警告消息。
- 使用您的操作系统可用的工具来验证所生成输出文件中的 XML。
导入 XML 格式的消息传递数据
然后,您将 XML 文件导入到 JBoss EAP 7.0 或更高版本,按照如下所示使用 import-journal 操作:
如果您的目标服务器已执行一些消息传递任务,请务必在开始 import-journal 操作前备份您的消息传递文件夹,以防止导入失败时出现数据丢失。如需更多信息,请参阅备份消息传递文件夹数据。
- 如果要将 JBoss EAP 6.4 服务器迁移至 JBoss EAP 7.4,请确保已完成服务器配置迁移,然后再使用管理 CLI 迁移操作或运行 JBoss 服务器迁移工具。有关如何配置和运行工具的详情,请参考使用 JBoss 服务器迁移工具。
以正常模式启动 JBoss EAP 7.x 服务器,但没有连接 Jakarta 消息传递客户端。
重要您在没有连接 Jakarta 消息传递客户端的情况下启动服务器非常重要。这是因为,
import-journal操作的行为类似于 Jakarta 消息传递制作者。操作过程中,消息会立即可用。如果此操作在导入期间失败,并且连接了 Jakarta 消息传递客户端,则无法恢复,因为 Jakarta 消息传递客户端可能已经消耗了一些消息。打开一个新终端,前往 JBoss EAP 7.x 安装目录,再连接管理 CLI。
EAP_HOME/bin/jboss-cli.sh --connect
$ EAP_HOME/bin/jboss-cli.sh --connectCopy to Clipboard Copied! Toggle word wrap Toggle overflow 使用以下管理 CLI 命令导入消息传递数据:
/subsystem=messaging-activemq/server=default:import-journal(file=OUTPUT_DIRECTORY/OldMessagingData.xml)
/subsystem=messaging-activemq/server=default:import-journal(file=OUTPUT_DIRECTORY/OldMessagingData.xml)Copy to Clipboard Copied! Toggle word wrap Toggle overflow 重要不要多次运行此命令,因为这样做会导致重复的消息!
警告如果您使用 JBoss EAP 7.0,您必须对 JBoss EAP 安装应用 Red Hat JBoss Enterprise Application Platform 7.0 Update 05 或较新的累积修补程序,以避免读取大量消息时已知问题。如需更多信息,请参阅 JBEAP-4407 - Consumer crashes with IndexOutOfBoundsException when reading large messages from imported journal。
此问题不会影响 JBoss EAP 7.1 及更高版本。
从导入的消息传递数据失败中恢复
如果 import-journal 操作失败,您可以按照以下步骤尝试恢复。
- 关闭 JBoss EAP 7.x 服务器。
- 删除所有消息传递日志文件夹。请参阅管理 CLI 命令备份消息传递文件夹数据,以确定消息传递日志文件夹的正确目录位置。
- 如果您在导入前备份了目标服务器消息传递数据,请将消息传递文件夹从备份位置复制到在上一步中确定的消息传递日志目录。
- 重复上述步骤,以导入 XML 格式的消息传递数据。
4.9.2.2. 使用消息传递网桥迁移消息传递数据 复制链接链接已复制到粘贴板!
使用此方法,您可以配置消息传递网桥并部署到 JBoss EAP 7.x 服务器。此网桥将消息从 JBoss EAP 6.4 HornetQ 队列移动到 JBoss EAP 7.x ActiveMQ Artemis 队列。
Jakarta 消息传递网桥使用来自源 Jakarta Messaging 队列或主题的消息,将它们发送到目标 Jakarta 消息传递队列或主题,后者通常位于不同的服务器上。它可用于在任何消息传递服务器之间桥接消息,只要它们兼容 JMS 1.1。使用 Java 命名和目录接口查找来源和目的地 Jakarta 消息传递资源,并且 Java 命名和目录接口查找的客户端类必须捆绑到模块中。然后,在 Jakarta 消息传递网桥配置中声明模块名称。
本节介绍如何配置服务器和部署消息传递网桥,将消息传递数据从 JBoss EAP 6.4 移到 JBoss EAP 7.x。
配置源 JBoss EAP 6.4 服务器
- 停止 JBoss EAP 6.4 服务器。
备份 HornetQ 日志和配置文件。
-
默认情况下,HornetQ 日志位于
EAP6_HOME/standalone/data/目录中。 - 请参阅每个发行版本的默认消息传递文件夹位置映射消息传递文件夹名称。
-
默认情况下,HornetQ 日志位于
-
确保 JBoss EAP 6.4 服务器上定义了包含 JMS 消息的
InQueueJMS 队列。 确保
messaging子系统配置包含RemoteConnectionFactory的条目,如下所示:Copy to Clipboard Copied! Toggle word wrap Toggle overflow 如果没有包含该条目,请使用以下管理 CLI 命令创建一个:
/subsystem=messaging/hornetq-server=default/connection-factory=RemoteConnectionFactory:add(factory-type=XA_GENERIC, connector=[netty], entries=[java:jboss/exported/jms/RemoteConnectionFactory],ha=true,block-on-acknowledge=true,retry-interval=1000,retry-interval-multiplier=1.0,reconnect-attempts=-1)
/subsystem=messaging/hornetq-server=default/connection-factory=RemoteConnectionFactory:add(factory-type=XA_GENERIC, connector=[netty], entries=[java:jboss/exported/jms/RemoteConnectionFactory],ha=true,block-on-acknowledge=true,retry-interval=1000,retry-interval-multiplier=1.0,reconnect-attempts=-1)Copy to Clipboard Copied! Toggle word wrap Toggle overflow
配置目标 JBoss EAP 7.x 服务器
Jakarta 消息传递网桥配置需要
org.hornetq模块连接到上一发行版中的 HornetQ 服务器。JBoss EAP 7.x 中不存在此模块及其直接依赖项,因此您必须从上一发行版中复制以下模块:将
org.hornetq模块复制到 JBoss EAP 7.xEAP_HOME/modules/org/目录中。-
如果您没有在此模块应用补丁,请从 JBoss EAP 6.4 服务器复制此文件夹:
EAP6_HOME/modules/system/layers/base/org/hornetq/ -
如果您已将补丁应用到此模块,请从 JBoss EAP 6.4 服务器复制此文件夹:
EAP6_HOME/modules/system/layers/base/.overlays/layer-base-jboss-eap-6.4.x.CP/org/hornetq/
-
如果您没有在此模块应用补丁,请从 JBoss EAP 6.4 服务器复制此文件夹:
从 JBoss EAP 7.x
EAP_HOME/modules/org/hornetq/main/module.xml文件中为 HornetQlib路径删除<resource-root>。如果您没有将补丁应用到 JBoss EAP 6.4
org.hornetq模块,从文件中删除以下行:<resource-root path="lib"/>
<resource-root path="lib"/>Copy to Clipboard Copied! Toggle word wrap Toggle overflow 如果您将补丁应用到 JBoss EAP 6.4
org.hornetq模块,从文件中删除以下行:<resource-root path="lib"/> <resource-root path="../../../../../org/hornetq/main/lib"/>
<resource-root path="lib"/> <resource-root path="../../../../../org/hornetq/main/lib"/>Copy to Clipboard Copied! Toggle word wrap Toggle overflow 警告如果不删除 HornetQ
libpathresource-root将导致网桥失败,在日志文件中出现以下错误:2016-07-15 09:32:25,660 ERROR [org.jboss.as.controller.management-operation] (management-handler-thread - 2) WFLYCTL0013: Operation ("add") failed - address: ([ ("subsystem" => "messaging-activemq"), ("jms-bridge" => "myBridge") ]) - failure description: "WFLYMSGAMQ0086: Unable to load module org.hornetq"2016-07-15 09:32:25,660 ERROR [org.jboss.as.controller.management-operation] (management-handler-thread - 2) WFLYCTL0013: Operation ("add") failed - address: ([ ("subsystem" => "messaging-activemq"), ("jms-bridge" => "myBridge") ]) - failure description: "WFLYMSGAMQ0086: Unable to load module org.hornetq"Copy to Clipboard Copied! Toggle word wrap Toggle overflow
将
org.jboss.netty模块复制到 JBoss EAP 7.xEAP_HOME/modules/org/jboss/目录中。-
如果您没有将补丁应用到此模块,请从 JBoss EAP 6.4 服务器复制此文件夹:
EAP6_HOME/modules/system/layers/base/org/jboss/netty/ -
如果您已将补丁应用到此模块,请从 JBoss EAP 6.4 服务器复制此文件夹:
EAP6_HOME/modules/system/layers/base/.overlays/layer-base-jboss-eap-6.4.x.CP/org/jboss/netty
-
如果您没有将补丁应用到此模块,请从 JBoss EAP 6.4 服务器复制此文件夹:
创建 Jakarta Messaging 队列,以包含 JBoss EAP 6.4 服务器接收的消息。以下是一个管理 CLI 命令的示例,它可创建
MigratedMessagesQueueJakarta Messaging 队列来接收消息。jms-queue add --queue-address=MigratedMessagesQueue --entries=[jms/queue/MigratedMessagesQueue java:jboss/exported/jms/queue/MigratedMessagesQueue]
jms-queue add --queue-address=MigratedMessagesQueue --entries=[jms/queue/MigratedMessagesQueue java:jboss/exported/jms/queue/MigratedMessagesQueue]Copy to Clipboard Copied! Toggle word wrap Toggle overflow 这会在 JBoss EAP 7.x 服务器的
messaging-activemq子系统中为默认服务器创建以下jms-queue配置。<jms-queue name="MigratedMessagesQueue" entries="jms/queue/MigratedMessagesQueue java:jboss/exported/jms/queue/MigratedMessagesQueue"/>
<jms-queue name="MigratedMessagesQueue" entries="jms/queue/MigratedMessagesQueue java:jboss/exported/jms/queue/MigratedMessagesQueue"/>Copy to Clipboard Copied! Toggle word wrap Toggle overflow 确保
messaging-activemq子系统默认服务器包含InVmConnectionFactoryconnection-factory的配置,类似于以下内容:<connection-factory name="InVmConnectionFactory" factory-type="XA_GENERIC" entries="java:/ConnectionFactory" connectors="in-vm"/>
<connection-factory name="InVmConnectionFactory" factory-type="XA_GENERIC" entries="java:/ConnectionFactory" connectors="in-vm"/>Copy to Clipboard Copied! Toggle word wrap Toggle overflow 如果没有包含该条目,请使用以下管理 CLI 命令创建一个:
/subsystem=messaging-activemq/server=default/connection-factory=InVmConnectionFactory:add(factory-type=XA_GENERIC, connectors=[in-vm], entries=[java:/ConnectionFactory])
/subsystem=messaging-activemq/server=default/connection-factory=InVmConnectionFactory:add(factory-type=XA_GENERIC, connectors=[in-vm], entries=[java:/ConnectionFactory])Copy to Clipboard Copied! Toggle word wrap Toggle overflow 创建并部署 Jakarta Messaging 网桥,从 JBoss EAP 6.4 服务器上配置的
InQueueJMS 队列读取消息,并将它们传送到 JBoss EAP 7.x 服务器上配置的MigratedMessagesQueue。/subsystem=messaging-activemq/jms-bridge=myBridge:add(add-messageID-in-header=true,max-batch-time=100,max-batch-size=10,max-retries=-1,failure-retry-interval=1000,quality-of-service=AT_MOST_ONCE,module=org.hornetq,source-destination=jms/queue/InQueue,source-connection-factory=jms/RemoteConnectionFactory,source-context=[("java.naming.factory.initial"=>"org.wildfly.naming.client.WildFlyInitialContextFactory"),("java.naming.provider.url"=>"remote://127.0.0.1:4447")],target-destination=jms/queue/MigratedMessagesQueue,target-connection-factory=java:/ConnectionFactory)/subsystem=messaging-activemq/jms-bridge=myBridge:add(add-messageID-in-header=true,max-batch-time=100,max-batch-size=10,max-retries=-1,failure-retry-interval=1000,quality-of-service=AT_MOST_ONCE,module=org.hornetq,source-destination=jms/queue/InQueue,source-connection-factory=jms/RemoteConnectionFactory,source-context=[("java.naming.factory.initial"=>"org.wildfly.naming.client.WildFlyInitialContextFactory"),("java.naming.provider.url"=>"remote://127.0.0.1:4447")],target-destination=jms/queue/MigratedMessagesQueue,target-connection-factory=java:/ConnectionFactory)Copy to Clipboard Copied! Toggle word wrap Toggle overflow 这会在 JBoss EAP 7.x 服务器的
messaging-activemq子系统中创建以下jms-bridge配置。Copy to Clipboard Copied! Toggle word wrap Toggle overflow -
如果为 JBoss EAP 6.4 配置了安全性,还必须将消息传递网桥配置
<source>元素配置为包含一个source-context,用于指定在创建连接时用于 Java Naming 和 Directory Interface 查找的正确用户名和密码。
迁移消息传递数据
验证您为以下配置提供的信息正确。
- 任何队列和主题名称。
-
java.naming.provider.url用于 Java 命名和目录接口查找。
- 确保您已将目标 Jakarta Messaging 目的地部署到 JBoss EAP 7.x 服务器。
- 启动 JBoss EAP 6.4 和 JBoss EAP 7.x 服务器。
4.9.2.3. 映射消息文件夹名称 复制链接链接已复制到粘贴板!
下表显示了上一版本中使用的消息传递目录名以及 JBoss EAP 当前发行版本中使用的对应名称。目录相对于 jboss.server.data.dir 目录,如果未指定,则默认为 EAP_HOME/standalone/data/。
| JBoss EAP 6.4 目录名称 | JBoss EAP 7.x 目录名称 |
|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
如果没有大型消息或者页面被禁用,则 messaginglargemessages/ 和 messagingpaging/ 目录可能不存在。
4.9.2.4. 备份消息文件夹数据 复制链接链接已复制到粘贴板!
如果您的目标服务器已经处理了消息,最好在开始前将目标消息文件夹备份到备份位置。消息传递文件夹的默认位置是 EAP_HOME/standalone/data/activemq/,但它是可配置的。如果您不确定消息传递数据的位置,您可以使用以下管理 CLI 命令查找消息传递文件夹的位置。
/subsystem=messaging-activemq/server=default/path=journal-directory:resolve-path /subsystem=messaging-activemq/server=default/path=paging-directory:resolve-path /subsystem=messaging-activemq/server=default/path=bindings-directory:resolve-path /subsystem=messaging-activemq/server=default/path=large-messages-directory:resolve-path
/subsystem=messaging-activemq/server=default/path=journal-directory:resolve-path
/subsystem=messaging-activemq/server=default/path=paging-directory:resolve-path
/subsystem=messaging-activemq/server=default/path=bindings-directory:resolve-path
/subsystem=messaging-activemq/server=default/path=large-messages-directory:resolve-path
知道文件夹的位置后,将每个文件夹复制到安全备份位置。
4.9.3. 迁移消息目的地 复制链接链接已复制到粘贴板!
在 JBoss EAP 6 中,消息传递目的地队列在 messaging 子系统的 <hornetq-server> 元素下的 <jms-destinations> 元素中配置。
在 JBoss EAP 7 中,Jakarta Messaging 目的地队列在 messaging-activemq 子系统的默认 <server> 元素中配置。
<server name="default"> ... <jms-queue name="testQueue" entries="queue/test java:jboss/exported/jms/queue/test"/> ... </server>
<server name="default">
...
<jms-queue name="testQueue" entries="queue/test java:jboss/exported/jms/queue/test"/>
...
</server>
4.9.4. 迁移消息拦截器 复制链接链接已复制到粘贴板!
在 JBoss EAP 7 中,消息拦截器已显著改变,它替代了 ActiveMQ为 Jakarta Messaging 提供者。
JBoss EAP 前面发行版本中的 HornetQ messaging 子系统要求您通过将 HornetQ 拦截器添加到 JAR,然后修改 HornetQ module.xml 文件。
JBoss EAP 7 中包含的 messaging-activemq 子系统不需要修改 module.xml 文件。用户拦截器类现在可以从任何服务器模块加载 Apache ActiveMQ ActiveMQ Interceptor 接口。您可以指定拦截器应加载在服务器配置文件的 messaging-activemq 子系统中的模块。
示例: Interceptor 配置
4.9.5. 替换 Netty Servlet 配置 复制链接链接已复制到粘贴板!
在 JBoss EAP 6 中,您可以配置 servlet 引擎以用于 Netty Servlet 传输。由于 ActiveMQ6.3 取代了 JBoss EAP 7 中的内置消息传递提供程序,因此该配置不再可用。您必须替换 servlet 配置,以使用新的内置消息传递 HTTP 连接器和 HTTP 接受器。
4.9.6. 配置通用 Jakarta 消息传递资源适配器 复制链接链接已复制到粘贴板!
您在 JBoss EAP 7 中配置了通用 Jakarta Messaging 资源适配器的方式,在 JBoss EAP 7 中更改了用于第三方 Jakarta 消息传递供应商。如需更多信息,请参阅为 JBoss EAP 配置 消息传递资源适配器部署通用 Jakarta 消息传递 资源适配器。
4.9.7. 消息传递配置更改 复制链接链接已复制到粘贴板!
在 JBoss EAP 7.0 中,如果您配置了 复制策略 而不指定 check-for-live-server 属性,则默认值为 false。JBoss EAP 7.1 及更高版本中发生了这一变化。check-for-live-server 属性的默认值现在是 true。
以下是一个管理 CLI 命令的示例,它可在不指定 check-for-live-server 属性的情况下配置 replication-master 策略。
/subsystem=messaging-activemq/server=default/ha-policy=replication-master:add(cluster-name=my-cluster,group-name=group1)
/subsystem=messaging-activemq/server=default/ha-policy=replication-master:add(cluster-name=my-cluster,group-name=group1)
当您使用管理 CLI 读取资源时,请注意 check-for-live-server 属性值被设置为 true。
javax.jms.JMSException 的 serialVersionUID 在 JMS 1.1 和 JMS 2.0.0 之间更改。这意味着,如果 JMSException 实例或其任何子类的实例使用 JMS 1.1 进行序列化,则无法使用 JMS 2.0.0 进行反序列化。反向也是 true。如果 JMSException 实例使用 JMS 2.0.0 序列化,则无法使用 JMS 1.1 来反序列化。在这两个情形中,它会抛出类似如下的异常:
javax.jms.JMSException: javax.jms.JMSException; local class incompatible: stream classdesc serialVersionUID = 8951994251593378324, local class serialVersionUID = 2368476267211489441
javax.jms.JMSException: javax.jms.JMSException; local class incompatible: stream classdesc serialVersionUID = 8951994251593378324, local class serialVersionUID = 2368476267211489441
这个问题已在 Jakarta Messaging 2.0.1 维护发行版本中解决。
JMS 2.0.1 规范与 Jakarta Messaging 2.0.3 规范兼容。
以下列出了每个 JBoss EAP 版本的实施:
| JBoss EAP 版本 | 实施 | 版本 |
|---|---|---|
| 6.4 | HornetQ | JMS 1.1 |
| 7.0 | Apache ActiveMQ Artemis | JMS 2.0.0 |
| 7.1 及更新的版本 | Apache ActiveMQ Artemis | jakarta Messaging 2.0.3 或更高版本 |
请注意,serialVersionUID 不兼容性可能会导致在以下情况下出现迁移问题:
-
如果您使用 JBoss EAP 6.4 客户端发送包含
JMSException的消息,请将您的消息传递数据迁移到 JBoss EAP 7.0,然后尝试使用 JBoss EAP 7.0 客户端反序列化该消息,反序列化将会失败,并且会引发异常。这是因为 JMS 1.1 中的serialVersionUID与 JMS 2.0.0 中的 serialVersionUID 不兼容。 -
如果您使用 JBoss EAP 7.0 客户端发送包含
JMSException的消息,请将您的消息传递数据迁移到 JBoss EAP 7.1 或更高版本,然后尝试使用 JBoss EAP 7.1 或更高版本的客户端来反序列化该消息,并且会引发异常。这是因为 JMS 2.0.0 中的serialVersionUID与 Jakarta Messaging 2.0.3 或更高版本中的版本 不兼容。
请注意,如果您使用 JBoss EAP 6.4 客户端发送包含 JMSException 的消息,请将您的消息传递数据迁移到 JBoss EAP 7.1 或更高版本,然后尝试使用 JBoss EAP 7.1 或更高版本的客户端对消息进行反序列化化,因为 JMS 1.1 中的 serialVersionUID 与 Jakarta Messaging 2.0.3 中的 serialVersionUID 兼容。
红帽建议您在迁移消息传递数据前执行以下操作:
- 在将消息从 JBoss EAP 6.4 迁移到 JBoss EAP 7.0 之前,请务必使用包含 JMSException 的所有 JMS 1.1 消息。
- 在将 JBoss EAP 7.0 的消息传递数据从 JBoss EAP 7.0 迁移到 JBoss EAP 7.1 或更高版本之前,请务必使用包含 Jakarta Messaging Exception 的所有 Jakarta Messaging 2.0.3 消息。