RabbitMQ est un middleware de messages qui utilise le langage Erlang pour implémenter AMQP (Advanced Message Queuing Protocol, Advanced Message Queuing Protocol). Il est originaire des systèmes financiers et utilisé pour stocker et transférer des messages dans des systèmes distribués. RabbitMQ est favorisé par de plus en plus d'entreprises en raison de sa fiabilité élevée, de sa facilité d'extension, de sa haute disponibilité et de ses fonctionnalités riches. Ce qui suit décrit comment utiliser RabbitMQ pour envoyer et recevoir des messages en Java.
Utilisez Maven pour ajouter des fichiers dépendants
Dans le fichier d'informations de configuration pom.xml, ajoutez la dépendance client RabbitMQ:
<!-- RabbitMQ客户端 -->
<dependency>
<groupId>com.rabbitmq</groupId>
<artifactId>amqp-client</artifactId>
<version>5.10.0</version>
</dependency>
1. Le code client de l'expéditeur
Tout d'abord, l'expéditeur envoie un message à RabbitMQ, qui est ensuite consommé par le destinataire. Voici le code client expéditeur:
package com.pjb.demo;
import com.rabbitmq.client.*;
import java.io.IOException;
import java.util.concurrent.TimeoutException;
/**
* 发送者客户端
* @author pan_junbiao
**/
public class RabbitProducer
{
private static final String EXCHANGE_NAME = "exchange_demo";
private static final String ROUTING_KEY = "routingkey_demo";
private static final String QUEUE_NAME = "queue_demo";
private static final String IP_ADDRESS = "127.0.0.1";
private static final int PORT = 5672; //RabbitMQ 服务端默认端口号为 5672
private static final String USER_NAME = "guest";
private static final String PASSWORD = "guest";
public static void main(String[] args) throws IOException, TimeoutException
{
ConnectionFactory factory = new ConnectionFactory();
factory.setHost(IP_ADDRESS);
factory.setPort(PORT);
factory.setUsername(USER_NAME);
factory.setPassword(PASSWORD);
Connection connection = factory.newConnection(); //创建连接
Channel channel = connection.createChannel(); //创建信道
//创建一个 type = DIRECT、持久化的、非自动删除的交换器
channel.exchangeDeclare(EXCHANGE_NAME, BuiltinExchangeType.DIRECT, true, false, null);
//创建一个持久化、非排他的、非自动删除的队列
channel.queueDeclare(QUEUE_NAME,true,false,false,null);
//将交换器与队列通过路由键绑定
channel.queueBind(QUEUE_NAME,EXCHANGE_NAME,ROUTING_KEY);
//发送一条持久化的信息
String message = "您好,欢迎访问 pan_junbiao的博客";
channel.basicPublish(EXCHANGE_NAME,ROUTING_KEY, MessageProperties.PERSISTENT_TEXT_PLAIN,message.getBytes());
//关闭资源
channel.close();
connection.close();
}
}
2. Code client du destinataire
Ici, le récepteur est implémenté en héritant de DefaultConsumer. Voici le code client du récepteur:
package com.pjb.demo;
import com.rabbitmq.client.*;
import java.io.IOException;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;
/**
* 接收者客户端
* @author pan_junbiao
**/
public class RabbitConsumer
{
private static final String QUEUE_NAME = "queue_demo";
private static final String IP_ADDRESS = "127.0.0.1";
private static final int PORT = 5672; //RabbitMQ 服务端默认端口号为 5672
private static final String USER_NAME = "guest";
private static final String PASSWORD = "guest";
public static void main(String[] args) throws IOException, TimeoutException,InterruptedException
{
Address[] addresses = new Address[]{new Address(IP_ADDRESS, PORT)};
ConnectionFactory factory = new ConnectionFactory();
factory.setUsername(USER_NAME);
factory.setPassword(PASSWORD);
Connection connection = factory.newConnection(addresses); //创建连接
final Channel channel = connection.createChannel(); //创建信道
channel.basicQos(64); //设置客户端最多接收未被ack的消息的个数
Consumer consumer = new DefaultConsumer(channel)
{
@Override
public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException
{
System.out.println("接收信息:" + new String(body));
try
{
TimeUnit.SECONDS.sleep(1);
}
catch (InterruptedException ie)
{
ie.printStackTrace();
}
channel.basicAck(envelope.getDeliveryTag(), false);
}
};
channel.basicConsume(QUEUE_NAME, consumer);
//等待回调函数执行完毕之后,关闭资源
TimeUnit.SECONDS.sleep(5);
channel.close();
connection.close();
}
}
Résultats de la: