使用原生Api操作rabbitmq
发送的消息
rabbitmq控制台查看到的消息
消息的消费有两种形式,一种是拉取消息,一种推送消息
拉取消息
推送消息
代码部分
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.java</groupId> <artifactId>rabbitmq-server</artifactId> <packaging>pom</packaging> <version>1.0-SNAPSHOT</version> <modules> <module>rabbitmq-provider</module> <module>rabbitmq-consumer</module> <module>rabbitmq-original</module> <module>rabbitmq-springboot</module> </modules> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.5.7</version> <relativePath/> <!-- lookup parent from repository --> </parent> <properties> <java.version>1.8</java.version> </properties> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-amqp</artifactId> <version>2.5.7</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <version>2.5.7</version> </dependency> <dependency> <groupId>org.springframework.amqp</groupId> <artifactId>spring-rabbit-test</artifactId> <scope>test</scope> </dependency> <!--引入junit单元测试依赖--> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> </dependency> <dependency> <groupId>com.rabbitmq</groupId> <artifactId>amqp-client</artifactId> <version>5.12.0</version> </dependency> </dependencies> </dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> </dependency> <dependency> <groupId>io.springfox</groupId> <artifactId>springfox-swagger2</artifactId> <version>2.9.2</version> </dependency> <dependency> <groupId>io.springfox</groupId> <artifactId>springfox-swagger-ui</artifactId> <version>2.9.2</version> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-stream-rabbit</artifactId> <version>3.2.5</version> </dependency> <!-- <dependency>--> <!-- <groupId>org.springframework.cloud</groupId>--> <!-- <artifactId>spring-cloud-stream-binder-kafka</artifactId>--> <!-- <version>2.2.1.RELEASE</version>--> <!-- </dependency>--> <!-- <dependency>--> <!-- <groupId>org.springframework.cloud</groupId>--> <!-- <artifactId>spring-cloud-stream-binder-rocketmq</artifactId>--> <!-- <version>0.2.2.RELEASE</version>--> <!-- </dependency>--> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project>
上面的演示部分是直接和队列交互的,下面演示客户端,交换机,队列三者交互
代码部分
完整代码
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <parent> <artifactId>rabbitmq-server</artifactId> <groupId>com.java</groupId> <version>1.0-SNAPSHOT</version> </parent> <modelVersion>4.0.0</modelVersion> <artifactId>rabbitmq-original</artifactId> <dependencies> <dependency> <groupId>com.rabbitmq</groupId> <artifactId>amqp-client</artifactId> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> </dependency> </dependencies> </project>
package com.java.util; import java.text.SimpleDateFormat; import java.util.Date; /** * 作者 yourheart * 时间: 2020/5/27 14:35 * 描述 */ public class TimeUtils { //获取当前时间 public static String getTime() { Date date = new Date(); SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); String format = sdf.format(date); return format; } /** * 获取哪一天 * @return */ public static String getDay() { Date date = new Date(); SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); String format = sdf.format(date); return format; } public static String getExactTime() { Date date = new Date(); SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS"); String format = sdf.format(date); return format; } /** * 获取具体是哪一天的时间 * @return */ public static int getSpecificTime(){ Date date = new Date(); SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); String format = sdf.format(date); String[] split = format.split("-"); int parseInt = Integer.parseInt(split[2]); return parseInt; } /** * 获取哪一年 * @return */ public static String getYear() { Date date = new Date(); SimpleDateFormat sdf = new SimpleDateFormat("yyyy"); String format = sdf.format(date); return format; } }
package com.java; import com.java.util.TimeUtils; import com.rabbitmq.client.Channel; import com.rabbitmq.client.Connection; import org.junit.Test; import java.util.HashMap; import java.util.Map; /** * @Description: 原生rabbitmq发送消息 * @Author: qiuxie * @Create: 2023/7/20 17:00 */ public class SendMessageTest { private final String QUEUE_NAME="hello 20230721"; private final String QUORUM_QUEUE_NAME="hello quorum 20230721"; private final String STREAM_QUEUE_NAME="stream"; @Test public void totalTest() throws Exception { // test002(); //test001(); test(); } public void test002() throws Exception { Connection connection = RabbitMqUtil.getConnection(); Channel channel = connection.createChannel(); while (true){ try { Thread.sleep(1000L); } catch (InterruptedException e) { System.out.println("休眠异常"); } //这里申明的是Stream队列 Map<String,Object> param=new HashMap<>(16); param.put("x-queue-type","stream"); //20GB param.put("x-max-length-bytes",20_000_000_000L); //100MB param.put("x-stream-max-segment-size-bytes",100_000_000); channel.queueDeclare(STREAM_QUEUE_NAME,true,false,false,param); String message="hello qiuxie"+ TimeUtils.getTime(); channel.basicPublish("", STREAM_QUEUE_NAME,null,message.getBytes("UTF-8")); System.out.println("发送的消息为:"+message); } } public void test001() throws Exception { Connection connection = RabbitMqUtil.getConnection(); Channel channel = connection.createChannel(); while (true){ try { Thread.sleep(1000L); } catch (InterruptedException e) { System.out.println("休眠异常"); } //这里申明的是Quorum队列 Map<String,Object> param=new HashMap<>(16); param.put("x-queue-type","quorum"); channel.queueDeclare(QUORUM_QUEUE_NAME,true,false,false,param); String message="hello qiuxie"+ TimeUtils.getTime(); channel.basicPublish("", QUORUM_QUEUE_NAME,null,message.getBytes("UTF-8")); System.out.println("发送的消息为:"+message); } } public void test() throws Exception { Connection connection = RabbitMqUtil.getConnection(); Channel channel = connection.createChannel(); while (true){ try { Thread.sleep(1000L); } catch (InterruptedException e) { System.out.println("休眠异常"); } //这里申明的是经典队列 channel.queueDeclare(QUEUE_NAME,false,false,false,null); String message="hello qiuxie "+ TimeUtils.getTime(); channel.basicPublish("", QUEUE_NAME,null,message.getBytes("UTF-8")); System.out.println("发送的消息为:"+message); } } }
package com.java; import com.rabbitmq.client.Connection; import com.rabbitmq.client.ConnectionFactory; /** * @Description: * @Author: qiuxie * @Create: 2023/7/20 17:05 */ public class RabbitMqUtil { private static Connection connection; private static final String HOST_NAME="192.168.0.106"; private static final int HOST_PORT=5672; public static final String QUEUE_HELLO="hello"; public static final String QUEUE_WORK="work"; public static final String QUEUE_PUBLISH="publish"; public static Connection getConnection() throws Exception { if(null == connection) { ConnectionFactory factory = new ConnectionFactory(); factory.setHost(HOST_NAME); factory.setPort(HOST_PORT); factory.setUsername("root"); factory.setPassword("qwejkl1992"); connection = factory.newConnection(); } return connection; } }
package com.java; import com.rabbitmq.client.Channel; import com.rabbitmq.client.Connection; import com.rabbitmq.client.GetResponse; import org.junit.Test; import java.util.HashMap; import java.util.Map; /** * @Description: 拉取消息 * @Author: qiuxie * @Create: 2023/7/20 17:25 */ public class PullMessageTest { private final String QUEUE_NAME="hello 20230721"; private final String QUORUM_QUEUE_NAME="hello quorum 20230721"; @Test public void test() throws Exception { Connection connection = RabbitMqUtil.getConnection(); Channel channel = connection.createChannel(); channel.basicQos(100); Map<String,Object> params = new HashMap<>(16); System.out.println(" [*] Waiting for messages. To exit press CTRL+C"); GetResponse response = channel.basicGet(QUEUE_NAME, true); if(null != response){ System.out.println(new String(response.getBody(),"UTF-8")); } GetResponse response2 = channel.basicGet(QUEUE_NAME, true); if(null != response2){ System.out.println(new String(response2.getBody(),"UTF-8")); } channel.close(); connection.close(); } }
package com.java; import com.rabbitmq.client.*; import java.io.IOException; import java.util.Map; /** * @Description: 推送消息 * @Author: qiuxie * @Create: 2023/7/20 17:39 */ public class PushMessageTest { private final static String QUEUE_NAME="hello 20230721"; private final static String QUORUM_QUEUE_NAME="hello quorum 20230721"; private final static String STREAM_QUEUE_NAME="stream"; public static void main(String[] args) throws Exception { Connection connection = RabbitMqUtil.getConnection(); Channel channel = connection.createChannel(); DefaultConsumer consumer = new DefaultConsumer(channel) { @Override public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException { String routingKey = envelope.getRoutingKey(); System.out.println("routingKey >"+routingKey); String contentType = properties.getContentType(); System.out.println("contentType >"+contentType); long deliveryTag = envelope.getDeliveryTag(); System.out.println("deliveryTag >"+deliveryTag); System.out.println("content:"+new String(body,"UTF-8")); System.out.println("messageId:"+properties.getMessageId()); Map<String, Object> headers = properties.getHeaders(); if (headers!=null){ properties.getHeaders().forEach((key,value)-> System.out.println("key: "+key +"; value: "+value)); } //消息处理完后,进行答复。答复过的消息,服务器就不会再次转发。 //没有答复过的消息,服务器会一直不停转发。 channel.basicAck(deliveryTag, false); } }; //进入消费状态、手动ACK channel.basicConsume(QUEUE_NAME, false, consumer); } }
package com.java.exchange; import com.java.RabbitMqUtil; import com.java.util.TimeUtils; import com.rabbitmq.client.Channel; import com.rabbitmq.client.Connection; import org.junit.Test; import java.io.IOException; /** * @Description: * @Author: qiuxie * @Create: 2023/7/21 0:16 */ public class EmitLogDirect { private final String EXCHANGE_NAME = "directExchange 20230722"; private final String TOPIC_EXCHANGE_NAME = "topicExchange 20230722"; @Test public void messageTest() throws Exception { while (true) { try { Thread.sleep(1000L); } catch (InterruptedException e) { System.out.println("休眠异常"); } test(); } } public void test001() throws Exception { Connection connection = RabbitMqUtil.getConnection(); Channel channel = connection.createChannel(); //发送者只管往exchange里发消息,而不用关心具体发到哪些queue里。 channel.exchangeDeclare(TOPIC_EXCHANGE_NAME, "topic"); String message = "LOG INFO"; channel.basicPublish(TOPIC_EXCHANGE_NAME, "anonymous.info", null, message.getBytes()); // channel.basicPublish(EXCHANGE_NAME, "tuling.loulan.debug", null, message.getBytes()); } public void test() throws Exception { Connection connection = RabbitMqUtil.getConnection(); Channel channel = connection.createChannel(); channel.exchangeDeclare(EXCHANGE_NAME,"direct"); String message = "LOG INFO 44444 "+ TimeUtils.getTime(); channel.basicPublish(EXCHANGE_NAME, "debug", null, message.getBytes()); // channel.close(); // connection.close(); } }
package com.java.exchange; import com.java.RabbitMqUtil; import com.rabbitmq.client.*; import java.io.IOException; /** * @Description: * @Author: qiuxie * @Create: 2023/7/21 0:23 */ public class ReceiveLogsDirect { private static final String EXCHANGE_NAME = "directExchange 20230722"; public static void main(String[] args) throws Exception { Connection connection = RabbitMqUtil.getConnection(); Channel channel = connection.createChannel(); channel.exchangeDeclare(EXCHANGE_NAME, "direct"); String queueName = channel.queueDeclare().getQueue(); System.out.println("队列名称:"+queueName); channel.queueBind(queueName, EXCHANGE_NAME, "info"); channel.queueBind(queueName, EXCHANGE_NAME, "debug"); Consumer myconsumer = new DefaultConsumer(channel) { @Override public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException { System.out.println("========================"); String routingKey = envelope.getRoutingKey(); System.out.println("routingKey >" + routingKey); String contentType = properties.getContentType(); System.out.println("contentType >" + contentType); long deliveryTag = envelope.getDeliveryTag(); System.out.println("deliveryTag >" + deliveryTag); System.out.println("content:" + new String(body, "UTF-8")); //消息处理完后,进行答复。答复过的消息,服务器就不会再次转发。 //没有答复过的消息,服务器会一直不停转发。 // channel.basicAck(deliveryTag, false); } }; channel.basicConsume(queueName, true, myconsumer); } }
以上就是原生mq操作的全部过程,rabbitmq安装教程https://www.cnblogs.com/q202105271618/p/16290851.html