使用 AMQ JMS 池库

Red Hat AMQ Clients 2.11

使用 AMQ 客户端 2.11

摘要

本指南介绍了如何安装和配置库,运行实践示例,并将您的客户端与其他 AMQ 组件一起使用。

使开源包含更多

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。我们从这四个术语开始:master、slave、黑名单和白名单。由于此项工作十分艰巨,这些更改将在即将推出的几个发行版本中逐步实施。有关更多详情,请参阅我们的首席技术官 Chris Wright 提供的消息

第 1 章 概述

AMQ JMS Pool 是一个库,提供 JMS 连接、会话和消息制作者缓存。它启用了在 JMS API 定义的标准生命周期外重复利用连接资源。

AMQ JMS Pool 作为标准 JMS ConnectionFactory 实例运行,它打包了您选择的 JMS 提供程序的 ConnectionFactory,并根据 JMS 池的配置管理该提供程序中的 连接 对象生命周期。它可以配置为在调用者间共享一个或多个连接,到池 createConnection () 方法。

AMQ JMS 池是 AMQ 客户端的一部分,这是支持多种语言和框架的消息传递库。有关客户端的概述,请参阅 AMQ 客户端概述。有关此发行版本的信息,请参阅 AMQ 客户端 2.11 发行注记

AMQ JMS 池基于池的 JMS 消息传递库。

1.1. 主要特性

  • JMS 1.1 和 2.0 兼容
  • 自动重新连接
  • 可配置连接和会话池大小

1.2. 支持的标准和协议

AMQ JMS Pool 支持 Java 消息服务 API 的版本 2.0。

1.3. 文档惯例

sudo 命令

在本文档中,sudo 用于任何需要 root 特权的命令。使用 sudo 时谨慎谨慎,因为任何更改都可能会影响整个系统。有关 sudo 的详情,请参考使用 sudo 命令

文件路径

在本文档中,所有文件路径都对 Linux、UNIX 和类似操作系统(例如 /home/andrea)有效。在 Microsoft Windows 上,您必须使用对等的 Windows 路径(例如,C:\Users\andrea)。

变量文本

本文档包含代码块,需要使用特定于您的环境的值替换的变量。变量文本括在大括号中,并像 monospace 那样样式。例如,在以下命令中,将 &lt ;project-dir& gt; 替换为您环境的值:

$ cd <project-dir>

第 2 章 安装

本章会指导您在环境中安装 AMQ JMS Pool 的步骤。

2.1. 先决条件

  • 您必须有访问 AMQ 发行版本文件和软件仓库 的订阅
  • 要使用 AMQ JMS Pool 构建程序,您必须安装 Apache Maven
  • 要使用 AMQ JMS Pool,您必须安装 Java。

2.2. 使用 Red Hat Maven 存储库

配置 Maven 环境,以从红帽 Maven 存储库下载客户端库。

流程

  1. 将红帽存储库添加到 Maven 设置或 POM 文件中。有关配置文件示例,请参考 第 B.1 节 “使用在线存储库”

    <repository>
      <id>red-hat-ga</id>
      <url>https://maven.repository.redhat.com/ga</url>
    </repository>
  2. 将库依赖项添加到您的 POM 文件中。

    <dependency>
      <groupId>org.messaginghub</groupId>
      <artifactId>pooled-jms</artifactId>
      <version>2.0.4.redhat-00001</version>
    </dependency>

客户端现在包括在您的 Maven 项目中。

2.3. 安装本地 Maven 存储库

作为在线存储库的替代选择,可将 AMQ JMS Pool 作为基于文件的 Maven 存储库安装到本地文件系统中。

流程

  1. 使用您的订阅 下载 AMQ 客户端 2.11.0 JMS Pool Maven 存储库 .zip 文件。
  2. 将文件内容提取到您选择的目录中。

    在 Linux 或 UNIX 上,使用 unzip 命令提取文件内容。

    $ unzip amq-clients-2.11.0-jms-pool-maven-repository.zip

    在 Windows 上,右键单击 .zip 文件,然后选择 Extract All

  3. 配置 Maven,以使用提取的安装目录中的 maven-repository 目录中的存储库。更多信息请参阅 第 B.2 节 “使用本地存储库”

2.4. 安装示例

流程

  1. 使用 git clone 命令将源存储库克隆到名为 pooled-jms 的本地目录中:

    $ git clone https://github.com/messaginghub/pooled-jms.git pooled-jms
  2. 进入 pooled-jms 目录,并使用 git checkout 命令切换到 2.0.4 分支:

    $ cd pooled-jms
    $ git checkout 2.0.4

生成的本地目录在本文档中称为 < source-dir& gt;。

第 3 章 开始使用

本章介绍了设置环境并运行简单的消息传递程序的步骤。

3.1. 先决条件

3.2. 运行 Hello World

Hello World 示例调用 createConnection (),用于字符串"Hello World"的每个字符,一次传输一个。由于 AMQ JMS 池正在使用中,因此每个调用重复利用相同的底层 JMS Connection 对象。

流程

  1. 在 < source-dir> /pooled-jms-examples 目录中运行以下命令来使用 Maven 来构建示例。

    $ mvn clean package dependency:copy-dependencies -DincludeScope=runtime -DskipTests

    添加 dependency:copy-dependencies 会导致将依赖项 复制到目标/独立 目录中。

  2. 使用 java 命令运行示例。

    在 Linux 或 UNIX 中:

    $ java -cp "target/classes:target/dependency/*" org.messaginghub.jms.example.HelloWorld

    在 Windows 中:

    > java -cp "target\classes;target\dependency\*" org.messaginghub.jms.example.HelloWorld

在 Linux 中运行它会产生以下输出:

$ java -cp "target/classes/:target/dependency/*" org.messaginghub.jms.example.HelloWorld
2018-05-17 11:04:23,393 [main           ] - INFO  JmsPoolConnectionFactory       - Provided ConnectionFactory is JMS 2.0+ capable.
2018-05-17 11:04:23,715 [localhost:5672]] - INFO  SaslMechanismFinder            - Best match for SASL auth was: SASL-ANONYMOUS
2018-05-17 11:04:23,739 [localhost:5672]] - INFO  JmsConnection                  - Connection ID:104dfd29-d18d-4bf5-aab9-a53660f58633:1 connected to remote Broker: amqp://localhost:5672
Hello World

示例的源代码位于 < source-dir> /pooled-jms-examples/src/main/java 目录中。JNDI 和 logging 配置位于 < source-dir&gt; /pooled-jms-examples/src/main/resources 目录中。

第 4 章 配置

AMQ JMS Pool ConnectionFactory 实施公开多个配置选项,它们控制池的行为及其管理的 JMS 资源。

配置选项 以设置 方法的形式在 JmsPoolConnectionFactory 对象上公开。例如,使用 setMaxConnections (int) 方法设置 maxConnections 选项。

4.1. 连接选项

这些选项会影响 JMS 池在池中创建和管理连接的方式。

pooled ConnectionFactory 为用于创建连接的每个用户和密码组合创建一个连接池,以及用于以及用于用户名和密码的单独池。如果您需要更精细地将连接划分到池中,您必须明确创建不同的池实例。

maxConnections
单个池的最大连接数。默认值为 1。
connectionIdleTimeout
目前不在 loan 上的连接前的时间(以毫秒为单位)可以从池中驱除。默认值为 30 秒。0 代表禁用超时。
connectionCheckInterval
定期检查过期连接之间的时间(以毫秒为单位)。默认值为 0,表示检查被禁用。
useProviderJMSContext

如果启用,则使用底层 JMS 提供程序的 JMSContext 类。它默认是禁用的。

在正常操作中,池使用自己的通用 JMSContext 实施来嵌套池中的连接,而不使用提供程序实施。通用实施可能对提供程序实施没有限制。但是,启用后,来自 JMSContext API 的连接不会由池管理。

4.2. 会话选项

这些选项会影响从池连接创建的会话行为。

maxSessionsPerConnection

每个连接的最大会话数。默认值为 500。负值会删除任何限制。

如果超过了限制,则 createSession () 块或抛出异常,具体取决于配置。

blockIfSessionPoolIsFull

如果启用,block createSession () 直到池中有会话可用。它会被默认启用。

如果禁用,则调用 createSession () 会抛出 IllegalStateException (如果没有会话可用)。

blockIfSessionPoolIsFullTimeout
阻塞调用 createSession () 前的时间(以毫秒为单位)抛出 IllegalStateException。默认值为 -1,即调用块。
useAnonymousProducers

如果启用,请将单个匿名 JMS MessageProducer 用于创建Producer () 的所有调用。它会被默认启用。

在个别情况下,这个行为不可取。如果禁用,则每个对 createProducer () 的调用都会生成一个新的 MessageProducer 实例。

第 5 章 例子

本章演示了通过示例程序使用 AMQ JMS 池。

有关更多示例,请参阅 池的 JMS 示例

5.1. 先决条件

5.2. 建立连接

本例创建一个新的连接池,将其绑定到连接工厂,并使用池创建新连接。

示例:建立连接 - Connect.java

package net.example;

import javax.jms.Connection;
import javax.jms.ConnectionFactory;
import org.apache.qpid.jms.JmsConnectionFactory;
import org.messaginghub.pooled.jms.JmsPoolConnectionFactory;

public class Connect {
    public static void main(String[] args) throws Exception {
        if (args.length != 1) {
            System.err.println("Usage: Connect <connection-uri>");
            System.exit(1);
        }

        String connUri = args[0];

        ConnectionFactory factory = new JmsConnectionFactory(connUri);
        JmsPoolConnectionFactory pool = new JmsPoolConnectionFactory();

        try {
            pool.setConnectionFactory(factory);

            Connection conn = pool.createConnection();

            conn.start();

            try {
                System.out.println("CONNECT: Connected to '" + connUri + "'");
            } finally {
                conn.close();
            }
        } finally {
            pool.stop();
        }
    }
}

5.3. 配置池

本例演示了设置连接和会话配置选项。

示例:配置池 - ConnectWithConfiguration.java

package net.example;

import javax.jms.Connection;
import javax.jms.ConnectionFactory;
import org.apache.qpid.jms.JmsConnectionFactory;
import org.messaginghub.pooled.jms.JmsPoolConnectionFactory;

public class ConnectWithConfiguration {
    public static void main(String[] args) throws Exception {
        if (args.length != 1) {
            System.err.println("Usage: ConnectWithConfiguration <connection-uri>");
            System.exit(1);
        }

        String connUri = args[0];

        ConnectionFactory factory = new JmsConnectionFactory(connUri);
        JmsPoolConnectionFactory pool = new JmsPoolConnectionFactory();

        try {
            pool.setConnectionFactory(factory);

            // Set the max connections per user to a higher value
            pool.setMaxConnections(5);

            // Create a MessageProducer for each createProducer() call
            pool.setUseAnonymousProducers(false);

            Connection conn = pool.createConnection();

            conn.start();

            try {
                System.out.println("CONNECT: Connected to '" + connUri + "'");
            } finally {
                conn.close();
            }
        } finally {
            pool.stop();
        }
    }
}

5.4. 运行示例

要编译和运行示例程序,请使用以下流程:

流程

  1. 创建新项目目录。在以下步骤中,这称为 & lt;project-dir >。
  2. 将示例 Java 列表复制到以下位置:

    <project-dir>/src/main/java/net/example/Connect.java
    <project-dir>/src/main/java/net/example/ConnectWithConfiguration.java
  3. 使用文本编辑器创建一个新的 < project-dir>/pom.xml 文件。在其中添加以下 XML:

    <project>
      <modelVersion>4.0.0</modelVersion>
    
      <groupId>net.example</groupId>
      <artifactId>example</artifactId>
      <version>1.0.0-SNAPSHOT</version>
    
      <dependencies>
        <dependency>
          <groupId>org.messaginghub</groupId>
          <artifactId>pooled-jms</artifactId>
          <version>2.0.4.redhat-00001</version>
        </dependency>
        <dependency>
          <groupId>org.apache.qpid</groupId>
          <artifactId>qpid-jms-client</artifactId>
          <version>${qpid-jms-version}</version>
        </dependency>
      </dependencies>
    </project>

    ${qpid-jms-version} 替换为您首选的 Qpid JMS 版本。

  4. 更改到项目目录,并使用 mvn 命令编译程序。

    mvn clean package dependency:copy-dependencies -DincludeScope=runtime -DskipTests

    添加 dependency:copy-dependencies 会导致将依赖项 复制到目标/独立 目录中。

  5. 使用 java 命令运行程序。

    在 Linux 或 UNIX 中:

    java -cp "target/classes:target/dependency/*" net.example.Connect amqp://localhost

    在 Windows 中:

    java -cp "target\classes;target\dependency\*" net.example.Connect amqp://localhost

这些示例命令运行 Connect 示例。要运行另一个示例,请将 Connect 替换为所需示例的类名称。

在 Linux 上运行 连接 示例会产生以下输出:

$ java -cp "target/classes:target/dependency/*" net.example.Connect amqp://localhost
CONNECT: Connected to 'amqp://localhost'

附录 A. 使用您的订阅

AMQ 通过软件订阅提供。要管理您的订阅,请访问红帽客户门户中的帐户。

A.1. 访问您的帐户

流程

  1. 转至 access.redhat.com
  2. 如果您还没有帐户,请创建一个帐户。
  3. 登录到您的帐户。

A.2. 激活订阅

流程

  1. 转至 access.redhat.com
  2. 导航到 My Subscriptions
  3. 导航到 激活订阅 并输入您的 16 位激活号。

A.3. 下载发行文件

要访问 .zip、.tar.gz 和其他发布文件,请使用客户门户查找要下载的相关文件。如果您使用 RPM 软件包或 Red Hat Maven 存储库,则不需要这一步。

流程

  1. 打开浏览器并登录红帽客户门户网站 产品下载页面,网址为 access.redhat.com/downloads
  2. 查找 INTEGRATION 目录中的红帽 AMQ 条目。
  3. 选择所需的 AMQ 产品。此时会打开 Software Downloads 页面。
  4. 单击组件的 Download 链接。

A.4. 为系统注册软件包

要在 Red Hat Enterprise Linux 上安装此产品的 RPM 软件包,必须注册您的系统。如果您使用下载的发行文件,则不需要这一步。

流程

  1. 转至 access.redhat.com
  2. 进入 Registration Assistant
  3. 选择您的操作系统版本,再继续到下一页。
  4. 使用您的系统终端中列出的命令完成注册。

有关注册您的系统的更多信息,请参阅以下资源之一:

附录 B. 使用 Red Hat Maven 存储库

本节论述了如何在软件中使用红帽提供的 Maven 存储库。

B.1. 使用在线存储库

红帽维护一个中央 Maven 存储库,供您的基于 Maven 的项目使用。如需更多信息,请参阅 存储库欢迎页面

将 Maven 配置为使用红帽存储库的方法有两种:

将存储库添加到您的 Maven 设置中

这个配置方法适用于您的用户拥有的所有 Maven 项目,只要您的 POM 文件没有覆盖存储库配置,且包含的配置集会被启用。

流程

  1. 找到 Maven settings.xml 文件。它通常位于用户主目录中的 .m2 目录中。如果文件不存在,请使用文本编辑器创建该文件。

    在 Linux 或 UNIX 中:

    /home/<username>/.m2/settings.xml

    在 Windows 中:

    C:\Users\<username>\.m2\settings.xml
  2. 将包含红帽存储库的新配置集添加到 settings.xml 文件的 profile 元素中,如下例所示:

    示例:包含红帽存储库的 Maven settings.xml 文件

    <settings>
      <profiles>
        <profile>
          <id>red-hat</id>
          <repositories>
            <repository>
              <id>red-hat-ga</id>
              <url>https://maven.repository.redhat.com/ga</url>
            </repository>
          </repositories>
          <pluginRepositories>
            <pluginRepository>
              <id>red-hat-ga</id>
              <url>https://maven.repository.redhat.com/ga</url>
              <releases>
                <enabled>true</enabled>
              </releases>
              <snapshots>
                <enabled>false</enabled>
              </snapshots>
            </pluginRepository>
          </pluginRepositories>
        </profile>
      </profiles>
      <activeProfiles>
        <activeProfile>red-hat</activeProfile>
      </activeProfiles>
    </settings>

有关 Maven 配置的更多信息,请参阅 Maven 设置参考

将存储库添加到您的 POM 文件中

要直接在项目中配置存储库,请在 POM 文件的 repositories 元素中添加新条目,如下例所示:

示例:包含红帽存储库的 Maven pom.xml 文件

<project>
  <modelVersion>4.0.0</modelVersion>

  <groupId>com.example</groupId>
  <artifactId>example-app</artifactId>
  <version>1.0.0</version>

  <repositories>
    <repository>
      <id>red-hat-ga</id>
      <url>https://maven.repository.redhat.com/ga</url>
    </repository>
  </repositories>
</project>

有关 POM 文件配置的更多信息,请参阅 Maven POM 参考

B.2. 使用本地存储库

红帽为其部分组件提供基于文件的 Maven 存储库。它们以可下载存档的形式交付,您可以提取到本地文件系统。

要将 Maven 配置为使用本地提取的存储库,请在 Maven 设置或 POM 文件中应用以下 XML:

<repository>
  <id>red-hat-local</id>
  <url>${repository-url}</url>
</repository>

${repository-url} 必须是包含所提取存储库本地文件系统路径的文件 URL。

表 B.1. 本地 Maven 存储库的 URL 示例

操作系统文件系统路径URL

Linux 或 UNIX

/home/alice/maven-repository

file:/home/alice/maven-repository

Windows

C:\repos\red-hat

file:C:\repos\red-hat

附录 C. 在示例中使用 AMQ Broker

AMQ JMS Pool 示例需要一个正在运行的消息代理,其中包含名为 queue 的队列。使用以下步骤安装和启动代理并定义队列。

C.1. 安装代理

按照 AMQ Broker 入门 中的内容 来安装代理 并创建代理实例。启用匿名访问。

以下流程将代理实例的位置称为 < broker-instance-dir>

C.2. 启动代理

流程

  1. 使用 artemis run 命令启动代理。

    $ <broker-instance-dir>/bin/artemis run
  2. 检查控制台输出,了解启动期间记录的任何严重错误。现在,代理日志服务器会在 就绪时处于活动状态。

    $ example-broker/bin/artemis run
               __  __  ____    ____            _
         /\   |  \/  |/ __ \  |  _ \          | |
        /  \  | \  / | |  | | | |_) |_ __ ___ | | _____ _ __
       / /\ \ | |\/| | |  | | |  _ <| '__/ _ \| |/ / _ \ '__|
      / ____ \| |  | | |__| | | |_) | | | (_) |   <  __/ |
     /_/    \_\_|  |_|\___\_\ |____/|_|  \___/|_|\_\___|_|
    
     Red Hat AMQ <version>
    
    2020-06-03 12:12:11,807 INFO  [org.apache.activemq.artemis.integration.bootstrap] AMQ101000: Starting ActiveMQ Artemis Server
    ...
    2020-06-03 12:12:12,336 INFO  [org.apache.activemq.artemis.core.server] AMQ221007: Server is now live
    ...

C.3. 创建队列

在新终端中,使用 artemis queue 命令创建名为 queue 的队列。

$ <broker-instance-dir>/bin/artemis queue create --name queue --address queue --auto-create-address --anycast

系统将提示您回答一系列的 yes 或没有问题。对于 all,都回答 N

创建队列后,代理就可以与示例程序一起使用。

C.4. 停止代理

运行完示例后,请使用 artemis stop 命令来停止代理。

$ <broker-instance-dir>/bin/artemis stop

更新于 2023-04-06

法律通告

Copyright © 2023 Red Hat, Inc.
The text of and illustrations in this document are licensed by Red Hat under a Creative Commons Attribution–Share Alike 3.0 Unported license ("CC-BY-SA"). An explanation of CC-BY-SA is available at http://creativecommons.org/licenses/by-sa/3.0/. In accordance with CC-BY-SA, if you distribute this document or an adaptation of it, you must provide the URL for the original version.
Red Hat, as the licensor of this document, waives the right to enforce, and agrees not to assert, Section 4d of CC-BY-SA to the fullest extent permitted by applicable law.
Red Hat, Red Hat Enterprise Linux, the Shadowman logo, the Red Hat logo, JBoss, OpenShift, Fedora, the Infinity logo, and RHCE are trademarks of Red Hat, Inc., registered in the United States and other countries.
Linux® is the registered trademark of Linus Torvalds in the United States and other countries.
Java® is a registered trademark of Oracle and/or its affiliates.
XFS® is a trademark of Silicon Graphics International Corp. or its subsidiaries in the United States and/or other countries.
MySQL® is a registered trademark of MySQL AB in the United States, the European Union and other countries.
Node.js® is an official trademark of Joyent. Red Hat is not formally related to or endorsed by the official Joyent Node.js open source or commercial project.
The OpenStack® Word Mark and OpenStack logo are either registered trademarks/service marks or trademarks/service marks of the OpenStack Foundation, in the United States and other countries and are used with the OpenStack Foundation's permission. We are not affiliated with, endorsed or sponsored by the OpenStack Foundation, or the OpenStack community.
All other trademarks are the property of their respective owners.