AMQ JMS Pool Library 사용

Red Hat AMQ Clients 2.11

AMQ Clients 2.11과 함께 사용하는 경우

초록

이 가이드에서는 라이브러리를 설치 및 구성하고, 실습 예제를 실행하고, 다른 AMQ 구성 요소와 함께 클라이언트를 사용하는 방법을 설명합니다.

보다 포괄적 수용을 위한 오픈 소스 용어 교체

Red Hat은 코드, 문서, 웹 속성에서 문제가 있는 용어를 교체하기 위해 최선을 다하고 있습니다. 먼저 마스터(master), 슬레이브(slave), 블랙리스트(blacklist), 화이트리스트(whitelist) 등 네 가지 용어를 교체하고 있습니다. 이러한 변경 작업은 작업 범위가 크므로 향후 여러 릴리스에 걸쳐 점차 구현할 예정입니다. 자세한 내용은 CTO Chris Wright의 메시지를 참조하십시오.

1장. 개요

AMQ JMS Pool은 JMS 연결, 세션 및 메시지 생산자의 캐싱을 제공하는 라이브러리입니다. JMS API에서 정의한 표준 라이프사이클 이외의 연결 리소스를 재사용할 수 있습니다.

AMQ JMS Pool은 선택한 JMS 공급자의 ConnectionFactory 를 래핑하고 JMS 풀 구성을 기반으로 해당 공급자로부터 연결 오브젝트의 수명을 관리하는 표준 JMS ConnectionFactory 인스턴스로 작동합니다. createConnection() 메서드에 대한 호출자 간에 하나 이상의 연결을 공유하도록 구성할 수 있습니다.

AMQ JMS Pool은 여러 언어와 플랫폼을 지원하는 메시징 라이브러리 제품군인 AMQ Clients의 일부입니다. 클라이언트 개요는 AMQ 클라이언트 개요 를 참조하십시오. 이 릴리스에 대한 자세한 내용은 AMQ Clients 2.11 릴리스 정보를 참조하십시오.

AMQ JMS Pool은 Pooled JMS 메시징 라이브러리를 기반으로 합니다.

1.1. 주요 기능

  • JMS 1.1 및 2.0 호환 가능
  • 자동 다시 연결
  • 구성 가능한 연결 및 세션 풀 크기

1.2. 지원되는 표준 및 프로토콜

AMQ JMS Pool은 Java Message Service API의 버전 2.0을 지원합니다.

1.3. 문서 규칙

sudo 명령

이 문서에서는 root 권한이 필요한 모든 명령에 sudo 를 사용합니다. sudo 를 사용할 때는 모든 변경 사항이 전체 시스템에 영향을 미칠 수 있으므로 주의하십시오. sudo 에 대한 자세한 내용은 sudo 명령 사용을 참조하십시오.

파일 경로

이 문서에서 모든 파일 경로는 Linux, UNIX 및 유사한 운영 체제(예: /home/andrea)에 유효합니다. Microsoft Windows에서는 동등한 Windows 경로(예: C:\Users\andrea)를 사용해야 합니다.

변수 텍스트

이 문서에는 해당 환경과 관련된 값으로 교체해야 하는 변수로 코드 블록이 포함되어 있습니다. 변수 텍스트는 화살표 중괄호로 묶고 italic monospace로 스타일링됩니다. 예를 들어 다음 명령에서 < project-dir> 을 사용자 환경의 값으로 바꿉니다.

$ cd <project-dir>

2장. 설치

이 장에서는 환경에 AMQ JMS Pool을 설치하는 단계를 안내합니다.

2.1. 사전 요구 사항

  • AMQ 릴리스 파일 및 리포지토리에 액세스할 수 있는 서브스크립션 이 있어야 합니다.
  • AMQ JMS Pool을 사용하여 프로그램을 빌드하려면 Apache Maven 을 설치해야 합니다.
  • AMQ JMS Pool을 사용하려면 Java를 설치해야 합니다.

2.2. Red Hat Maven 리포지토리 사용

Red Hat Maven 리포지토리에서 클라이언트 라이브러리를 다운로드하도록 Maven 환경을 구성합니다.

절차

  1. Maven 설정 또는 POM 파일에 Red Hat 리포지토리를 추가합니다. 예를 들어 설정 파일은 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 Clients 2.11.0 JMS Pool Maven 리포지토리 .zip 파일을 다운로드합니다.
  2. 선택한 디렉터리로 파일 내용을 추출합니다.

    Linux 또는 UNIX에서 unzip 명령을 사용하여 파일 내용을 추출합니다.

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

    Windows에서 .zip 파일을 마우스 오른쪽 버튼으로 클릭하고 압축 풀기 를 선택합니다.

  3. 추출된 설치 디렉터리 내의 maven-repository 디렉터리에 있는 리포지토리를 사용하도록 Maven을 구성합니다. 자세한 내용은 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 예제에서는 "Hello World" 문자열의 각 문자에 대해 createConnection() 을 호출하여 한 번에 하나씩 전송합니다. AMQ JMS Pool이 사용 중이므로 각 호출은 동일한 기본 JMS 연결 오브젝트를 재사용합니다.

절차

  1. Maven을 사용하여 < source-dir> /pooled-jms-examples 디렉터리에서 다음 명령을 실행하여 예제를 빌드합니다.

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

    dependency:copy-dependencies 를 추가하면 종속 항목이 target/dependency 디렉터리에 복사됩니다.

  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 및 로깅 구성은 < source-dir> /pooled-jms-examples/src/main/resources 디렉터리에 있습니다.

4장. 설정

AMQ JMS Pool ConnectionFactory 구현에서는 풀의 동작과 관리하는 JMS 리소스를 제어하는 여러 구성 옵션을 노출합니다.

구성 옵션은 JmsPoolConnectionFactory 오브젝트에서 설정된 메서드로 노출됩니다. 예를 들어 maxConnections 옵션은 setMaxConnections(int) 메서드를 사용하여 설정됩니다.

4.1. 연결 옵션

이러한 옵션은 JMS 풀이 풀에서 연결을 생성하고 관리하는 방법에 영향을 미칩니다.

풀링된 ConnectionFactory 는 연결을 생성하는 데 사용되는 각 사용자와 암호 조합에 대한 연결 풀을 만들고 사용자 이름 또는 암호가 없는 사용자를 위한 별도의 풀을 생성합니다. 더 세분화된 연결을 풀로 구분해야 하는 경우 별도의 풀 인스턴스를 명시적으로 생성해야 합니다.

maxConnections
단일 풀에 대한 최대 연결 수입니다. 기본값은 1입니다.
connectionIdleTimeout
현재 임대되지 않은 연결이 풀에서 제거될 수 있기 전의 시간(밀리초)입니다. 기본값은 30초입니다. 값이 0이면 시간 초과가 비활성화됩니다.
connectionCheckInterval
정기적인 연결 확인 사이의 시간(밀리초)입니다. 기본값은 0이므로 검사가 비활성화됩니다.
useProviderJMSContext

활성화된 경우 기본 JMS 공급자의 JMSContext 클래스를 사용합니다. 이는 기본적으로 비활성화되어 있습니다.

일반 작업에서는 풀이 공급자 구현을 사용하는 대신 자체 일반 JMSContext 구현을 사용하여 풀에서 연결을 래핑합니다. 일반 구현에는 공급자 구현에 제한이 있을 수 있습니다. 그러나 활성화되면 JMSContext API의 연결은 풀에서 관리하지 않습니다.

4.2. 세션 옵션

이러한 옵션은 풀링된 연결에서 생성되는 세션 동작에 영향을 미칩니다.

maxSessionsPerConnection

각 연결에 대한 최대 세션 수입니다. 기본값은 500입니다. 음수 값은 제한을 제거합니다.

제한이 초과된 경우 createSession() 은 구성에 따라 예외를 차단하거나 throw합니다.

blockIfSessionPoolIsFull

활성화된 경우, 세션에서 세션을 사용할 수 있을 때까지 createSession() 블록입니다. 기본적으로 활성화되어 있습니다.

비활성화한 경우 createSession() 에 대한 호출을 사용하면 세션을 사용할 수 없는 경우 IllegalStateException 이 발생합니다.

blockIfSessionPoolIsFullTimeout
createSession() 에 대한 차단 호출 이전의 시간(밀리초)으로 인해 IllegalStateException 이 발생합니다. 기본값은 -1이며, 호출 블록을 영구적으로 의미합니다.
useAnonymousProducers

활성화된 경우 모든 호출에 대해 단일 익명의 JMS MessageProducer 를 사용하여 createProducer() 를 사용합니다. 기본적으로 활성화되어 있습니다.

드문 경우지만 이 동작은 바람직하지 않습니다. 비활성화되면 createProducer() 에 대한 모든 호출이 새 MessageProducer 인스턴스가 생성됩니다.

5장. 예

이 장에서는 예제 프로그램을 통해 AMQ JMS Pool을 사용하는 방법을 설명합니다.

자세한 내용은 풀된 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& gt;이라고 합니다.
  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} 을 기본 10.0.0.1 JMS 버전으로 교체합니다.

  4. 프로젝트 디렉터리로 변경하고 mvn 명령을 사용하여 프로그램을 컴파일합니다.

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

    dependency:copy-dependencies 를 추가하면 종속 항목이 target/dependency 디렉터리에 복사됩니다.

  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는 소프트웨어 서브스크립션을 통해 제공됩니다. 서브스크립션을 관리하려면 Red Hat 고객 포털에서 계정에 액세스하십시오.

A.1. 귀하의 계정에 액세스

절차

  1. access.redhat.com 으로 이동합니다.
  2. 아직 계정이 없는 경우 계정을 생성합니다.
  3. 계정에 로그인합니다.

A.2. 서브스크립션 활성화

절차

  1. access.redhat.com 으로 이동합니다.
  2. 내 서브스크립션으로 이동합니다.
  3. 서브스크립션을 활성화하여 16자리 활성화 번호를 입력합니다.

A.3. 릴리스 파일 다운로드

.zip, .tar.gz 및 기타 릴리스 파일에 액세스하려면 고객 포털을 사용하여 다운로드할 관련 파일을 찾습니다. RPM 패키지 또는 Red Hat Maven 리포지토리를 사용하는 경우에는 이 단계가 필요하지 않습니다.

절차

  1. 브라우저를 열고 access.redhat.com/downloads 에서 Red Hat 고객 포털 제품 다운로드 페이지에 로그인합니다.
  2. INTEGRATION AND AUTOMATION 카테고리에서 Red Hat AMQ 항목을 찾습니다.
  3. 원하는 AMQ 제품을 선택합니다. Software Download 페이지가 열립니다.
  4. 구성 요소에 대한 다운로드 링크를 클릭합니다.

A.4. 패키지용 시스템 등록

Red Hat Enterprise Linux에 이 제품의 RPM 패키지를 설치하려면 시스템을 등록해야 합니다. 다운로드한 릴리스 파일을 사용하는 경우 이 단계는 필요하지 않습니다.

절차

  1. access.redhat.com 으로 이동합니다.
  2. Registration Assistant 로 이동합니다.
  3. OS 버전을 선택하고 다음 페이지로 이동합니다.
  4. 시스템 터미널에서 나열된 명령을 사용하여 등록을 완료합니다.

시스템 등록에 대한 자세한 내용은 다음 리소스 중 하나를 참조하십시오.

부록 B. Red Hat Maven 리포지토리 사용

이 섹션에서는 소프트웨어에서 Red Hat 제공 Maven 리포지토리를 사용하는 방법에 대해 설명합니다.

B.1. 온라인 리포지토리 사용

Red Hat은 Maven 기반 프로젝트와 함께 사용할 중앙 Maven 리포지토리를 유지 관리합니다. 자세한 내용은 리포지토리 시작 페이지를 참조하십시오.

Red Hat 리포지토리를 사용하도록 Maven을 구성하는 방법은 다음 두 가지가 있습니다.

Maven 설정에 리포지토리 추가

이 구성 방법은 POM 파일이 리포지토리 구성을 재정의하지 않고 포함된 프로필이 활성화된 경우 사용자가 소유한 모든 Maven 프로젝트에 적용됩니다.

절차

  1. Maven settings.xml 파일을 찾습니다. 일반적으로 사용자 홈 디렉터리의 .m2 디렉토리 내에 있습니다. 파일이 없는 경우 텍스트 편집기를 사용하여 생성합니다.

    Linux 또는 UNIX에서:

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

    Windows에서 다음을 수행합니다.

    C:\Users\<username>\.m2\settings.xml
  2. 다음 예제와 같이 Red Hat 리포지토리를 포함하는 새 프로필을 settings.xml 파일의 profiles 요소에 추가합니다.

    예: Red Hat 리포지토리가 포함된 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 요소에 새 항목을 추가합니다.

예: Red Hat 리포지토리가 포함된 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. 로컬 리포지터리 사용

Red Hat은 일부 구성 요소에 파일 기반 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 또는 no 질문에 대답하라는 메시지가 표시됩니다. 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.