rabbitmq简单队列使用例子

demo下载地址:https://gitee.com/wuhan1/rabbitmq-demo.git
简单队列的模式图

特点:一个生产者对应一个消费者,生产者将消息发送到指定队列。消费者从该队列接收消息。
引入jar包

		<dependency>
			<groupId>com.rabbitmq</groupId>
			<artifactId>amqp-client</artifactId>
			 <version>3.4.1</version>
		</dependency>

1.编写连接工具类ConnectionUtils

public class ConnectionUtils {
	
	private ConnectionUtils(){}

	private static final String HOST = "localhost";
	private static final int PORT =5672;
	private static final String USER_NAME = "guest";
	private static final String PASS_WORD = "guest";
	private static final String V_HOST = "/";
	
	/**
	 * 通过连接工厂获取连接
	 */
	public static Connection getConn() throws IOException, TimeoutException{
		//1、定义连接工厂
		ConnectionFactory factory = new ConnectionFactory();
		//2、设置服务器地址
		factory.setHost(HOST);
		//3.设置端口
		factory.setPort(PORT);
		//4、设置虚拟主机、用户名、密码
		factory.setVirtualHost(V_HOST);
		factory.setUsername(USER_NAME);
		factory.setPassword(PASS_WORD);
		return factory.newConnection();
	}
}

其中vhost的作用:实际就是起隔离的作用,更详细的解释:本质上是一个mini版的RabbitMQ服务器,拥有自己的队列、绑定、交换器和权限控制;通过在各个实例间提供逻辑上分离,允许你为不同应用程序安全保密地运行数据;AMQP概念的基础,必须在连接时进行指定,RabbitMQ包含了默认vhost:“/”;在RabbitMQ中创建一个用户时,用户通常会被指派给至少一个vhost,并且只能访问被指派vhost内的队列、交换器和绑定,vhost之间是绝对隔离的

2.编写生产者

public class SimpleProduct {
	public static final String SIMPLE_QUEUE = "simple_queue";

	public static void main(String[] args) throws IOException, TimeoutException {
		Connection conn = ConnectionUtils.getConn();
		//声明信道
		Channel channel = conn.createChannel();
		//声明队列,durable true声明一个持久队列(该队列将在服务器重新启动后继续存在),exclusive=true声明独占队列(仅限于此连接)
		//autoDelete true服务器将在不再使用时删除它, arguments队列的其他属性
		channel.queueDeclare(SIMPLE_QUEUE, true, false, false, null);
		//消息内容
		String message = "简单对列模式";
		//发布消息
		channel.basicPublish("", SIMPLE_QUEUE, null, message.getBytes());
		//关闭
		channel.close();
		conn.close();
	}
}

这几个参数注意跟创建队列的时候选择的保持一致,不然会报错

客户端查看地址:http://localhost:15672/ 默认用户名/密码 guest/guest

如果参数跟创建时选择的不一致,报错信息,例如代码这样写

启动成功时会看到消息创建成功

3.编写消费者

public class SimpleConsome {

	public static void main(String[] args) throws IOException, TimeoutException {
		Connection conn = ConnectionUtils.getConn();
		Channel channel = conn.createChannel();
		channel.queueDeclare(SimpleProduct.SIMPLE_QUEUE, true, false, false, null);
		//handleDelivery父类没有实现,需要自己写
		DefaultConsumer defaultConsumer = new DefaultConsumer(channel){
			@Override
			public void handleDelivery(String consumerTag, Envelope envelope, BasicProperties properties, byte[] body)
					throws IOException {
				System.out.println("消费消息:"+new String(body, "UTF-8"));
			}
		};
		//声明消费者队列
		//true:表示自动确认,只要消息从队列中获取,无论消费者获取到消息后是否成功消费,都会认为消息已经成功消费
        //false:表示手动确认,消费者获取消息后,服务器会将该消息标记为不可用状态,等待消费者的反馈,
       // 如果消费者一直没有反馈,那么该消息将一直处于不可用状态,并且服务器会认为该消费者已经挂掉,不会再给其
        //发送消息,直到该消费者反馈。
		channel.basicConsume(SimpleProduct.SIMPLE_QUEUE, true,defaultConsumer);
	}
}

输出消息

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值