rabbitmq消息中间件,按我的理解就是解决同时大量请求造成服务器压力大挂掉,可以作为中间商存储请求,再慢慢让服务器返回。
首先是配置环境,默认已经安装了本地rabbitmq,可以通过localhost:15672 进入管理页面
pom.xml
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-amqp</artifactId> </dependency>
导入依赖后,在RabbitMq Manager页面按照下面步骤设置好登录用户,host和权限,
然后你就可以在ide中写测试代码了。
首先写个连接工具类:
package com.yaimer.d.rabbit; import com.rabbitmq.client.Connection; import com.rabbitmq.client.ConnectionFactory; import com.rabbitmq.client.impl.AMQConnection; import java.io.IOException; import java.util.concurrent.TimeoutException; /** * @program: SpringSecurityTestProject * @description: * @author: yaimer * @create: 2020-09-07 23:56 **/ public class test { /** * 获取MQ的连接 */ public static Connection getConnection() throws IOException, TimeoutException { //定义一个连接工厂 ConnectionFactory factory = new ConnectionFactory(); //设置服务地址 factory.setHost("127.0.0.1"); //设置端口 AMQ 5672 factory.setPort(5672); //vhost factory.setVirtualHost("/vhost"); //用户名 factory.setUsername("zard"); //密码 factory.setPassword("admin"); return factory.newConnection(); } }
简单队列就是一个生产者Producer和一个消费者Consumer
写一个生产者:
package com.yaimer.d.rabbit; import com.rabbitmq.client.Channel; import com.rabbitmq.client.Connection; import java.io.IOException; import java.util.concurrent.TimeoutException; /** * @program: SpringSecurityTestProject * @description: * @author: yaimer * @create: 2020-09-08 00:19 **/ public class produce { private static final String QUEUE_NAME="testQueue"; public static void main(String[] args) throws IOException, TimeoutException { Connection connection = test.getConnection(); //从连接中获取一个通道 Channel channel = connection.createChannel(); //创建队列声明 channel.queueDeclare(QUEUE_NAME,false,false,false,null); String str ="hello_zard_test______"; channel.basicPublish("",QUEUE_NAME,null,str.getBytes()); System.out.println("她走过——————"+str); channel.close(); connection.close(); } }
,接着一个消费者:
package com.yaimer.d.rabbit; import com.rabbitmq.client.*; import java.io.IOException; import java.util.concurrent.TimeoutException; /** * @program: SpringSecurityTestProject * @description: * @author: yaimer * @create: 2020-09-08 00:29 **/ public class consumer { private static final String QUEUE_NAME="testQueue"; public static void main(String[] args) throws IOException, TimeoutException { Connection connection = test.getConnection(); Channel channel =connection.createChannel(); channel.queueDeclare(QUEUE_NAME,false,false,false,null); DefaultConsumer consumer = new DefaultConsumer(channel){ @Override public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException { String str = new String(body,"utf-8"); System.out.println("consumer____"+str); } }; channel.basicConsume(QUEUE_NAME,true,consumer); } }
写完就可以运行了,可以先运行消费者,再运行生产者,运行几次,消费者接受几次。
也可不运行消费者,运行几次生产者,最后运行消费者,会一次性接收。
这是简单队列的实现。