RabbitMQ的工作模式之一简单(Simple)模式
由一个生产者,一个消费者组成,消息通过FIFO模式排队。
导入依赖
<!--RabbitMQ的依赖-->
<dependency>
<groupId>com.rabbitmq</groupId>
<artifactId>amqp-client</artifactId>
<version>5.7.3</version>
</dependency>
首先创建工具类,用以生成连接,避免重复书写此段代码
public class RabbitMQUtil {
private static ConnectionFactory factory = new ConnectionFactory();
static{
//用户名
factory.setUsername("hello");
//密码
factory.setPassword("123456");
//虚拟机
factory.setVirtualHost("/myhost");
//IP地址,运行rabbitmq组件的主机ip地址
factory.setHost("192.168.31.14");
//端口
factory.setPort(5672);
}
public static Connection getConnection(){
Connection connection = null;
try {
connection = factory.newConnection();
return connection;
} catch (IOException e) {
e.printStackTrace();
} catch (TimeoutException e) {
e.printStackTrace();
}
return null;
}
}
生产者端代码
public class Producer {
public static void main(String[] args) throws IOException, TimeoutException {
//通过工具类获取连接
Connection connection = RabbitMQUtil.getConnection();
//通道:与rabbitmq建立通信的信道
Channel channel = connection.createChannel();
//声明一个队列:因为要将消息发送到队列中
//参数一:队列名称,有则使用,无则创建
//参数二:是否进行持久化 false表示不进行持久化
//参数三:是否私有化,false表示不进行私有化,true表示私有化:只有第一次使用该队列的消费者才可以使用此队列
//参数四:表示连接关闭后,是否自动删除该对列,false表示不删除
//参数五: 扩展参数,额外的一配置
channel.queueDeclare("myqueue",false,false,false,null);
//发布消息
//参数一: 是交换机的名称,目前暂时不用
//参数二: 对列的名称,表示向哪个队列发送消息
//参数三:是额外的配置
//参数四: 发送的消息
channel.basicPublish("","myqueue",null,"这是一条消息".getBytes());
//关闭通道
channel.close();
connection.close();
System.out.println("发送成功");
}
}
消费者端代码
public class Consumer {
public static void main(String[] args) throws IOException, TimeoutException {
//通过工具类获取连接
Connection connection = RabbitMQUtil.getConnection();
//创建通道
final Channel channel = connection.createChannel();
//声明一个队列,无则创建,有则直接使用
//队列名称、是否持久化、是否私有化、是否自动删除、扩展参数
channel.queueDeclare("myqueue",false,false,false,null);
//签收消息
//参数1:消费队列的对列名称
//参数2:true表示自动签收消息,false表示手动编程的方式签收
//参数3:是处理签收消息的回调方法
channel.basicConsume("myqueue",false,new DefaultConsumer(channel){
@Override
public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {
System.out.println("接收到的消息:"+new String(body));
//确认签收消息
//参数1:是消息的tag(Id)
//参数2:表示是否批量签收,false表示只签收当前消息,true表示签收小于当前tag编号的所有消息
channel.basicAck(envelope.getDeliveryTag(),false);
}
});
//关闭通道
channel.close();
//关闭连接
connection.close();
}
}