代码:
pom依赖
<dependency>
<groupId>com.rabbitmq</groupId>
<artifactId>amqp-client</artifactId>
<version>5.10.0</version>
</dependency>
provider生产者
package com.meng.topic;
import com.meng.utils.rabbitMQUtiles;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import java.io.IOException;
import java.util.concurrent.TimeoutException;
public class Topic {
public static void main(String[] args) throws IOException, TimeoutException {
Connection connection = rabbitMQUtiles.getConnection();
Channel channel = connection.createChannel();
channel.exchangeDeclare("topics","topic");
//发布消息
String routingkey="user.save";
channel.basicPublish("topics",routingkey,null,"这里是topic".getBytes());
rabbitMQUtiles.closeConnectionChannel(channel,connection);
}
}
消费者1
package com.meng.topic;
import com.meng.utils.rabbitMQUtiles;
import com.rabbitmq.client.*;
import java.io.IOException;
import java.util.concurrent.TimeoutException;
public class Customer1 {
public static void main(String[] args) throws IOException, TimeoutException {
Connection connection = rabbitMQUtiles.getConnection();
Channel channel = connection.createChannel();//获取链接
//通道绑定交换机
channel.exchangeDeclare("topics","topic");
//临时队列
String queue1 = channel.queueDeclare().getQueue();
//基于rount路由 绑定临时队列和交换机
channel.queueBind(queue1,"topics","user.*");
//消费消息
channel.basicConsume(queue1,true,new DefaultConsumer(channel){
@Override
public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {
System.out.println("消费者1:"+new String(body));
}
});
}
}
消费者2
package com.meng.topic;
import com.meng.utils.rabbitMQUtiles;
import com.rabbitmq.client.*;
import java.io.IOException;
import java.util.concurrent.TimeoutException;
public class Customer1 {
public static void main(String[] args) throws IOException, TimeoutException {
Connection connection = rabbitMQUtiles.getConnection();
Channel channel = connection.createChannel();//获取链接
//通道绑定交换机
channel.exchangeDeclare("topics","topic");
//临时队列
String queue1 = channel.queueDeclare().getQueue();
//基于rount路由 绑定临时队列和交换机
channel.queueBind(queue1,"topics","user.*");
//消费消息
channel.basicConsume(queue1,true,new DefaultConsumer(channel){
@Override
public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {
System.out.println("消费者1:"+new String(body));
}
});
}
}
工具类
package com.meng.utils;
import com.rabbitmq.client.AMQP;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
import java.io.IOException;
import java.util.concurrent.TimeoutException;
public class rabbitMQUtiles {
private static ConnectionFactory connectionFactory;
static {
connectionFactory=new ConnectionFactory();
}
public static Connection getConnection() throws IOException, TimeoutException {
connectionFactory.setHost("");//ip
connectionFactory.setPort( 5672);
connectionFactory.setUsername("pan");
connectionFactory.setPassword("123");
connectionFactory.setVirtualHost("/ems");
return connectionFactory.newConnection();
}
//关闭工具类的方法
public static void closeConnectionChannel(Channel channel,Connection connection){
try {
if(channel!=null)
channel.close();
if (connection!=null)
connection.close();
} catch (IOException e) {
e.printStackTrace();
} catch (TimeoutException e) {
e.printStackTrace();
}
}
}
测试结果 先打开两个消费者 再运行生产者
消费者1有能消费 消费者2不能消费 为什么呢?
消费者1用的时user下的一个目录
消费者2用的时user下的两级目录
定义的生产者就一级目录 所以不能访问消费者2
其他几个模式在播客里面 有兴趣翻一番