プロデューサーはキューにメッセージを送信し、ランダムなコンシューマーはキューからメッセージを受信します
- ユーザーと仮想ホストを作成する
rabbitmqが提供するユーザー管理インターフェースを介してユーザーと仮想ホストを簡単に作成でき、ユーザーを対応する仮想ホストにバインドする必要があります。独自のguest
ユーザーと/
仮想ホストを使用して、これら2つの既存の情報を直接使用することもできます。wuwl
userという名前の/vh
仮想ホストを作成しました/
。仮想ホストはで始まる必要があることに注意してください。
- 依存関係をインポートする
<dependency>
<groupId>com.rabbitmq</groupId>
<artifactId>amqp-client</artifactId>
<version>5.10.0</version>
</dependency>
- ConnectionUtilsがツールクラスと見なされ、プロデューサーとコンシューマーの両方がオブジェクトを接続する必要がある接続を作成します
public class ConnectionUtils {
public static Connection getConnection() throws IOException, TimeoutException {
// 创建连接mq的连接工厂对象
ConnectionFactory connectionFactory = new ConnectionFactory();
// 设置连接rabbitmq主机
connectionFactory.setHost("192.168.20.128");
// 设置端口号
connectionFactory.setPort(5672);
// 设置虚拟主机
connectionFactory.setVirtualHost("/vh");
// 设置用户名和密码
connectionFactory.setUsername("wuwl");
connectionFactory.setPassword("123456");
// 获取连接对象
return connectionFactory.newConnection();
}
}
- プロデューサーを作成する
public class Provider {
public void send() throws IOException, TimeoutException {
Connection connection = null;
Channel channel = null;
try {
connection = ConnectionUtils.getConnection();
// 获取连接通道
channel = connection.createChannel();
/** 通道绑定对应的消息队列
* 参数一:队列名称,如果队列不存在,自动创建队列
* 参数二:定义队列是否持久化
* 参数三:是否独占队列
* 参数四:是否在消费完成后自动删除队列
*/
channel.queueDeclare("wuwl",true,false,false,null);
/**
* 发布消息
* 参数一: 交换机名称
* 参数二:队列名称
* 参数三:传递消息额外设置
* 参数四:消息的具体内容
*/
channel.basicPublish("","wuwl",null,"hello rabbitmq".getBytes());
}finally {
if (channel !=null && channel.isOpen()) {
channel.close();
}
if (connection != null && connection.isOpen()) {
connection.close();
}
}
}
public static void main(String[] args) throws IOException, TimeoutException {
Provider provider = new Provider();
provider.send();
}
}
- コンシューマーを作成します。コンシューマーのチャネルと接続オブジェクトが閉じられていない場合、常に監視状態になります。プロデューサーのみが新しいメッセージをメッセージキューに送信し、コンシューマーはすぐにそれを消費します。
public class Consumer {
public void consume() throws IOException, TimeoutException {
Connection connection = null;
Channel channel = null;
try {
connection = ConnectionUtils.getConnection();
// 获取连接通道
channel = connection.createChannel();
/** 通道绑定对应的消息队列
* 参数一:队列名称,如果队列不存在,自动创建队列
* 参数二:定义队列是否持久化
* 参数三:是否独占队列
* 参数四:是否在消费完成后自动删除队列
*/
channel.queueDeclare("wuwl", true, false, false, null);
/**
* 消费
* 参数一: 交换机名称
* 参数二:队列名称
* 参数三:传递消息额外设置
* 参数四:消息的具体内容
*/
channel.basicConsume("wuwl",true,new DefaultConsumer(channel){
@Override
public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {
System.out.println("消费消息:" + new String(body));
}
});
} finally {
// if (channel != null && channel.isOpen()) {
// channel.close();
// }
// if (connection != null && connection.isOpen()) {
// connection.close();
// }
}
}
public static void main(String[] args) throws IOException, TimeoutException {
Consumer consumer = new Consumer();
consumer.consume();
}
}
プロデューサーのみをテスト実行すると、管理インターフェイスで定義したキューと、消費されていないメリットを確認できます。
コンシューマーを開始した後、メッセージは消費され、継続的に監視されます
このとき、キューで消費されるメッセージの数は0です。
再度プロデューサーを介してメッセージキューにメッセージを送信します。コンシューマーは直接消費します。キューで消費されるメッセージの数は0です。