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控制台相应队列中的消息也会移除。
以上即为简单队列的示例。
总结:
生产者与消费者一一对应,无法做到多个消费者消费同一条消息,并且当队列名修改时必须双方同时修改。简单队列在真正的应用中并不常见。
扫码关注公众号“JAVA记录册”,免费领取超实用软件开发资料视频(包括大数据,前端完整视频,maven教程视频,java面试必备视频教程,Java并发视频教程)
该公众号致力于为大家分享工作中会用到一些简单实用的小知识,而不是那些悬在云端的高大上但又感觉空泛的文章,欢迎大家关注,谢谢!