建立並連線至 ActiveMQ 代理程式 - Amazon MQ

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

建立並連線至 ActiveMQ 代理程式

代理程式是在 Amazon MQ 上執行的訊息代理程式環境。這是 Amazon MQ 的基本建置區塊。代理程式執行個體類別 (m5t3) 和大小 (largemicro) 的合併說明是代理程式執行個體類型 (例如,mq.m5.large)。如需詳細資訊,請參閱 代理程式

步驟 1:建立 ActiveMQ 代理程式

第一個最常見的 Amazon MQ 任務是建立代理程式。下列範例顯示如何使用 AWS Management Console 建立基本 Broker。

  1. 登入 Amazon MQ 主控台

  2. Select broker engine (選取代理程式引擎) 頁面上,選擇 Apache ActiveMQ

  3. Select deployment and storage (選取部署和儲存) 頁面的 Deployment mode and storage type (部署模式和儲存類型) 區段中,執行下列動作:

    1. 選擇 Deployment mode (部署模式) (例如,作用中/待命代理程式)。如需詳細資訊,請參閱 Broker Architecture

      • 單一執行個體代理程式是由一個可用區域中的一個代理程式組成。代理程式會與您的應用程式以及 Amazon EBS 或 Amazon EFS 儲存磁碟區進行通訊。如需詳細資訊,請參閱 Amazon MQ 單一執行個體代理程式

      • 高可用性的作用中/待命代理程式是由兩個不同可用區域中的兩個代理程式所組成,並設定於備援組合中。這些代理程式會與您的應用程式及 Amazon EFS 同步通訊。如需詳細資訊,請參閱 高可用性的 Amazon MQ 作用中/待命代理程式

      • 如需代理程式網路的範例藍圖詳細資訊,請參閱 藍圖範例

    2. 選擇 Storage type (儲存體類型) (例如,EBS)。如需詳細資訊,請參閱 Storage

      注意

      Amazon EBS 會複寫單一可用區域內的資料,且不支援 ActiveMQ 作用中/待命部署模式。

    3. 選擇下一步

  4. Configure settings (進行設定) 頁面的 Details (詳細資訊) 區段中,執行以下動作:

    1. 輸入代理程式名稱

      重要

      請勿在代理程式名稱中加入個人身分識別資訊 (PII) 或其他機密或敏感資訊。代理程式名稱可 AWS 供其他服務存取,包括 CloudWatch 記錄檔。代理程式名稱不適用於私有或敏感資料。

    2. 選擇代理程式執行個體類型 (例如,mq.m5.large)。如需詳細資訊,請參閱 Broker instance types

  5. ActiveMQ Web 主控台存取區段中,提供使用者名稱密碼。以下限制適用於代理程式使用者名稱和密碼:

    • 使用者名稱只能包含英數字元、破折號、句點、底線和波狀符號 (- . _ ~)。

    • 密碼必須至少有 12 個字元、包含至少 4 個唯一字元,而且不得包含逗號、冒號或等號 (,: =)。

    重要

    請勿在代理程式使用者名稱中加入個人身分識別資訊 (PII) 或其他機密或敏感資訊。代理程式使用者名稱可 AWS 供其他服務存取,包括 CloudWatch 記錄檔。代理程式使用者名稱不適用於私有或敏感資料。

  6. 選擇部署

    當 Amazon MQ 建立您的代理程式時,其會顯示 Creation in progress (正在建立) 狀態。

    建立代理程式大約需要 15 分鐘。

    成功建立代理程式後,Amazon MQ 會顯示 Running (執行中) 狀態。

  7. 選擇MyBroker

    MyBroker頁面的「Connect」區段中,記下代理程式的 ActiveMQ Web 主控台 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 內存取,您必須啟用 enableDnsHostnamesenableDnsSupport VPC 屬性。如需詳細資訊,請參閱《Amazon VPC 使用者指南》中的 VPC 中的 DNS Support

啟用傳入連線

  1. 登入 Amazon MQ 主控台

  2. 從經紀人列表中,選擇經紀人的名稱(例如,MyBroker)。

  3. MyBroker頁面的「線」區段中,記下代理程式 Web 主控台 URL 和線路層級通訊協定的位址和連接埠。

  4. Details (詳細資訊) 區段的 Security and network (安全與網路) 下,選擇您的安全群組名稱或

    隨即會顯示 EC2 儀表板的 Security Groups (安全群組) 頁面。

  5. 從安全群組清單選擇您的安全群組。

  6. 在頁面的最下方,選擇 Inbound (傳入),然後選擇 Edit (編輯)

  7. Edit inbound rules (編輯傳入規則) 對話方塊中,為您要公開存取的每個 URL 或端點新增規則 (下列範例顯示如何針對代理程式 Web 主控台執行此動作)。

    1. 選擇 Add Rule (新增規則)。

    2. 針對 Type (類型),選擇 Custom TCP (自訂 TCP)

    3. 針對 Port Range (連接埠範圍),輸入 Web 主控台連接埠 (8162)。

    4. 針對 Source (來源),讓 Custom (自訂) 保持已選取狀態,然後輸入您希望能夠存取 Web 主控台的系統 IP 地址 (例如,192.0.2.1)。

    5. 選擇 Save (儲存)

      您的代理程式現在已可接受傳入連線。

新增 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 主控台 URL,但一次只有一個作用中的 URL。同樣地,Amazon MQ 為每個線路通訊協定提供兩個端點,但每個配對中一次只有一個作用中的端點。-1-2 尾碼表示備援組合。如需詳細資訊,請參閱 Broker Architecture

    對於線路通訊協定端點,您可以允許應用程式使用容錯移轉傳輸連線到任一端點。

    // 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());
    注意

    與 AWS 簡訊服務 (例如 Amazon SQS) 不同,消費者會持續連線至代理程式。

  4. 關閉消費者、工作階段和連線。

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

步驟 3:(可選)連接到 AWS Lambda 功能

AWS Lambda 可以連線到 Amazon MQ 代理程式並使用來自您的訊息。當您將代理程式連接到 Lambda 時,您可以建立事件來源映射,其會讀取佇列中的訊息並同步叫用函數。您建立的事件來源映射會分批讀取來自代理程式的訊息,並以 JSON 物件的形式將它們轉換為 Lambda 承載。

將代理程式連接到 Lambda 函數
  1. 將下列 IAM 角色許可新增到 Lambda 函數執行角色

    注意

    若沒有必要的 IAM 許可,您的函數將無法成功從 Amazon MQ 資源讀取記錄。

  2. (選用) 如果您已建立沒有公開可存取性的代理程式,您必須執行下列其中一項作業,以允許 Lambda 連線到代理程式:

    • 為每個公用子網路設定一個 NAT 閘道。如需詳細資訊,請參閱 AWS Lambda 開發人員指南中的 VPC 連線函數的網際網路和服務存取

    • 使用 VPC 端點建立 Amazon Virtual Private Cloud (Amazon VPC) 與 Lambda 之間的連線。您的 Amazon VPC 人雲端也必須連線到 AWS Security Token Service (AWS STS) 和機 Secrets Manager 端點。如需詳細資訊,請參閱 AWS Lambda 開發人員指南中的設定 Lambda 的介面 VPC 端點

  3. 使用 AWS Management Console,針對 Lambda 函數將您的代理程式設定為事件來源。您也可以使用create-event-source-mapping AWS 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 事件來源支援的選項,以及事件來源映射錯誤的詳細資訊,請參閱 AWS Lambda 開發人員指南中的搭配使用 Lambda 與 Amazon MQ

步驟 4:刪除您的代理程式

如果您不使用 Amazon MQ 代理程式 (並且不預見在不久的 future 使用),最佳做法是將其從 Amazon MQ 刪除以降低成本。 AWS

以下範例示範如何使用 AWS Management Console來刪除代理程式。

  1. 登入 Amazon MQ 主控台

  2. 從經紀人清單中,選取您的經紀人 (例如,MyBroker),然後選擇 [刪除]。

  3. 在刪MyBroker 」對話方塊中,鍵入,delete然後選擇「刪除」。

    刪除代理程式大約需要 5 分鐘。

後續步驟

既然您已建立代理程式、已將應用程式連接至其中,並已傳送和接收訊息,那麼您可能想要嘗試以下動作:

您也可以開始深入探討 Amazon MQ 最佳實務Amazon MQ REST API,然後計劃遷移至 Amazon MQ