入门:创建并连接 ActiveMQ 代理 - Amazon MQ
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

入门:创建并连接 ActiveMQ 代理

代理 是运行在 Amazon MQ 上的消息代理环境。它是 Amazon MQ 的基本构建块。代理实例m5t3)和大小largemicro)的综合描述是一个代理实例类型(例如 mq.m5.large)。有关更多信息,请参阅 ActiveMQ 经纪商的亚马逊 MQ 是什么?

第 1 步:创建 ActiveMQ 代理

第一个也是最常见的 Amazon MQ 任务是创建代理。以下示例说明如何使用创建基本经纪商。 Amazon Web Services Management Console

  1. 登录 Amazon MQ 控制台

  2. Select broker engine (选择代理引擎) 页面上,选择 Apache ActiveMQ

  3. Select deployment and storage (选择部署和存储) 页面的 Deployment mode and storage type (部署模式和存储类型) 部分,执行以下操作:

    1. 选择 Deployment mode (部署模式)(例如 Active/standby broker (主动/备用代理))。有关更多信息,请参阅 适用于 ActiveMQ 经纪商的 Amazon MQ 部署选项

    2. 选择存储类型(例如,EBS)。有关更多信息,请参阅 Storage

      注意

      Amazon 在单个可用区内EBS复制数据,并且不支持 Act iveMQ 主动/ 备用部署模式。

    3. 选择下一步

  4. Configure settings (配置设置) 页面的 Details (详细信息) 部分,执行以下操作:

    1. 输入 Broker name (代理名称)

      重要

      请勿在经纪人名称中添加个人身份信息 (PII) 或其他机密或敏感信息。代理名称可供其他 Amazon 服务(包括日 CloudWatch 志)访问。代理名称不适合用于私有或敏感数据。

    2. 选择 Broker instance type (代理实例类型)(例如 mq.m5.large)。有关更多信息,请参阅 Broker instance types

  5. ActiveMQ Web Console access (ActiveMQ Web 控制台访问) 部分,提供 Username (用户名)Password (密码)。以下限制适用于代理用户名和密码:

    • 用户名只能包含字母数字字符、短划线、句点、下划线和波浪线(- . _ ~)。

    • 密码必须至少为 12 个字符,包含至少 4 个唯一字符,并且不得包含逗号、冒号或等号(,:=)。

    重要

    请勿在经纪人用户名中添加个人身份信息 (PII) 或其他机密或敏感信息。其他 Amazon 服务(包括 CloudWatch 日志)可以访问经纪人的用户名。代理用户名不适合用于私有或敏感数据。

  6. 选择部署

    当 Amazon MQ 创建您的代理时,会显示 Creation in progress (正在创建) 状态。

    创建代理大约需要 15 分钟。

    成功创建您的代理后,Amazon MQ 会显示 Running (正在运行) 状态。

  7. 选择 MyBroker.

    在存储库的 MyBroker页面,在 Connect 部分,记下您的经纪商的 ActiveMQ 网页控制台,例如:URL

    https://b-1234a5b6-78cd-901e-2fgh-3i45j6k178l9-1.mq.us-east-2.amazonaws.com:8162

    另外,请记下您代理的线级协议终端节点。以下是 OpenWire 终端节点的示例:

    ssl://b-1234a5b6-78cd-901e-2fgh-3i45j6k178l9-1.mq.us-east-2.amazonaws.com:61617

第 2 步:将 Java 应用程序连接到您的代理

创建 Amazon MQ ActiveMQ 代理后,您可以将应用程序连接到该代理。以下示例说明如何使用 Java 消息服务 (JMS) 来创建与代理的连接、创建队列和发送消息。有关完整的可用 Java 示例,请参阅Working Java Example

您可以使用各种 ActiveMQ 客户端连接到 ActiveMQ 代理。我们建议使用 ActiveMQ 客户端

先决条件

启用VPC属性

注意

您无法禁用现有 Amazon MQ 代理的公共访问权限。

为确保您的经纪人可在您的内部访问VPC,您必须启用enableDnsHostnamesenableDnsSupportVPC属性。有关更多信息,请参阅DNS《亚马逊VPC用户指南》VPC中的 Support

启用入站连接

接下来,按照以下说明为您的代理启用入站连接。

  1. 登录 Amazon MQ 控制台

  2. 从经纪人列表中,选择您的经纪商的名称(例如 MyBroker)。

  3. 在存储库的 MyBroker页面上的 “连接” 部分,记下代理的 Web 控制台和线级协议的地址URL和端口。

  4. Details (详细信息) 部分的 Security and network (安全与网络) 下,选择您的安全组名称或

    屏幕上将显示EC2控制面板的 “安全组” 页面。

  5. 从安全组列表中,选择您的安全组。

  6. 在页面底部,选择 Inbound (入站),然后选择 Edit (编辑)

  7. 编辑入站规则对话框中,为您想要公开访问的每个URL或终端节点添加一条规则(以下示例说明了如何为代理 Web 控制台执行此操作)。

    1. 选择添加规则

    2. 在 “类型” 中,选择 “自定义” TCP。

    3. 对于 Port Range (端口范围),键入 Web 控制台端口(8162)。

    4. 对于 Source (源),选择 Custom (自定义),然后键入您希望能够访问 Web 控制台的系统的 IP 地址(例如 192.0.2.1)。

    5. 选择保存

      您的代理现在可以接受入站连接。

添加 Java 依赖项

activemq-client.jaractivemq-pool.jar 程序包添加到 Java 类路径中。以下示例说明了 Maven 项目的 pom.xml 文件中的这些依赖关系。

<dependencies> <dependency> <groupId>org.apache.activemq</groupId> <artifactId>activemq-client</artifactId> <version>5.15.16</version> </dependency> <dependency> <groupId>org.apache.activemq</groupId> <artifactId>activemq-pool</artifactId> <version>5.15.16</version> </dependency> </dependencies>

有关 activemq-client.jar 的更多信息,请参阅 Apache ActiveMQ 文档中的初始配置

重要

在以下示例代码中,生产者和使用者在单个线程中运行。对于生产系统(或测试代理实例故障转移),请确保您的创建者和使用者在单独的主机或线程上运行。

创建消息创建者并发送消息

接下来,通过创建消息创建者并发送消息,验证您的代理是否可以接收消息。

  1. 使用代理的端点为消息生成器创建JMS池化连接工厂,然后针对该工厂调用该createConnection方法。

    注意

    对于主用/备用代理,Amazon MQ 提供了两个 ActiveMQ Web URLs 控制台,但一次只能有一个处于活动状态。URL同样,Amazon MQ 为每个线级协议提供两个终端节点,但每次每对中只有一个终端节点处于活动状态。-1-2 后缀表示冗余对。有关更多信息,请参阅 适用于 ActiveMQ 经纪商的 Amazon MQ 部署选项

    对于线级协议终端节点,您可以允许应用程序使用故障转移传输连接到任一终端节点。

    // Create a connection factory. final ActiveMQConnectionFactory connectionFactory = new ActiveMQConnectionFactory(wireLevelEndpoint); // Pass the sign-in credentials. connectionFactory.setUserName(activeMqUsername); connectionFactory.setPassword(activeMqPassword); // Create a pooled connection factory. final PooledConnectionFactory pooledConnectionFactory = new PooledConnectionFactory(); pooledConnectionFactory.setConnectionFactory(connectionFactory); pooledConnectionFactory.setMaxConnections(10); // Establish a connection for the producer. final Connection producerConnection = pooledConnectionFactory.createConnection(); producerConnection.start(); // Close all connections in the pool. pooledConnectionFactory.clear();
    注意

    消息创建者应始终使用 PooledConnectionFactory 类。有关更多信息,请参阅 始终使用连接池

  2. 创建一个会话,一个名为 MyQueue 的队列和消息创建者。

    // Create a session. final Session producerSession = producerConnection.createSession(false, Session.AUTO_ACKNOWLEDGE); // Create a queue named "MyQueue". final Destination producerDestination = producerSession.createQueue("MyQueue"); // Create a producer from the session to the queue. final MessageProducer producer = producerSession.createProducer(producerDestination); producer.setDeliveryMode(DeliveryMode.NON_PERSISTENT);
  3. 创建消息字符串 "Hello from Amazon MQ!",然后发送消息。

    // Create a message. final String text = "Hello from Amazon MQ!"; TextMessage producerMessage = producerSession.createTextMessage(text); // Send the message. producer.send(producerMessage); System.out.println("Message sent.");
  4. 清理创建者。

    producer.close(); producerSession.close(); producerConnection.close();

创建消息使用者并接收消息

创建生产者后,创建一个使用者来验证它是否可以接收消息。

  1. 使用代理的端点为消息生成器创建JMS连接工厂,然后针对该工厂调用该createConnection方法。

    // Create a connection factory. final ActiveMQConnectionFactory connectionFactory = new ActiveMQConnectionFactory(wireLevelEndpoint); // Pass the sign-in credentials. connectionFactory.setUserName(activeMqUsername); connectionFactory.setPassword(activeMqPassword); // Establish a connection for the consumer. final Connection consumerConnection = connectionFactory.createConnection(); consumerConnection.start();
    注意

    消息使用者绝不 应使用 PooledConnectionFactory 类。有关更多信息,请参阅 始终使用连接池

  2. 创建一个会话,一个名为 MyQueue 的队列和消息使用者。

    // Create a session. final Session consumerSession = consumerConnection.createSession(false, Session.AUTO_ACKNOWLEDGE); // Create a queue named "MyQueue". final Destination consumerDestination = consumerSession.createQueue("MyQueue"); // Create a message consumer from the session to the queue. final MessageConsumer consumer = consumerSession.createConsumer(consumerDestination);
  3. 开始等待消息,并在消息到达时收到消息。

    // Begin to wait for messages. final Message consumerMessage = consumer.receive(1000); // Receive the message when it arrives. final TextMessage consumerTextMessage = (TextMessage) consumerMessage; System.out.println("Message received: " + consumerTextMessage.getText());
    注意

    与 Amazon 消息服务(例如AmazonSQS)不同,消费者经常与经纪人建立联系。

  4. 关闭使用者、会话和连接。

    consumer.close(); consumerSession.close(); consumerConnection.close();

步骤 3:(可选)Connect 到 Amazon Lambda 函数

Amazon Lambda 可以连接并使用来自您的 Amazon MQ 代理的消息。当您将代理连接到 Lambda 时,可以创建事件源映射,从队列中读取消息并同步调用函数。您创建的事件源映射会从您的代理中批量读取消息,并将其转换为对象形式的 Lambda 有效负载。JSON

将您的代理连接到 Lambda 函数
  1. 将以下IAM角色权限添加到您的 Lambda 函数执行角色。

    注意

    如果没有必要的IAM权限,您的函数将无法成功读取 Amazon MQ 资源中的记录。

  2. (可选)如果您创建了一个没有公开可访问性的代理,则必须执行下面其中一项操作以允许 Lambda 连接到您的代理:

    • 为每个公有子NAT网配置一个网关。有关更多信息,请参阅《Amazon Lambda 开发人员指南》中的VPC已连接功能的 Internet 和服务访问权限

    • 使用终端节点在您的亚马逊虚拟私有云(亚马逊VPC)和 Lambda 之间创建连接。VPC您的亚马逊还VPC必须连接到 Amazon Security Token Service (Amazon STS) 和 Secrets Manager 终端节点。有关更多信息,请参阅Amazon Lambda 开发人员指南中的为 Lambda 配置接口VPC终端节点

  3. 使用 Amazon Web Services Management Console为 Lambda 函数配置代理作为事件源。您也可以使用该create-event-source-mapping Amazon Command Line Interface 命令。

  4. 为 Lambda 函数编写一些代码来处理从您的代理使用的消息。事件源映射检索的 Lambda 负载取决于代理的引擎类型。以下是适用于 Amazon MQ for ActiveMQ 队列的 Lambda 负载示例。

    注意

    在该示例中,testQueue 是队列的名称。

    { "eventSource": "aws:amq", "eventSourceArn": "arn:aws:mq:us-west-2:112556298976:broker:test:b-9bcfa592-423a-4942-879d-eb284b418fc8", "messages": { [ { "messageID": "ID:b-9bcfa592-423a-4942-879d-eb284b418fc8-1.mq.us-west-2.amazonaws.com-37557-1234520418293-4:1:1:1:1", "messageType": "jms/text-message", "data": "QUJDOkFBQUE=", "connectionId": "myJMSCoID", "redelivered": false, "destination": { "physicalname": "testQueue" }, "timestamp": 1598827811958, "brokerInTime": 1598827811958, "brokerOutTime": 1598827811959 }, { "messageID": "ID:b-9bcfa592-423a-4942-879d-eb284b418fc8-1.mq.us-west-2.amazonaws.com-37557-1234520418293-4:1:1:1:1", "messageType":"jms/bytes-message", "data": "3DTOOW7crj51prgVLQaGQ82S48k=", "connectionId": "myJMSCoID1", "persistent": false, "destination": { "physicalname": "testQueue" }, "timestamp": 1598827811958, "brokerInTime": 1598827811958, "brokerOutTime": 1598827811959 } ] } }

有关将 Amazon MQ 连接到 Lambda、Lambda 为 Amazon MQ 事件源提供支持的选项和事件源映射错误的更多信息,请参阅《Amazon Lambda 开发人员指南》中的将 Lambda 与 Amazon MQ 结合使用