RabbitMq02——简单队列

2、简单队列

即生产者将消息发送到消息队列,消费者从队列之中取得消息,为单对单的模式。

2.1、获取MQ连接

Mq也是在数据库中来存放消息,所以就如同连接数据库一样,我们首先需要获取到MQ的连接。在获取连接时一定要注意导入正确的包。

package com.rabbitmq.util;

import java.io.IOException;
import java.util.concurrent.TimeoutException;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;

public class ConnectionUtils {
	
	public static Connection getConnection() throws IOException, TimeoutException
	{
		ConnectionFactory factory = new ConnectionFactory();	
		factory.setHost("127.0.0.1");//默认IP为本地
		factory.setPort(5672);//默认端口
		factory.setVirtualHost("/vhost");//库名,自己定义
		factory.setUsername("dev");//用户名
		factory.setPassword("123456");//密码	
		Connection connection = factory.newConnection();	
		return connection;
	}

}

2.1、定义生产者并发送消息到队列

模拟一个简单的生产者,并声明一个队列,然后将消息发送到相应的消息队列中。

package com.mmr.rabbitmq.simple;

import com.mmr.rabbitmq.util.ConnectionUtils;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;

public class Send {
	private static final String QUEUE_NAME="simple_queue";//定义队列名

	public static void main(String[] args) throws Exception
	{
		Connection connection = ConnectionUtils.getConnection();//获取连接	
		Channel channel = connection.createChannel();//创建一个通道
		channel.queueDeclare(QUEUE_NAME, false, false, false, null);//声明一个队列(即在MQ中创建一个队列)	
		String msg="Hello Simple QUEUE !";//发送的消息	
		channel.basicPublish("", QUEUE_NAME, null, msg.getBytes());//向队列中发送消息
		System.out.println("---------send ms :"+msg);			
		channel.close();//关闭通道
		connection.close();//关闭连接	
	}
}

启动生产者,消息发送成功后,可以登录http://localhost:15672/#/queues查看,如图在控制台会有一条相应的队列,队列中会有一条消息:


2.1、定义消费者并接收消息

在消息到达队列之后,我们需要一个消费者来接收队列的消息。

package com.mmr.rabbitmq.simple;

import java.io.IOException;

import com.mmr.rabbitmq.util.ConnectionUtils;
import com.rabbitmq.client.AMQP.BasicProperties;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.DefaultConsumer;
import com.rabbitmq.client.Envelope;
import com.rabbitmq.client.QueueingConsumer;
import com.rabbitmq.client.QueueingConsumer.Delivery;

public class Recv {
	
	private static final String QUEUE_NAME="QUEUE_simple";
	
	public static void main(String[] args) throws Exception {
		
		Connection connection = ConnectionUtils.getConnection();
		Channel channel = connection.createChannel();		
		//定义一个默认的消费者
		DefaultConsumer consumer = new DefaultConsumer(channel){

			@Override
			public void handleDelivery(String consumerTag, Envelope envelope, BasicProperties properties, byte[] body)
					throws IOException {
				//生产者发送的消息存放在body中
				String msg = new String(body, "utf-8");//以utf-8的编码方式接受消息(编码可改)
				System.out.println("Rev--->" + msg);
			}
		};	
		channel.basicConsume(QUEUE_NAME, true, consumer);//将消费者与队列关联起来	
	}

}

启动消费者,消息接受后会打印出来,并且MQ控制台相应队列中的消息也会移除。

以上即为简单队列的示例。

总结:

生产者与消费者一一对应,无法做到多个消费者消费同一条消息,并且当队列名修改时必须双方同时修改。简单队列在真正的应用中并不常见。

猜你喜欢

转载自blog.csdn.net/yangsheng0111/article/details/80809396