Skip to content
/ hop Public

RabbitMQ HTTP API client for Java, Groovy, and other JVM languages

Notifications You must be signed in to change notification settings

rabbitmq/hop

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Hop, Java Client for the RabbitMQ HTTP API

Build Status

Hop is a Java client for the RabbitMQ HTTP API.

Polyglot

Hop is designed to be easy to use from other JVM languages, primarily Groovy, Scala, and Kotlin.

N.B. that Clojure already includes an HTTP API client as part of Langohr, and you should use Langohr instead.

Reactive

Hop provides a reactive, non-blocking IO client based on Reactor Netty. A blocking client is available as well.

Project Maturity

This project is mature and covers all key RabbitMQ HTTP API endpoints.

Meaningful breaking API changes are reflected in the version. User documentation is currently kept in this README.

Pre-requisites

Hop requires Java 11 or later.

Maven Artifacts

Maven Central

Project artifacts are available from Maven Central.

For milestones and release candidates, declare the milestone repository in your dependency manager.

Dependency Manager Configuration

If you want to use the blocking IO client, add the following dependencies:

pom.xml
<dependency>
  <groupId>com.rabbitmq</groupId>
  <artifactId>http-client</artifactId>
  <version>5.3.0</version>
</dependency>
<dependency>
  <groupId>com.fasterxml.jackson.core</groupId>
  <artifactId>jackson-databind</artifactId>
  <version>2.18.1</version>
</dependency>
build.gradle
compile "com.rabbitmq:http-client:5.3.0"
compile "com.fasterxml.jackson.core:jackson-databind:2.18.1"

If you want to use the reactive, non-blocking IO client, add the following dependencies:

pom.xml
<dependency>
  <groupId>com.rabbitmq</groupId>
  <artifactId>http-client</artifactId>
  <version>5.3.0</version>
</dependency>
<dependency>
  <groupId>io.projectreactor.netty</groupId>
  <artifactId>reactor-netty</artifactId>
  <version>1.2.0</version>
</dependency>
<dependency>
  <groupId>com.fasterxml.jackson.core</groupId>
  <artifactId>jackson-databind</artifactId>
  <version>2.18.1</version>
</dependency>
build.gradle
compile "com.rabbitmq:http-client:5.3.0"
compile "io.projectreactor.netty:reactor-netty:1.2.0"
compile "com.fasterxml.jackson.core:jackson-databind:2.18.1"

Milestones and Release Candidates

Milestones and release candidates are available on the RabbitMQ Milestone Repository:

Maven:

pom.xml
<repositories>
  <repository>
    <id>packagecloud-rabbitmq-maven-milestones</id>
    <url>https://packagecloud.io/rabbitmq/maven-milestones/maven2</url>
    <releases>
      <enabled>true</enabled>
    </releases>
    <snapshots>
      <enabled>false</enabled>
    </snapshots>
  </repository>
</repositories>

Gradle:

build.gradle
repositories {
  maven {
    url "https://packagecloud.io/rabbitmq/maven-milestones/maven2"
  }
}

Snapshots

To use snapshots, add the following dependencies:

pom.xml
<dependency>
  <groupId>com.rabbitmq</groupId>
  <artifactId>http-client</artifactId>
  <version>5.4.0-SNAPSHOT</version>
</dependency>
<dependency>
  <groupId>com.fasterxml.jackson.core</groupId>
  <artifactId>jackson-databind</artifactId>
  <version>2.18.1</version>
</dependency>
build.gradle
compile "com.rabbitmq:http-client:5.4.0-SNAPSHOT"
compile "com.fasterxml.jackson.core:jackson-databind:2.18.1"

Add the Sonatype OSS snapshot repository to your dependency manager:

Maven:

pom.xml
<repositories>
  <repository>
    <id>ossrh</id>
    <url>https://oss.sonatype.org/content/repositories/snapshots</url>
    <snapshots>
      <enabled>true</enabled>
    </snapshots>
    <releases>
      <enabled>false</enabled>
    </releases>
  </repository>
</repositories>

Gradle:

build.gradle
repositories {
  maven { url 'https://oss.sonatype.org/content/repositories/snapshots' }
  mavenCentral()
}

Usage Guide

Instantiating a Client

Hop faithfully follows RabbitMQ HTTP API conventions in its API. You interact with the server using a single class, Client, which needs an API endpoint and a pair of credentials to be instantiated:

import com.rabbitmq.http.client.Client;
import com.rabbitmq.http.client.ClientParameters;

Client c = new Client(
  new ClientParameters()
    .url("http://127.0.0.1:15672/api/")
    .username("guest")
    .password("guest")
);

HTTP Layer (Synchronous Client)

The synchronous client uses Java 11’s HttpClient internally.

Advanced Configuration

The client uses sensible defaults, but it is possible to customize the HttpClient instance and requests creation with JdkHttpClientHttpLayer#configure():

HttpLayerFactory httpLayerFactory =
  JdkHttpClientHttpLayer.configure()  // (1)
    .clientBuilderConsumer(
      clientBuilder ->  // (2)
        clientBuilder
          .connectTimeout(Duration.ofSeconds(10)))
    .requestBuilderConsumer(
      requestBuilder ->  // (3)
        requestBuilder
          .timeout(Duration.ofSeconds(10))
          .setHeader("Authorization", authorization("guest", "guest")))
    .create();  // (4)

Client c =
    new Client(
        new ClientParameters()
            .url("http://127.0.0.1:15672/api/")
            .username("guest")
            .password("guest")
            .httpLayerFactory(httpLayerFactory));  // (5)
  1. Configure the HTTP layer factory

  2. Configure the creation of the HttpClient instance

  3. Configure the creation of each request

  4. Instantiate the HTTP layer factory

  5. Set the HTTP layer factory

TLS

Set the SSLContext on the HttpClient builder to configure TLS:

SSLContext sslContext = SSLContext.getInstance("TLSv1.3");  // (1)
sslContext.init(kmf.getKeyManagers(), tmf.getTrustManagers(), random);  // (2)
HttpLayerFactory factory =
  JdkHttpClientHttpLayer.configure()
    .clientBuilderConsumer(builder -> builder.sslContext(sslContext))  // (3)
    .create();
  1. Create the SSL context

  2. Initialize the SSL context

  3. Set the SSL context on the client builder

Note the HttpClient enables hostname verification by default. This is a good thing for security, but it can generate surprising failures.

Hostname verification can be disabled globally with the jdk.internal.httpclient.disableHostnameVerification system property for development or test purposes, but at no cost in a production environment.

Getting Overview

c.getOverview();

Node and Cluster Status

// list cluster nodes
c.getNodes();

// get status and metrics of individual node
c.getNode("rabbit@mercurio.local");

Operations on Connections

// list client connections
c.getConnections();

// get status and metrics of individual connection
c.getConnection("127.0.0.1:61779 -> 127.0.0.1:5672");

// forcefully close connection
c.closeConnection("127.0.0.1:61779 -> 127.0.0.1:5672");

Operations on Channels

// list all channels
c.getChannels();

// list channels on individual connection
c.getChannels("127.0.0.1:61779 -> 127.0.0.1:5672");

// list detailed channel info
c.getChannel("127.0.0.1:61779 -> 127.0.0.1:5672 (3)");

Operations on Vhosts

// get status and metrics of individual vhost
c.getVhost("/");

Managing Users

TBD

Managing Permissions

TBD

Operations on Exchanges

TBD

Operations on Queues

// list all queues
c.getQueues();

// list all queues in a vhost
c.getQueues();

// declare a queue that's not durable, auto-delete,
// and non-exclusive
c.declareQueue("/", "queue1", new QueueInfo(false, true, false));

// bind a queue
c.bindQueue("/", "queue1", "amq.fanout", "routing-key");

// delete a queue
c.deleteQueue("/", "queue1");

Operations on Bindings

// list bindings where exchange "an.exchange" is source
// (other things are bound to it)
c.getBindingsBySource("/", "an.exchange");

// list bindings where exchange "an.exchange" is destination
// (it is bound to other exchanges)
c.getBindingsByDestination("/", "an.exchange");

Running Tests (with Docker)

Start the broker:

docker run -it --rm --name rabbitmq -p 5672:5672 -p 15672:15672 rabbitmq:4.0-management

Configure the broker for the test suite:

export HOP_RABBITMQCTL="DOCKER:rabbitmq"
./ci/before-build.sh

Launch the test suite:

./mvnw test

Running Tests

To run the suite against a specific RabbitMQ node, export HOP_RABBITMQCTL and HOP_RABBITMQ_PLUGINS to point at rabbitmqctl and rabbitmq-plugins from the installation.

Then set up the node that is assumed to be running:

./ci/before-build.sh

This will enable several plugins used by the test suite and configure the node to use a much shorter event refresh interval so that HTTP API reflects system state changes with less of a delay.

To run the tests:

./mvnw test

The test suite assumes RabbitMQ is running locally with stock settings and a few plugins are enabled:

  • rabbitmq_management (listening on port 15672)

  • rabbitmq_shovel_management

  • rabbitmq_federation_management

To run the suite against a specific RabbitMQ node, export HOP_RABBITMQCTL and HOP_RABBITMQ_PLUGINS to point at rabbitmqctl and rabbitmq-plugins from the installation.

The test suite can use a different port than 15672 by specifying it with the rabbitmq.management.port system property:

./mvnw test -Drabbitmq.management.port=15673

Versioning

This library uses semantic versioning.

Support

See the RabbitMQ Java libraries support page for the support timeline of this library.

License

(c) Michael Klishin, 2014-2016. (c) VMware, Inc. or its affiliates, 2014-2023. (c) Broadcom, 2023. All Rights Reserved. The term "Broadcom" refers to Broadcom Inc. and/or its subsidiaries.