ラビットMQクライアントAPIの開発

プロジェクトが開始しました

対応するJARパッケージを導入するために必要な最初のステップ

<!-- https://mvnrepository.com/artifact/com.rabbitmq/amqp-client -->
<dependency>
    <groupId>com.rabbitmq</groupId>
    <artifactId>amqp-client</artifactId>
    <version>5.6.0</version>
</dependency>

RabbitMQの接続

2つの方法でRabbitMQの接続:1.接続2.接続URIの特定のパラメータに基づいて、
特定の接続のパラメータに基づいて、(ユーザー名、パスワード、IPアドレス、仮想ブローカー、ポート番号)

// 声明连接工厂
ConnectionFactory factory = new ConnectionFactory();
// 使用连接工厂赋值 userName、password、host、vHost、port 等等
factory.setUsername("userName");
factory.setPassword("password");
factory.setHost("host");
factory.setVirtualHost("vhost");
factory.setPort(5672);
// 创建连接
Connection conn = factory.newConnection();

接続URIは、選択したモードのURIを達成することであってもよいです

ConnectionFactory factory = new ConnectionFactory();
factory.setUri("amqp://userName:password@host:port/vhost");
Connection connection = factory.newConnection();
System.out.println(connection);
connection.close();

接続は、複数のインスタンスのチャネルを作成するために使用することができますが、チャンネルインスタンスはスレッド間で共有することができない、各スレッドは、チャンネルを開く必要があります。スレッドのシェアはスレッドセーフではありませんネットワーク上のインターリーブ通信フレームの誤りにつながるだけでなく、送信者の動作確認メカニズムに影響を与えるので、複数のスレッドがチャネルインスタンス間で共有されます。

そして、スイッチは、キューを使用します

キュースイッチを宣言する方法

Channel channel = connection.createChannel();
channel.exchangeDeclare("exchangeName", "direct", true);
String queueName = channel.queueDeclare().getQueue();
channel.queueBind(queueName, "exchangeName", "routuingKey");

私たちは、スイッチを指示するタイプの結合、永続的な、非自動削除の上に作成するだけでなく、(このキューの名前が自動的にRabbitMQのによって生成された)キューの非永続的、排他的、自動削除を作成しました。

詳細な方法exchangeDeclare

exchangeDeclareオーバーロードは、この方法では以下のパラメータによりデフォルトの複数です。

public DeclareOk exchangeDeclare(String exchange, String type, boolean durable, boolean autoDelete, boolean internal, Map<String, Object> arguments) throws IOException;

このメソッドの戻り値はExchange.DeclareOkが成功したスイッチを宣言して識別するために使用されます。
パラメータ説明
  1.exchange:スイッチの名前。
  2.type:為替のタイプ。
  3.durable:永続かどうかを設定します。真の永続的な偽の非永続的に表しています。永続スイッチは、関連する情報が失われていない場合、サーバーを再起動し、保存することができます。
  4.autoDelete:自動的に削除するかどうかを設定します。本当の意味は自動的に削除します。前提は、自動的にこのすべてがバインドされた後、キュースイッチまたはスイッチはこのアンバンドリングに関連する、結合このスイッチに少なくとも一つのキューまたはスイッチを削除しています。このパラメータが誤って理解されないことに注意してください:「このスイッチは、接続されたクライアントが切断された場合、RabbitMQのは、自動的にこのスイッチを削除します。」
  5.internal:それは構築されているかどうかを設定します。スイッチは真構築され、クライアントプログラムは、スイッチに直接メッセージを送ることができないと述べ、スイッチは唯一このように、スイッチを介してルーティングすることができます。
  6.arguments:いくつかの他の構造パラメータ。例えば、代替的な交換。

そこの宣言も削除交換方法があり、確かに相当し、交換方法を作成します。これは為替trueに設定されている場合はfalseに設定されている場合、スイッチの名前を表し、ifUnuserdはスイッチの場合には、削除設定するために使用されていない、、再びこのスイッチを使用していない唯一のケースは削除されます、その後、いずれの場合にスイッチが除去されなければなりません。

public AMQP.Exchange.DeleteOk exchangeDelete(String exchange, boolean ifUnused) throws IOException;
public AMQP.Exchange.DeleteOk exchangeDelete(String exchange, boolean ifUnused) throws IOException;

また、匿名のキューキューとして知られているのRabbitMQ、で指定されたデフォルトの名前を作成するためのパラメータを指定せずにqueueDeclare方法は、それは排他的、自動削除、非永続的な属性を持っています。

詳細な方法queueDeclare

public AMQP.Queue.DeclareOk queueDeclare() throws IOException;
public AMQP.Queue.DeclareOk queueDeclare(String queue, boolean durable, boolean exclusive, boolean autoDelete, Map<String, Object> arguments) throws IOException;

また、匿名のキューキューとして知られているのRabbitMQ、で指定されたデフォルトの名前を作成するためのパラメータを指定せずにQueueDeclare方法は、それは排他的、自動削除、非永続的な属性を持っています。
パラメータ説明
  1.queue:キューの名前。
  2.durable:永続かどうかを設定します。真の永続的な偽の非永続的に表しています。
  3.exclusive:彼を放出するかどうかを設定します。彼を排出するための真の手段キューは排他的なキューとして宣言されている場合、キューが最初にのみ表示され、その接続を宣言し、接続が切断されたときに自動的に削除します。
    3.1。独占的に基づいて、接続(コネクション)は、可視をキュー。独占的に同時にキュー作成したのと同じ接続にアクセスすることができ、接続と異なるチャンネル(チャンネル);
    3.2は、「最初に」、接続がすでに排他的なキューを宣言した場合、他の接続の排他的なキューが同じ名前を構築するために許可されていないことを意味し普通の異なるキュー:
    3.3は、接続が閉じられるとキューは、永続的であるか、クライアントが終了するが、排他的なキューは自動的に削除されます場合でも、これは同時に送信されたクライアントキューおよびメッセージの読み取りアプリケーションのシナリオに適用されます。
  4.autoDelete:自動的に削除するかどうかを設定します。本当の意味は自動的に削除されます。
    4.1は自動的に前提に削除されます。彼らは自動的に削除される前に、キューに接続されているすべての消費者の後に切断されたキューに少なくとも一つの消費者の接続があります。、このキューに接続するには、プロデューサーのクライアントがキューを作成するため、「このキューに接続されているすべてのクライアントが切断されると、キューが自動的に削除された」、または全く消費者クライアント:このパラメータは間違いであると理解することはできません自動的にキューを削除しません。
  5.arguments:キューの他のいくつかのパラメータを設定します。X-rnessage-TTL、-満了するX、X -rnax長とx-rnax長バイトとx-deadletter交換とx-deadletterルーティングキーとx-rnax優先度等を挙げることができます。

交換に対応し、除去するための方法に対応するキューがあります。どのキューキュー名を表し、キューに削除を設定するifUnuserdが使用されていないtrueに設定されている場合はfalseに設定すると、その後、唯一このキューは、とにかく、使用される場合には削除されませんこのキューを削除する必要があります。ifEmptyがtrueに設定され、それは、(メッセージ・キューの蓄積がない)待ち行列が空である場合には除去することができます。

public AMQP.Queue.DeleteOk queueDelete(String queue) throws IOException;
public AMQP.Queue.DeleteOk queueDelete(String queue, boolean ifUnused, boolean ifEmpty) throws IOException;

別の方法は、それ自体を削除せずにキュー、キューの内容を空にするために使用されます。

public AMQP.Queue.PurgeOk queuePurge(String queue) throws IOException;

詳細な方法exchangeBind

スイッチキューのほかにバインドすることができ、また結合スイッチ、バインディングまったく同じ方法で交換することができます。

public AMQP.Exchange.BindOk exchangeBind(String destination, String source, String routingKey) throws IOException;
public AMQP.Exchange.BindOk exchangeBind(String destination, String source, String routingKey, Map<String, Object> arguments) throws IOException;

パラメータ
  1.destination:拘束されることに切り替えたり、キュー
  2.source:スイッチが結合した、またはキューする必要があります。
  3.routingKey:キーをルーティングします。
  4.その他の構造パラメータ。

メッセージを送ります

Channel.basicPublishは、メッセージを送信することです。

String message = "Hello Word!";
channel.basicPublish("exchangeName", "routingKey", null, message.getBytes());

メソッドの概要

public void basicPublish(String exchange, String routingKey, AMQP.BasicProperties props, byte[] body) throws IOException;
public void basicPublish(String exchange, String routingKey, boolean mandatory, AMQP.BasicProperties props, byte[] body) throws IOException;
public void basicPublish(String exchange, String routingKey, boolean mandatory, boolean immediate, AMQP.BasicProperties props, byte[] body) throws IOException;

パラメータ
  1.exchange:メッセージが交換機に送信する必要があることを示して交換器、の名前。あなたは空の文字列に設定されている場合。メッセージは、デフォルトのRabbitMQ交換器に送られます。
  2.routhingKey:ルートストア適切なキューにメッセージに従ってルーティングキー、キースイッチ。
  3.props:メッセージの属性の基本セット。属性部材14を備え、それぞれのcontentType、コンテンツエンコーディング、ヘッダ(地図の<string、オブジェクト>)、配信モード、優先度、correlationld、のreplyTo、有効期限、messageld、タイムスタンプ、タイプ、userld、appld、clusterld。
  4.body:メッセージのメッセージ本文が送信される必要があります。
  5.mandatory:本当のは、スイッチがルーティングメッセージキューに応じて資格を見つけることができない場合は、廃棄プロデューサーキー偽のメッセージに戻されることを示しています。
  6.immediate:キューが消費者に存在することが見出されていない場合、メッセージは、メッセージがキューに配置されない経路に真の表現スイッチ。

消費者のニュース

プッシュプルプッシュモードとプルモード:2つの方法でRabbitMQのメッセージモード。プルを消費するBasic.Getを呼び出している間、プッシュモードでは、消費のためBasic.Consumeを使用しています。私たちは、自分の研究に興味があるかもしれモードを引き出し、プッシュモードを紹介します。

Connection conn = factory.newConnection();
Channel channel = conn.createChannel();
channel.queueDeclare(QUEUE_NAME, false, false, false, null);
channel.basicQos(1);
DeliverCallback deliverCallback = new DeliverCallback() {
	@Override public void handle(String s, Delivery delivery) throws IOException {
		String message = new String(delivery.getBody(), "UTF-8");
		System.out.println("RabbitMqWorkRec1Test Received: " + message);
		channel.basicAck(delivery.getEnvelope().getDeliveryTag(), false);
	}
};
channel.basicConsume(QUEUE_NAME, false, deliverCallback, new CancelCallback() {
	@Override public void handle(String s) throws IOException {
		System.out.println("RabbitMqWorkRec1Test CancelCallback==========> " + s);
	}
});

消費者のために上記のコードを明示的にack操作は、メッセージが失われなければならないのを防ぐために、必要です。

メソッドの概要

public String basicConsume(String queue, boolean autoAck, DeliverCallback deliverCallback, CancelCallback cancelCallback) throws IOException;
public String basicConsume(String queue, boolean autoAck, String consumerTag, boolean noLocal, boolean exclusive, Map<String, Object> arguments, Consumer callback) throws IOException;

パラメータ説明
  1.queue:キュー名。
  2.autoAck:自動的に確認するかどうかを設定します。真には自動確認、falseに提案されたセットを意味しません。
  3.consumerTag:複数の消費者を区別するために使用され、消費者ラベル。
  4.noLocal:trueに設定され、メッセージは、消費者の接続を渡すプロデューサ接続によって送信することができません。
  5.exclusive:彼を放出するかどうかを設定します。
  6.arguments:他のパラメータの消費者を設定します。
  7.callback:消費者のコールバック関数を設定します。メッセージを処理するための上にプッシュするのRabbitMQ。

Demoサンプル

最後に、以下の製造例、消費者が完全なようです。
プロデューサー

public class RabbitMqPubTest {
	private static final String EXCHANGE_NAME = "test_exchange_fanout";

	public static void main(String[] args) {
		Connection conn = null;
		Channel channel = null;
		try {
			ConnectionFactory factory = new ConnectionFactory();
			factory.setUsername("userName");
			factory.setPassword("password");
			factory.setHost("host");
			factory.setVirtualHost("vhost");
			factory.setPort(5672);
			conn = factory.newConnection();
			channel = conn.createChannel();
			channel.exchangeDeclare(EXCHANGE_NAME, "fanout");
			String message = "Hello Word!";
			channel.basicPublish(EXCHANGE_NAME, "", null, message.getBytes());
			System.out.println("RabbitMqPubTest send: " + message);
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			if (null != channel) {
				try {
					channel.close();
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
			if (null != conn) {
				try {
					conn.close();
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		}
	}
}

消費者

public class RabbitMqSub01Test {
	private static final String EXCHANGE_NAME = "test_exchange_fanout";

	public static void main(String[] args) throws Exception {
		ConnectionFactory factory = new ConnectionFactory();
		factory.setUsername("userName");
		factory.setPassword("password");
		factory.setHost("host");
		factory.setVirtualHost("vhost");
		factory.setPort(5672);
		Connection conn = factory.newConnection();
		Channel channel = conn.createChannel();
		channel.exchangeDeclare(EXCHANGE_NAME, "fanout");
		String queueName = channel.queueDeclare().getQueue();
		System.out.println("RabbitMqSub01Test queueName: " + queueName);
		channel.queueBind(queueName, EXCHANGE_NAME, "");
		DeliverCallback deliverCallback = new DeliverCallback() {
			@Override public void handle(String s, Delivery delivery) throws IOException {
				String message = new String(delivery.getBody(), StandardCharsets.UTF_8);
				System.out.println("RabbitMqSub01Test Received: " + message);
			}
		};
		channel.basicConsume(queueName, true, deliverCallback, new CancelCallback() {
			@Override public void handle(String s) throws IOException {

			}
		});
	}
}

public class RabbitMqSub02Test {
	private static final String EXCHANGE_NAME = "test_exchange_fanout";

	public static void main(String[] args) throws Exception {
		ConnectionFactory factory = new ConnectionFactory();
		factory.setUsername("userName");
		factory.setPassword("password");
		factory.setHost("host");
		factory.setVirtualHost("vhost");
		factory.setPort(5672);
		Connection conn = factory.newConnection();
		Channel channel = conn.createChannel();
		channel.exchangeDeclare(EXCHANGE_NAME, "fanout");
		String queueName = channel.queueDeclare().getQueue();
		System.out.println("RabbitMqSub02Test queueName: " + queueName);
		channel.queueBind(queueName, EXCHANGE_NAME, "");
		DeliverCallback deliverCallback = new DeliverCallback() {
			@Override public void handle(String s, Delivery delivery) throws IOException {
				String message = new String(delivery.getBody(), StandardCharsets.UTF_8);
				System.out.println("RabbitMqSub02Test Received: " + message);
			}
		};
		channel.basicConsume(queueName, true, deliverCallback, new CancelCallback() {
			@Override public void handle(String s) throws IOException {

			}
		});
	}
}

これらは、一般的に、見てくれてありがとうをJavaのAPIのRabbitMQの操作を使用しています!不適切なコメントしてください!

おすすめ

転載: blog.csdn.net/qq_16830879/article/details/90079934