|
|
沉稳的茶壶 · WildFly 24· 2 月前 · |
|
|
失眠的芹菜 · 【前端开发框架之Vue.js的基本介绍】_v ...· 2 年前 · |
|
|
留胡子的火车 · Ansible: Provided ...· 2 年前 · |
|
|
神勇威武的楼梯 · python 过滤特殊字符 (emoji) ...· 2 年前 · |
|
|
直爽的电脑桌 · 33 款主宰 2017 iOS ...· 2 年前 · |
|
|
乐观的竹笋 · 浅谈大数据指标体系建设流程 - 掘金· 2 年前 · |
| jms topic activemq jboss |
| https://access.redhat.com/documentation/zh-cn/red_hat_jboss_enterprise_application_platform/7.3/html-single/configuring_messaging/ |
|
|
英俊的小熊猫
2 年前 |
Increase visibility into IT operations to detect and resolve technical issues before they impact your business.
Learn More Go to InsightsEngage with our Red Hat Product Security team, access security updates, and ensure your environments are not exposed to any known security vulnerabilities. Product Security Center
Keep your systems secure with Red Hat's specialized responses to security vulnerabilities. View Responses
Java 消息传递服务(JMS)2.0 在 JSR 343 中定义。Jakarta EE 同等规范是 Jakarta Messaging 。JMS 是一种 Java API,提供点对点和发布订阅者消息传递样式。JMS 还包含了事务的使用。JMS 不定义标准线路格式,因此 JMS 提供商可能全部使用标准 API,但可能会使用不同的内部线协议在客户端和服务器之间进行通信。
JMS 目的地以及 JMS 连接工厂是 JMS 管理对象。目的地供 JMS 客户端用于生成和使用消息。该目的地允许 JMS 客户端在生成消息时使用消息时指定目标以及消息来源。使用发布订阅模式时,目的地称为主题。使用点对点模式时,目的地称为队列。 应用可能会使用在服务器端配置并且通常通过 JNDI 访问的不同 JMS 目的地。
Apache ActiveMQ Artemis 是一个用于异步消息传递系统的开源项目。它是高性能、嵌入式、集群化并支持多种协议。JBoss EAP 7 将 Apache ActiveMQ Artemis 用作其 JMS 代理,并使用
messaging-activemq
子系统进行配置。这完全取代了 HornetQ 代理,但仍保持了与 JBoss EAP 6 的协议兼容性。
核心 ActiveMQ Artemis 是 JMS-agnostic,提供非 JMS
API,称为核心 API
。ActiveMQ Artemis 还提供 JMS 客户端 API,它使用学术层在核心 API 基础上实施 JMS 语义。本质上,JMS 交互通过 JMS 客户端 API 在客户端上转换为核心 API 操作。从那里,所有操作都使用核心客户端 API 和 Apache ActiveMQ Artemis wire 格式发送。服务器本身仅使用 core API。如需有关核心 API 及其概念的更多详细信息,请参阅
ActiveMQ Artemis 文档
。
让我们快速讨论 JMS 目的地如何映射到 Apache ActiveMQ Artemis 地址。
Apache ActiveMQ Artemis 核心是 JMS-agnostic.它没有任何 JMS 主题的概念。JMS 主题在 core 中作为绑定有零个或多个队列的地址(主题名称)实施。绑定到该地址的每个队列都代表一个主题订阅。类似地,JMS 队列作为地址(JMS 队列名称)实施,其绑定了一个队列,它代表 JMS 队列。
按照惯例,所有 JMS 队列映射到核心队列,其中核心队列名称具有 string
jms.queue.
前缀为它。例如,名称为 Order
.europe
的 JMS 队列将使用 name
jms.queue.orders.europe
映射到核心队列。绑定核心队列的地址也由核心队列名称提供。
对于 JMS 主题,通过将 string
jms.topic.
添加到 JMS 主题的名称来为代表订阅的队列绑定的地址。例如,名称为
news.europe
的 JMS 主题将映射到核心 address
jms.topic.news.europe
。
换句话说,如果您发送 JMS 消息到带有名称 Order
.europe
的 JMS 队列,它会在服务器上路由到绑定到 address
jms.queue.orders.europe
的任何核心队列。如果您发送 JMS 消息到名称为
news.europe
的 JMS 主题,它会在服务器上路由到绑定到 address
jms.topic.news.europe
的任何核心队列。
如果要使用名称 Order
.europe
配置 JMS 队列的设置,您需要配置对应的内核 queue
jms.queue.orders.europe
:
<!-- expired messages in JMS Queue "orders.europe" will be sent to the JMS Queue "expiry.europe" --> <address-setting match="jms.queue.orders.europe"> <expiry-address>jms.queue.expiry.europe</expiry-address> </address-setting>
第 II 部分从使用
helloworld-mdb
快速入门的 JBoss EAP 7 消息传递入门指南开始。以下为任何安装可用的配置选项包括安全性和持久性等主题。有关多个 JBoss EAP 7
安装的相关配置,包括群集、高可用性和连接其他服务器等主题,请参阅配置多节点消息传递系统第三部分
。
helloworld-mdb
quickstart 使用一个简单的消息驱动 Bean 来演示基本的 Jakarta EE 消息传递功能。
在回顾基本配置时
,快速入门和运行是向自己介绍 JBoss EAP 消息传递服务器所含功能的一种好方法。
有关构建和部署
helloworld-mdb
快速启动的说明,请参阅由快速入门提供的
README.md
文件中的说明。您将需要启动 JBoss EAP 服务器,指定包含
messaging-activemq
子系统
的完整
配置。有关使用不同配置文件启动 JBoss EAP 的详细信息,请参阅
README.md
文件或 JBoss EAP
配置指南
。
在使用 full 或
full
-
子系统的默认配置。
ha 配置启动 JBoss EAP 服务器时,包含 messaging-
activemq
full-ha
选项包括
集群和
高可用性
等功能的高级配置。
虽然不需要,但
建议您使用
helloworld-mdb
快速入门
作为有效的示例,以便与配置概述一起运行。
如需有关
messaging-activemq
子系统中所有可用设置的信息,请参见
EAP_HOME
/docs/schema/
目录中的架构定义,或者从管理 CLI 对子系统运行
read-resource-description
操作,如下所示:
/subsystem=messaging-activemq:read-resource-description(recursive=true)
服务器配置文件中的以下扩展名指示 JBoss EAP 将
messaging-activemq
子系统作为其运行时的一部分:
<extensions> <extension module="org.wildfly.extension.messaging-activemq"/> </extensions>
messaging-activemq
子系统的配置包含在
<subsystem xmlns="urn:jboss:domain:messaging-activemq:4.0">
元素中。
<subsystem xmlns="urn:jboss:domain:messaging-activemq:4.0">
<server name="default">
<cluster password="${jboss.messaging.cluster.password:CHANGE ME!!}"/>
<security-setting name="#">
<role name="guest" send="true" consume="true" create-non-durable-queue="true" delete-non-durable-queue="true"/>
</security-setting>
<address-setting name="#" dead-letter-address="jms.queue.DLQ" expiry-address="jms.queue.ExpiryQueue" max-size-bytes="10485760" page-size-bytes="2097152" message-counter-history-day-limit="10" redistribution-delay="1000"/>
<http-connector name="http-connector" socket-binding="http" endpoint="http-acceptor"/>
<http-connector name="http-connector-throughput" socket-binding="http" endpoint="http-acceptor-throughput">
<param name="batch-delay" value="50"/>
</http-connector>
<in-vm-connector name="in-vm" server-id="0"/>
<http-acceptor name="http-acceptor" http-listener="default"/>
<http-acceptor name="http-acceptor-throughput" http-listener="default">
<param name="batch-delay" value="50"/>
<param name="direct-deliver" value="false"/>
</http-acceptor>
<in-vm-acceptor name="in-vm" server-id="0"/>
<broadcast-group name="bg-group1" connectors="http-connector" jgroups-cluster="activemq-cluster"/>
<discovery-group name="dg-group1" jgroups-cluster="activemq-cluster"/>
<cluster-connection name="my-cluster" address="jms" connector-name="http-connector" discovery-group="dg-group1"/>
<jms-queue name="ExpiryQueue" entries="java:/jms/queue/ExpiryQueue"/>
<jms-queue name="DLQ" entries="java:/jms/queue/DLQ"/>
<connection-factory name="InVmConnectionFactory" connectors="in-vm" entries="java:/ConnectionFactory"/>
<connection-factory name="RemoteConnectionFactory" ha="true" block-on-acknowledge="true" reconnect-attempts="-1" connectors="http-connector" entries="java:jboss/exported/jms/RemoteConnectionFactory"/>
<pooled-connection-factory name="activemq-ra" transaction="xa" connectors="in-vm" entries="java:/JmsXA java:jboss/DefaultJMSConnectionFactory"/>
</server>
</subsystem>
消息传递客户端使用 JMS
ConnectionFactory
对象来连接服务器。默认 JBoss EAP 配置定义多种连接工厂:请注意,有
<connection-factory>
用于 in-vm、http 和池化连接。
<connection-factory name="InVmConnectionFactory" connectors="in-vm" entries="java:/ConnectionFactory"/> <connection-factory name="RemoteConnectionFactory" ha="true" block-on-acknowledge="true" reconnect-attempts="-1" connectors="http-connector" entries="java:jboss/exported/jms/RemoteConnectionFactory"/> <pooled-connection-factory name="activemq-ra" transaction="xa" connectors="in-vm" entries="java:/JmsXA java:jboss/DefaultJMSConnectionFactory"/>
如需了解更多详细信息,请参阅 配置连接事实部分 。
每一 JMS 连接工厂使用连接器启用从客户端或消费者到消息传递服务器的 JMS 通信。连接器对象定义用于连接消息传递服务器的传输和参数。其对应对象是接收器对象,用于标识消息传递服务器接受的连接类型。 默认的 JBoss EAP 配置定义了多个连接器和接收器。
示例:默认连接器
<http-connector name="http-connector" socket-binding="http" endpoint="http-acceptor"/> <http-connector name="http-connector-throughput" socket-binding="http" endpoint="http-acceptor-throughput"> <param name="batch-delay" value="50"/> </http-connector> <in-vm-connector name="in-vm" server-id="0"/>
示例:默认接受器
<http-acceptor name="http-acceptor" http-listener="default"/> <http-acceptor name="http-acceptor-throughput" http-listener="default"> <param name="batch-delay" value="50"/> <param name="direct-deliver" value="false"/> </http-acceptor>详情请查看 Acceptors 和 Connectors 部分。
默认连接器
的 socket-binding
属性引用名为
http
的套接字绑定。使用 http 连接器,因为 JBoss EAP 可以在标准 Web 端口上多路复用请求。
您可以在配置文件的其他位置找到此
socket-binding
作为
<socket-binding-group>
部分的一部分。请注意 http 和 https 套接字绑定的配置如何出现在
<socket-binding-groups>
元素中:
<socket-binding-group name="standard-sockets" default-interface="public" port-offset="${jboss.socket.binding.port-offset:0}">
<socket-binding name="http" port="${jboss.http.port:8080}"/>
<socket-binding name="https" port="${jboss.https.port:8443}"/>
</socket-binding-group>
如需有关套接字绑定的信息,请参阅 JBoss EAP 配置指南中的配置套接字绑定 。
在首次安装 JBoss EAP 时,
messaging
元素:
-activemq
子系统包含一个 security-setting
<security-setting name="#"> <role name="guest" delete-non-durable-queue="true" create-non-durable-queue="true" consume="true" send="true"/> </security-setting>
这声明,任何具有
guest
角色的用户都可以访问服务器上的任何地址,如通配符
# 所述
。
有关通配符语法的更多信息,请参阅配置地址设置
。
有关保护目的地和远程连接的更多信息,请参阅配置消息传递安全性
。
配置包括两个有帮助的队列,JBoss EAP 可以使用这些队列存放已过期或无法路由到正确目的地的消息。
完整和全
ha
<jms-queue name="ExpiryQueue" entries="java:/jms/queue/ExpiryQueue"/> <jms-queue name="DLQ" entries="java:/jms/queue/DLQ"/>
您可以使用以下方法之一在 JBoss EAP 中添加自己的消息传递目的地: 使用管理 CLI 使用以下管理 CLI 命令添加队列:
jms-queue add --queue-address=testQueue --entries=queue/test,java:jboss/exported/jms/queue/test
使用以下管理 CLI 命令添加主题:
jms-topic add --topic-address=testTopic --entries=topic/test,java:jboss/exported/jms/topic/test
使用管理控制台
可以通过导航到
Configuration
→
Subsystems
→
Messaging(ActiveMQ)
→
Server
,从管理控制台中配置消息传递目的地,选择
Destinations
并点
View
。选择
JMS Queue
选项卡来配置队列,再选择
JMS 主题来配置主题
。
使用 Java EE 部署描述符或注释来定义您的目的地。
在 Jakarta EE 8 中,部署描述符可以包含队列和主题的配置。以下是定义 JMS 队列的 Java EE 描述符文件中的代码片段。
<jms-destination>
<name>java:global/jms/MyQueue</name>
<interfaceName>javax.jms.Queue</interfaceName>
<destinationName>myQueue</destinationName>
</jms-destination>
例如,helloworld
-mdb
quickstart 中的消息驱动型 Bean 包含定义运行应用所需的队列和主题的注释。以这种方式创建的目的地将显示在运行时队列列表中。使用管理 CLI 显示运行时队列的列表。部署 Quickstart 后,它创建的运行时队列将如下所示:
/subsystem=messaging-activemq/server=default/runtime-queue=*:read-resource
"outcome" => "success",
"result" => [
"address" => [
("subsystem" => "messaging-activemq"),
("server" => "default"),
("runtime-queue" => "jms.queue.HelloWorldMDBQueue")
"outcome" => "success",
"result" => {"durable" => undefined}
"address" => [
("subsystem" => "messaging-activemq"),
("server" => "default"),
("runtime-queue" => "jms.topic.HelloWorldMDBTopic")
"outcome" => "success",
"result" => {"durable" => undefined}
如需了解更多详细信息,请参阅配置消息传递目标。
请记住,配置消息传递目的地要求 JBoss EAP 启用了消息传递。使用 standalone-full.xml 或
standalone-
配置文件运行时,此功能会被默认启用。
full-ha.xml
domain.xml
配置文件也启用了消息传递。
要添加 JMS 队列,请在管理 CLI 中使用
jms-queue
命令:
jms-queue add --queue-address=myQueue --entries=[queue/myQueue jms/queue/myQueue java:jboss/exported/jms/queue/myQueue]
注意
entries
属性如何是一个包含由单个空格分隔的多个 JNDI 名称的列表。另请注意,使用方括号
[]
来括起 JNDI 名称列表。
queue-address
提供路由配置,
条目
提供 JNDI 名称列表,客户端可用于查找队列。
您可以在管理 CLI 中使用
jms-queue
命令读取队列的配置。
jms-queue read-resource --queue-address=myQueue
或者,您可以使用管理 CLI 访问
messaging-activemq
子系统来读取队列配置:
/subsystem=messaging-activemq/server=default/jms-queue=myQueue:read-resource()
"outcome" => "success",
"result" => {
"durable" => true,
"entries" => ["queue/myQueue jms/queue/myQueue java:jboss/exported/jms/queue/myQueue"],
"legacy-entries" => undefined,
"selector" => undefined
}
jms-queue
的属性
输入以下命令时,管理 CLI 显示
jms-queue
配置元素的所有属性:
/subsystem=messaging-activemq/server=default/jms-queue=*:read-resource-description()
下表提供了 a
jms-queue
的所有属性:
| 属性 | 描述 |
|---|---|
|
consumer-count 此队列中消息的使用者数量。在运行时可用. dead-letter-address 将死信发送到的地址。 如需更多信息,请参阅配置 Dead Letter 地址 。 delivering-count 此队列当前传送到其使用者的消息数量。在运行时可用. Durable 队列是否持久。 有关持久订阅的更多信息,请参阅消息样式 。 队列将绑定到的 JNDI 名称的列表。必需。 expiry-address 将接收过期邮件的地址。详情请参阅 配置消息过期 。 legacy-entries 队列将绑定到的 JNDI 名称。 message-count 此队列中当前消息的数量。在运行时可用. 自该队列创建以来添加到此队列的消息数。在运行时可用. paused 队列是否暂停。在运行时可用. queue-address 队列地址定义用于路由消息的地址。 有关地址设置的详情,请参阅配置地址设置 。必需。 scheduled-count 此队列中调度的消息数量。在运行时可用. selector 队列选择器。有关选择器的更多信息,请参阅 Filter Expressions 和 Message Selectors 。 队列是否为临时队列。 如需更多信息,请参阅临时队列和运行时队列 。 |
添加或读取主题与添加队列非常类似:
jms-topic add --topic-address=myTopic --entries=[topic/myTopic jms/topic/myTopic java:jboss/exported/jms/topic/myTopic]
读取主题属性的语法也类似于用于队列的语法:
jms-topic read-resource --topic-address=myTopic entries topic/myTopic jms/topic/myTopic java:jboss/exported/jms/topic/myTopic legacy-entries=n/a
/subsystem=messaging-activemq/server=default/jms-topic=myTopic:read-resource
"outcome" => "success",
"result" => {
"entries" => ["topic/myTopic jms/topic/myTopic java:jboss/exported/jms/topic/myTopic"],
"legacy-entries" => undefined
}
jms-topic
的属性
输入以下命令时,管理 CLI 显示
jms-topic
配置元素的所有属性:
/subsystem=messaging-activemq/server=default/jms-topic=*:read-resource-description()
下表列出了 a
jms-topic
的属性:
| 属性 | 描述 |
|---|---|
|
delivering-count 此队列当前传送到其使用者的消息数量。在运行时可用. durable-message-count 本主题的所有持久订阅者的消息数量。在运行时可用. durable-subscription-count 本主题的持久订户数量。在运行时可用. 该主题的 JNDI 名称将绑定到.必需。 legacy-entries 该主题将绑定到的传统 JNDI 名称。 message-count 此队列中当前消息的数量。在运行时可用. 自该队列创建以来添加到此队列的消息数。在运行时可用. non-durable-message-count 本主题的所有不可持久性订阅者的消息数量。在运行时可用. non-durable-subscription-count 本主题的非可用订阅数量。在运行时可用. subscription-count 本主题的(可持久性和不可持久性)订阅者的数量。在运行时可用. 主题是否为临时主题。 topic-address 主题指向的地址。必需。 |
队列或主题必须绑定到
java:jboss/exported
命名空间,以便远程客户端能够进行查找。在进行查找时,客户端必须使用
java:jboss/exported/
后的文本。例如,名为
testQueue
的队列为其
条目
的 list
jms/queue/test java:jboss/exported/jms/queue/test
.希望将消息发送到
testQueue
的远程客户端将使用 string
jms/queue/test
查找队列。另一方面,本地客户端可以通过
java:jboss/exported/jms/queue/test
、
java:jms/queue/test
或更多 simple
jms/queue/test 进行
查找。
您可以使用
--help --command
命令的更多信息:
s 标志找到有关
-topic
jms-queue
和jms
jms-queue --help --commands
jms-topic --help --commands
您可以通过在 JBoss EAP
logging
子系统中添加
org.apache.
配置日志记录。您还可以为类别配置日志处理程序,以配置日志消息的记录方式。
要在有关 XA 事务的日志中查看更多信息,请将
activemq
的日志类别并设置所需的日志级别,为 messaging-activemq
com.arjuna
类别的日志级别更改为更为详细的设置,如
TRACE 或
DEBUG
。
有关日志记录的更多信息,包括类别配置和其他选项的配置,请参见《JBoss EAP
配置指南》中关于
https://access.redhat.com/documentation/en-us/red_hat_jboss_enterprise_application_platform/7.3/html-single/configuration_guide/#logging_with_jboss_eap
登录的章节
。
表 5.1. 日志记录类别
| 如果要日志用于… | 使用此类别… |
|---|---|
|
XA 事务 com.arjuna 所有消息传递活动 org.apache.activemq 只调用消息传递日志 org.apache.activemq.artemis.journal 仅 JMS 调用 org.apache.activemq.artemis.jms 仅消息传递 utils 调用 org.apache.activemq.artemis.utils 仅限消息传递核心服务器 org.apache.activemq.artemis.core.server |
按照以下步骤配置消息传递客户端:
将依赖项下载到 JBoss JMS 客户端和日志管理器。
如果使用 Maven,请在
pom.xml
文件中添加以下依赖项:
<dependencies>
<dependency>
<groupId>org.jboss.logmanager</groupId>
<artifactId>jboss-logmanager</artifactId>
<version>1.5.3.Final</version>
</dependency>
<dependency>
<groupId>org.jboss.eap</groupId>
<artifactId>wildfly-jms-client-bom</artifactId>
<type>pom</type>
</dependency>
</dependencies>
如需更多信息,请参见《JBoss EAP
开发指南》中有关将 Maven 与 JBoss EAP
搭配使用的章节
。
创建日志记录器的属性文件。将它命名为
logging.properties
并将其保存到已知位置。以下是属性文件示例:
有关在客户端上配置日志记录选项的更多信息
,请参阅有关在 JBoss EAP
开发指南中记录的章节
。
# Root logger option
loggers=org.jboss.logging,org.apache.activemq.artemis.core.server,org.apache.activemq.artemis.utils,org.apache.activemq.artemis.journal,org.apache.activemq.artemis.jms,org.apache.activemq.artemis.ra
# Root logger level
logger.level=INFO
# Apache ActiveMQ Artemis logger levels
logger.org.apache.activemq.artemis.jms.level=INFO
logger.org.apache.activemq.artemis.journal.level=INFO
logger.org.apache.activemq.artemis.utils.level=INFO
logger.org.apache.activemq.artemis.core.server.level=INFO
# Root logger handlers
logger.handlers=FILE
# File handler configuration
handler.FILE=org.jboss.logmanager.handlers.FileHandler
handler.FILE.level=FINE
handler.FILE.properties=autoFlush,fileName
handler.FILE.autoFlush=true
handler.FILE.fileName=activemq.log
handler.FILE.formatter=PATTERN
# Formatter pattern configuration
formatter.PATTERN=org.jboss.logmanager.formatters.PatternFormatter
formatter.PATTERN.properties=pattern
formatter.PATTERN.pattern=%d{HH:mm:ss,SSS} %-5p [%c] %s%E%n
使用预期参数启动客户端。使用
java
命令启动客户端代码时,添加以下参数:
将 JBoss 客户端和日志记录器 JAR 添加到类路径中:
-cp /PATH/TO/jboss-client.jar:/PATH/TO/jboss-logmanager.jar
启用 JBoss 日志记录管理器:
-Djava.util.logging.manager=org.jboss.logmanager.LogManager
设置日志记录属性文件的位置:
-Dlogging.configuration=/PATH/TO/logging.properties
启动客户端的完整命令将类似以下示例:
$ java -Djava.util.logging.manager=org.jboss.logmanager.LogManager -Dlogging.configuration=/PATH/TO/logging.properties -cp /PATH/TO/jboss-client.jar:/PATH/TO/jboss-logmanager.jar org.example.MyClient
messaging-activemq
子系统具有多个可配置的选项,这些选项控制消息的发送方式和时间、应进行的尝试数以及消息过期的时间。这些配置选项都存在于
<address-setting>
配置元素中。您可以使用通配符语法将 JBoss EAP 配置为将单个
<address-setting>
应用到多个目的地。
通配符可用于将相似的地址与单个语句匹配,很像有多少系统使用星号字符
*
将多个文件或字符串与单个查询匹配。下表列出了可用于定义
<address-setting>
的特殊字符。
表 6.1. JMS Wildcard Syntax
| 字符 | 描述 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
.(单个句点) 表示通配符表达式中词语之间的空格. #(井号或井号) 匹配由零个或多个词语组成的任意序列。 *(星号) 匹配单个单词。 下表中的示例说明了如何使用通配符匹配一组地址。 表 6.2. JMS Wildcard 示例
6.2. 默认 address-setting
开箱即用,JBoss EAP 包含了单一
<subsystem xmlns="urn:jboss:domain:messaging-activemq:4.0">
<server name="default">
<address-setting
name="#"
dead-letter-address="jms.queue.DLQ"
expiry-address="jms.queue.ExpiryQueue"
max-size-bytes="10485760"
page-size-bytes="2097152"
message-counter-history-day-limit="10" />
</server>
</subsystem>
注意
对
使用管理 CLI 配置地址设置配置地址设置可使用管理 CLI 或管理控制台进行,但管理 CLI 会公开更多用于编辑的配置属性。 有关属性的完整列表,请参阅本指南附录中的地址设置属性 。 添加新 address-setting
如果需要,使用
/subsystem=messaging-activemq/server=default/address-setting=news.europe.#/:add(dead-letter-address=DLQ.news) /profile=full/subsystem=messaging-activemq/server=default/address-setting=news.europe.#/:add(dead-letter-address=DLQ.news) 编辑 address-setting 属性
使用
/subsystem=messaging-activemq/server=default/address-setting=news.europe.#/:write-attribute(name=max-delivery-attempts,value=10) /profile=full/subsystem=messaging-activemq/server=default/address-setting=news.europe.#/:write-attribute(name=max-delivery-attempts,value=10) 读取 address-setting 属性
使用 include-
/subsystem=messaging-activemq/server=default/address-setting=news.europe.#/:read-resource(include-runtime=true) /profile=full/subsystem=messaging-activemq/server=default/address-setting=news.europe.#/:read-resource(include-runtime=true) 使用管理控制台配置地址设置
您可以按照以下步骤使用管理控制台创建和查看地址设置:
登录管理控制台。
选择屏幕顶部的
Configuration
选项卡。运行受管域时,选择要更新的配置集。
选择
Messaging(ActiveMQ)
→
Server
。
选择消息传递服务器。在默认配置中,仅显示一个名为
为消息传递服务器配置全局资源使用量
6.3. last-value Queues最后值队列是特殊队列,当将值相同的新消息放入队列中时,丢弃任何消息。换句话说,最后一个值队列仅保留最后一个值。最后值队列的典型应用可能涉及股票价格,您仅对特定股票的最新价格感兴趣。 如果队列启用了分页,则最后值队列将无法正常工作。 务必在使用最后值队列之前禁用分页 。 配置 Last-value Queues
last-value 队列在
<address-setting name="jms.queue.lastValueQueue" last-value-queue="true" />
使用管理 CLI 为给定
/subsystem=messaging-activemq/server=default/address-setting=news.europe.#:read-attribute(name=last-value-queue)
"outcome" => "success",
"result" => false
第 7 章 配置安全性7.1. 保护远程连接7.1.1. 使用传统安全子系统
您可以使用 JBoss EAP 中的传统
<management>
<security-realms>
<security-realm name="ApplicationRealm">
<authentication>
<local default-user="$local" allowed-users="*" skip-group-loading="true"/>
<properties
path="application-users.properties"
relative-to="jboss.server.config.dir" />
</authentication>
<authorization>
<properties
path="application-roles.properties"
relative-to="jboss.server.config.dir" />
</authorization>
</security-realm>
</security-realms>
</management>
顾名思义,
/subsystem=messaging-activemq/server=default:read-attribute(name=security-domain)
"outcome" => "success",
"result" => "other"
您还可以更新使用哪个安全域:
7.1.2. 使用 Elytron 子系统
您也可以使用
/subsystem=messaging-activemq/server=default:undefine-attribute(name=security-domain) 设置 Elytron 安全域。 /subsystem=messaging-activemq/server=default:write-attribute(name=elytron-domain, value=myElytronSecurityDomain) reload 7.1.2.1. 使用管理控制台设置 Elytron 安全域
使用管理控制台设置 Elytron 安全域:
访问管理控制台。如需更多信息,请参阅 JBoss EAP
配置指南中的管理控制台
。
导航到
Configuration
→
Subsystems
→
Messaging(ActiveMQ)
→
Server
→
default
,然后点
View
。
导航到
Security
选项卡,再单击
Edit
。
添加或编辑
Elytron Domain
的值。
单击
Save 以保存更改
。
重新加载服务器以使更改生效。
您只能定义
7.1.3. 保护传输
默认情况下,JBoss EAP 消息传递捆绑的默认
7.1.4. 保护远程连接器
如果您没有使用默认的
/subsystem=messaging-activemq/server=default/remote-acceptor=mySslAcceptor:add(socket-binding=netty,params={ssl-enabled=true, key-store-path=PATH/TO/server.jks, key-store-password=${VAULT::server-key::key-store-password::sharedKey}})
要根据以上用例创建
/subsystem=messaging-activemq/server=default/remote-connector=mySslConnector:add(socket-binding=netty,params={ssl-enabled=true, useDefaultSslContext=true})
管理 CLI 还允许您在已存在的
/subsystem=messaging-activemq/server=default/remote-connector=myOtherSslConnector:map-put(name=params,key=ssl-enabled,value=true)
请注意,
表 7.1.
7.2. 保护目标
除了保护远程连接到消息传递服务器外,您还可以配置特定目的地的安全性。这可以通过使用
/subsystem=messaging-activemq/server=default:read-resource(recursive=true)
"outcome" => "success",
"result" => {
"security-setting" => {"#" => {"role" => {"guest" => {
"consume" => true,
"create-durable-queue" => false,
"create-non-durable-queue" => true,
"delete-durable-queue" => false,
"delete-non-durable-queue" => true,
"manage" => false,
"send" => true
7.3. 控制 JMS 对象序列化
由于
/subsystem=messaging-activemq/server=default/connection-factory=RemoteConnectionFactory:write-attribute(name=deserialization-black-list,value=[my.untrusted.package,another.untrusted.package]) /subsystem=messaging-activemq/server=default/pooled-connection-factory=activemq-ra:write-attribute(name=deserialization-white-list,value=[my.trusted.package])
这些命令在
<connection-factory name="RemoteConnectionFactory" entries="java:jboss/exported/jms/RemoteConnectionFactory" connectors="http-connector" ha="true" block-on-acknowledge="true" reconnect-attempts="-1" deserialization-black-list="my.untrusted.package another.untrusted.package"/> <pooled-connection-factory name="activemq-ra" entries="java:/JmsXA java:jboss/DefaultJMSConnectionFactory" connectors="in-vm" deserialization-white-list="my.trusted.package" transaction="xa"/>
有关连接工厂和池连接工厂的详情,请参考本指南中的配置连接工厂
。
您还可以通过配置激活属性在 MDB 中指定哪些对象可以被反序列化。
7.4. 授权无效管理
messaging
/subsystem=messaging-activemq/server=default:read-attribute(name=security-invalidation-interval)
"outcome" => "success",
"result" => 10000L
第 8 章 配置消息传递传输本节介绍理解 JBoss EAP 消息传递传输的关键概念,特别是连接器和接收器。服务器上使用接收器来定义其如何接受连接,而客户端则使用连接器来定义其如何连接到服务器。逐个讨论每个概念,一个实用示例演示了客户端如何使用 JNDI 或核心 API 连接 JBoss EAP 消息传递服务器。 8.1. 接收器和连接器类型
JBoss EAP 配置中定义了三种主要类型的接收器和连接器:
/subsystem=messaging-activemq/server=default:read-children-resources(child-type=http-connector,include-runtime=true)
所有
/subsystem=messaging-activemq/server=default:read-children-resources(child-type=http-acceptor,include-runtime=true)
其他接收器和连接器类型遵循相同的语法。仅向
8.2. 接收器
接收器定义 JBoss EAP 集成消息传递服务器接受哪些类型的连接。您可以定义每台服务器任意数量的接收器。以下示例配置是从默认的
<subsystem xmlns="urn:jboss:domain:messaging-activemq:4.0">
<server name="default">
<http-acceptor name="http-acceptor" http-listener="default"/>
<remote-acceptor name="legacy-messaging-acceptor" socket-binding="legacy-messaging"/>
<in-vm-acceptor name="in-vm" server-id="0"/>
</server>
</subsystem>
在上述配置中,http
<subsystem xmlns="urn:jboss:domain:undertow:10.0">
<server name="default-server">
<http-listener name="default" redirect-socket="https" socket-binding="http"/>
</server>
</subsystem>
另请注意,上面的
<server xmlns="urn:jboss:domain:8.0">
<socket-binding-group name="standard-sockets" default-interface="public" port-offset="${jboss.socket.binding.port-offset:0}">
<socket-binding name="legacy-messaging" port="5445"/>
</socket-binding-group>
</server>
在本例中,
8.3. 连接器
连接器定义如何连接集成 JBoss EAP 消息传递服务器,供客户端用于连接。
您可能会知道为什么服务器上定义了连接器(当客户端实际使用时)。原因包括:
在某些情况下,当服务器连接到其他服务器时,它可能充当客户端。例如,一个服务器可能充当另一台服务器的桥梁,或者它可能希望参与到群集中。在这种情况下,服务器需要了解如何连接到其他服务器,并通过连接器定义。
服务器可以使用
<subsystem xmlns="urn:jboss:domain:messaging-activemq:4.0">
<server name="default">
<http-connector name="http-connector" endpoint="http-acceptor" socket-binding="http" server-name="messaging-server-1"/>
<remote-connector name="legacy-remoting-connector" socket-binding="legacy-remoting"/>
<in-vm-connector name="in-vm" server-id="0"/>
</server>
</subsystem>
与
AMQ121005: Invalid "host" value "0.0.0.0" detected for "connector" connector. Switching to <HOST_NAME>. If this new address is incorrect please manually configure the connector to use the proper one.
这是因为远程连接器无法使用
8.4. 配置接受器和连接器
连接器和接收器有许多配置选项。它们在配置中显示为子
/subsystem=messaging-activemq/server=default/remote-connector=myRemote:map-put(name=params,key=foo,value=bar) 使用类似语法检索参数值。 /subsystem=messaging-activemq/server=default/remote-connector=myRemote:map-get(name=params,key=foo)
"outcome" => "success",
"result" => "bar"
您还可以在创建接收器或连接器时包含参数,如下例所示。
8.5. 连接到服务器
如果要将客户端连接到服务器,您必须有一个正确的连接器。有两种方法可以做到这一点。您可以使用服务器上配置的 ConnectionFactory,可通过 JNDI 查找获取。或者,也可以使用 ActiveMQ Artemis 核心 API,并在客户端上配置整个
8.5.1. JMS 连接事实
客户端可以使用 JNDI 来查找提供服务器连接的 ConnectionFactory 对象。连接事实可以公开三种连接器类型中的每种类型:
远程客户端可以使用
<subsystem xmlns="urn:jboss:domain:messaging-activemq:4.0">
<server name="default">
[...]
<http-connector name="http-connector" socket-binding="http" endpoint="http-acceptor" />
<http-connector name="http-connector-throughput" socket-binding="http" endpoint="http-acceptor-throughput">
<param name="batch-delay" value="50"/>
</http-connector>
<in-vm-connector name="in-vm" server-id="0"/>
[...]
<connection-factory name="InVmConnectionFactory" connectors="in-vm" entries="java:/ConnectionFactory" />
<pooled-connection-factory name="activemq-ra" transaction="xa" connectors="in-vm" entries="java:/JmsXA java:jboss/DefaultJMSConnectionFactory"/>
[...]
</server>
</subsystem>
工厂的
8.5.2. 使用 JNDI 连接到服务器
如果客户端驻留在与服务器相同的 JVM 中,它可以使用
<connection-factory name="InVmConnectionFactory" entries="java:/ConnectionFactory" connectors="in-vm" />
注意
InitialContext ctx = new InitialContext();
ConnectionFactory cf = (ConnectionFactory)ctx.lookup("ConnectionFactory");
Connection connection = cf.createConnection();
远程客户端使用
<connection-factory name="RemoteConnectionFactory" scheduled-thread-pool-max-size="10" entries="java:jboss/exported/jms/RemoteConnectionFactory" connectors="http-connector"/>
远程客户端应忽略
final Properties env = new Properties();
env.put(Context.INITIAL_CONTEXT_FACTORY, "org.wildfly.naming.client.WildFlyInitialContextFactory");
env.put(Context.PROVIDER_URL, "http-remoting://remotehost:8080");
InitialContext remotingCtx = new InitialContext(env);
ConnectionFactory cf = (ConnectionFactory) remotingCtx.lookup("jms/RemoteConnectionFactory");
注意
<dependencies>
<dependency>
<groupId>org.wildfly</groupId>
<artifactId>wildfly-jms-client-bom</artifactId>
<type>pom</type>
</dependency>
</dependencies>
8.5.3. 使用 Core API 连接到服务器您可以使用 Core API 进行客户端连接,而无需 JNDI 查找。使用核心 API 的客户端在其类路径中要求客户端 JAR,就像基于 JNDI 的客户端一样。 ServerLocator
客户端使用
ServerLocator locator = ActiveMQClient.createServerLocatorWithoutHA(new TransportConfiguration(InVMConnectorFactory.class.getName())); ClientSessionFactory
客户端使用
ClientSessionFactory factory = locator.createClientSessionFactory(); ClientSession
客户端使用客户端
ClientSession session = factory.createSession(); 以下简单示例重点介绍了刚刚讨论的一些内容: ServerLocator locator = ActiveMQClient.createServerLocatorWithoutHA(
new TransportConfiguration( InVMConnectorFactory.class.getName()));
// In this simple example, we just use one session for both
// producing and consuming
ClientSessionFactory factory = locator.createClientSessionFactory();
ClientSession session = factory.createSession();
// A producer is associated with an address ...
ClientProducer producer = session.createProducer("example");
ClientMessage message = session.createMessage(true);
message.getBodyBuffer().writeString("Hello");
// We need a queue attached to the address ...
session.createQueue("example", "example", true);
// And a consumer attached to the queue ...
ClientConsumer consumer = session.createConsumer("example");
// Once we have a queue, we can send the message ...
producer.send(message);
// We need to start the session before we can -receive- messages ...
session.start();
ClientMessage msgReceived = consumer.receive();
System.out.println("message = " + msgReceived.getBodyBuffer().readString());
session.close();
8.6. 通过负载均衡器的消息传递将 JBoss EAP 用作负载平衡器时,客户端可以调用静态 Undertow HTTP 负载平衡器后或 mod_cluster 负载平衡器后面的消息传递服务器。 要支持通过静态负载均衡器调用消息传递服务器的消息传递客户端的配置必须满足以下要求: 将 JBoss EAP 用作负载平衡器时,您必须使用 HTTP 或 HTTPS 配置负载平衡器。AJP 不支持消息传递负载平衡器。 有关将 Undertow 配置为静态负载平衡器的详细信息,请参阅《JBoss EAP 配置指南》中的将 Undertow 配置为静态负载平衡器 。 如果在负载平衡器后面的消息传递服务器上进行 JNDI 查找,您必须配置后端消息传递工作程序 。 连接到负载平衡器的客户端必须重复使用与负载平衡器的初始连接,以确保它们与同一服务器通信。连接到负载均衡器的客户端不能使用集群拓扑连接到负载均衡器。使用集群拓扑可能会导致消息发送到其他服务器,这可能会导致事务处理中断。 有关使用 mod_cluster 将 Undertow 配置为负载平衡器的详细信息,请将 Undertow 配置为使用 mod_cluster 的负载平衡器 。 配置消息客户端以通过负载均衡器进行通信
连接到负载均衡器的客户端必须配置为重复使用初始连接,而不是使用集群拓扑连接到负载均衡器。
重新使用初始连接可确保客户端连接到同一服务器。使用集群拓扑可能会导致消息定向到不同的服务器,这可能会导致事务处理中断。
用于连接负载平衡器的连接工厂或池式连接工厂必须通过属性
/subsystem=messaging-activemq/pooled-connection-factory=remote-artemis:write-attribute(name=use-topology-for-load-balancing, value=false) 配置后端 worker只有在负载均衡器后计划进行 JNDI 查找时,您必须配置后端消息传递工作程序。 创建一个新的出站套接字绑定,以指向负载平衡服务器。 /socket-binding-group=standard-sockets/remote-destination-outbound-socket-binding=balancer-binding:add(host=load_balance.example.com,port=8080) 创建一个 HTTP 连接器来引用负载平衡服务器套接字绑定。 /subsystem=messaging-activemq/server=default/http-connector=balancer-connector:add(socket-binding=balancer-binding, endpoint=http-acceptor) 将 HTTP 连接器添加到客户端使用的连接工厂。 /subsystem=messaging-activemq/server=default/connection-factory=RemoteConnectionFactory:write-attribute(name=connectors,value=[balancer-connector]) 确保您将客户端配置为重复使用初始连接: /subsystem=messaging-activemq/server=default/connection-factory=RemoteConnectionFactory:write-attribute(name=use-topology-for-load-balancing,value=false) 第 9 章 配置连接事实
默认情况下,JBoss EAP
基本连接事实
<subsystem xmlns="urn:jboss:domain:messaging-activemq:4.0">
<server name="default">
<connection-factory name="InVmConnectionFactory" connectors="in-vm" entries="java:/ConnectionFactory"/>
<connection-factory name="RemoteConnectionFactory" connectors="http-connector" entries="java:jboss/exported/jms/RemoteConnectionFactory"/>
</server>
</subsystem>
有关不同类型的连接器的更多信息,请参阅 Acceptors 和 Connectors 部分。 添加连接事实
您可以使用以下管理 CLI 命令添加新连接工厂:在添加连接工厂时,您必须提供
/subsystem=messaging-activemq/server=default/connection-factory=MyConnectionFactory:add(entries=[java:/MyConnectionFactory],connectors=[in-vm]) 配置连接事实您可以使用管理 CLI 更新连接工厂的设置。 /subsystem=messaging-activemq/server=default/connection-factory=MyConnectionFactory:write-attribute(name=thread-pool-max-size,value=40) 有关连接工厂可用属性的信息,请参阅 Connection Factory Attributes 。 删除连接事实您可以使用管理 CLI 删除连接工厂。 /subsystem=messaging-activemq/server=default/connection-factory=MyConnectionFactory:remove 池的连接事实
JBoss EAP
<subsystem xmlns="urn:jboss:domain:messaging-activemq:4.0">
<server name="default">
<pooled-connection-factory name="activemq-ra" transaction="xa" entries="java:/JmsXA java:jboss/DefaultJMSConnectionFactory" connectors="in-vm"/>
</server>
</subsystem>
池连接工厂有几个独特的特征: 虽然它可以配置为指向远程服务器,但只能供本地客户端使用。有关连接到远程 ActiveMQ Artemis 服务器的更多信息,请参阅 使用集成 Artemis 资源适配器进行远程连接 。 只有在查找 JNDI 或注入时,它才应用于发送消息。 它可以配置为使用安全凭据,这在指向安全远程服务器时非常有用。 从它获取的资源将自动包含在任何正在进行的 JTA 交易中。 添加池连接事实
您可以使用以下管理 CLI 命令添加新池连接工厂:在添加连接工厂时,您必须提供
/subsystem=messaging-activemq/server=default/pooled-connection-factory=MyPooledConnectionFactory:add(entries=[java:/MyPooledConnectionFactory],connectors=[in-vm]) 配置池连接事实您可以使用管理 CLI 更新池连接工厂的设置。 /subsystem=messaging-activemq/server=default/pooled-connection-factory=MyPooledConnectionFactory:write-attribute(name=max-retry-interval,value=3000)
如需有关池连接工厂可用属性的信息,请参阅池式连接工厂属性
。
您可以通过将 enlistment
/subsystem=messaging-activemq/server=default/pooled-connection-factory=MyPooledConnectionFactory:write-attribute(name=enlistment-trace,value=false)
警告
禁用加入跟踪会使在事务注册期间跟踪错误变得更加困难。 您还可以配置池化连接工厂使用的受管理连接池实施。如需更多信息,请参阅 JBoss EAP 配置指南中的配置管理连接池 一节 。 删除池的连接事实您可以使用管理 CLI 删除池连接工厂。 /subsystem=messaging-activemq/server=default/pooled-connection-factory=MyPooledConnectionFactory:remove 第 10 章 配置持久性10.1. 关于 JBoss EAP 7 Messaging 中的持久性
JBoss EAP 随附两个持久化选项,用于存储绑定数据和消息:
您可以使用默认的基于文件的日志,该日志针对消息传递用例进行了高度优化
,可提供出色的性能。默认情况下会提供这个选项,如果您不进行任何附加配置,则使用此选项。
您可以将数据存储在
JDBC 数据存储中
,该数据存储使用 JDBC 连接到您选择的数据库。此选项要求在服务器配置文件中配置
10.2. 使用默认文件日志的消息传递日志持久性JBoss EAP 消息传递附带了高性能、基于文件的日志,针对消息传递进行了优化。 JBoss EAP 消息传递日志具有可配置的文件大小且仅附加,这可通过启用单写操作来提高性能。它由磁盘上的一组文件组成,这些文件最初会预先创建成固定大小并填写 padding。在执行添加消息、删除消息和更新消息等服务器操作时,操作的记录将附加到日志中,直到日志文件已满,此时使用下一个日志文件。 复杂的垃圾收集算法决定了在所有数据都被删除后是否可以回收和重新使用日志文件。紧凑算法从日志文件中删除死空间并压缩数据。 日志还完全支持本地和 XA 事务。 10.2.1. 消息传递日志文件系统实施大多数日志用 Java 编写,但已提取了与文件系统的交互,以允许不同的可插拔实施。JBoss EAP 消息传递随附两种实施为:
|