3、RabbitMQ生产者、消费者实战

本文详细介绍了RabbitMQ的生产者和消费者实现,包括如何配置pom.xml文件,以及具体编写生产者和消费者的实战步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、父pom.xml

<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.ashare</groupId>
  <artifactId>JavaAction</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <packaging>pom</packaging>
  <name>JavaAction</name>
  <description>JavaAction</description>
  
  <modules>
  	<!-- spring boot rabbitmq集成 -->
  	<module>SpringBootRabbitMQ</module>
  </modules>
  
  <properties>
  	<java.version>1.8</java.version>
  </properties>
  
  <!-- spring boot启动父依赖 -->
  <parent>
  	<groupId>org.springframework.boot</groupId>
   	<artifactId>spring-boot-starter-parent</artifactId>
   	<version>2.1.0.RELEASE</version>
   	<relativePath/>
  </parent>
	
  <dependencies>
  	<dependency>
    	<groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
   	</dependency>
  </dependencies>

  <build>
   	<plugins>
   		<plugin>
			<groupId>org.apache.maven.plugins</groupId>
			<artifactId>maven-compiler-plugin</artifactId>
			<configuration>
				<source>${java.version}</source>
				<target>${java.version}</target>
			</configuration>
		</plugin>
    	<plugin>
        	<groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
       	</plugin>
   	</plugins>
  </build>
</project>

2、子pom.xml

<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>
  <parent>
    <groupId>com.java.ashare</groupId>
    <artifactId>JavaAction</artifactId>
    <version>0.0.1-SNAPSHOT</version>
  </parent>
  <artifactId>SpringBootRabbitMQ</artifactId>
  <name>SpringBootRabbitMQ</name>
  <description>SpringBootRabbitMQ</description>
  
  <dependencies>
  	<dependency>
    	<groupId>org.springframework.boot</groupId>
       	<artifactId>spring-boot-starter-amqp</artifactId>
   	</dependency>
  </dependencies>
  
  <build>
   	<plugins>
  		<plugin>
			<groupId>org.apache.maven.plugins</groupId>
			<artifactId>maven-jar-plugin</artifactId>
			<version>2.6</version>
			<configuration>
			 	<archive>
			  		<manifest>
				   		<addClasspath>true</addClasspath>
				   		<classpathPrefix>lib/</classpathPrefix>
				   		<mainClass>com.java.ashare.config.client.ConfigClientApplication</mainClass>
			  		</manifest>
			 	</archive>
			</configuration>
    	</plugin>
	</plugins>
  </build>
</project>

3、生产者

package com.java.ashare.rabbitmq.client;

import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
import com.rabbitmq.client.ShutdownListener;
import com.rabbitmq.client.ShutdownSignalException;

public class Producer {

	public void send() throws Exception {
		
		ConnectionFactory connectionFactory = new ConnectionFactory();
		connectionFactory.setHost("192.168.78.169");
		connectionFactory.setPort(5672);
		connectionFactory.setUsername("guest");
		connectionFactory.setPassword("guest");
		connectionFactory.setVirtualHost("/");
		
		// 创建连接,如果遇到一个channel流量很大时会拖累其他同一个Connection创建的channel,此时可以考虑连接池
		Connection conn = connectionFactory.newConnection();
		// connection、channel关闭监听器,回调
		conn.addShutdownListener(new ShutdownListener() {
			@Override
			public void shutdownCompleted(ShutdownSignalException cause) {
				if(cause.isHardError()) {
					Connection conn  = (Connection) cause.getReference();
				} else {
					Channel channel = (Channel) cause.getReference();
				}
			}
		});
		
		// 创建信道channel
		// Connection可以创建多个channel实例,但一个channel实例不能在线程间共享,线程不安全
		// 一般情况下:一个线程对应一个channel
		Channel channel = conn.createChannel();
		
		
		// 声明交换器
		// exchange: 	交换器名称
		// type: 		交换器类型,direct、topic、fanout、headers
		// durable: 	持久化,默认为false,true表示存盘重启不会丢失(持久化交换器元数据,不是消息)
		// autoDelete:	自动删除,默认为false,true表示自动删除,前提是至少有一个队列或交换器与这个交换器绑定,之后所有队列或交换器都与此解绑
		// internal: 	是否内置,默认为false,true表示内置交换器,客户端无法直接发送消息到此交换器,只能通过交换器路由到交换器这种方式
		// arguments:	其他一些结构化参数,如alternate-exchange
		channel.exchangeDeclare("EXCHANGE_1", "direct");
		//channel.exchangeDeclare(exchange, type, durable);
		//channel.exchangeDeclare(exchange, type, durable, autoDelete, arguments);
		//channel.exchangeDeclare(exchange, type, durable, autoDelete, internal, arguments);
		// 客户端无需等待服务器返回Declare-OK,返回值void,如果声明完之后,紧接着使用这个交换器,会发生异常,不建议使用
		//channel.exchangeDeclareNoWait(exchange, type, durable, autoDelete, internal, arguments);
		// 检测交换器是否存在,如果存在正常返回,如果不存在则抛出异常,同时channel会关闭
		//channel.exchangeDeclarePassive(name);
		
		// 删除交换器
		// exchange:	交换器名称
		// ifUnused:	设置是否在交换器没有被使用的情况下删除,true表示此交换器没有被使用才会删除,false表示无论如何都会被删除
		//channel.exchangeDelete(exchange);
		//channel.exchangeDelete(exchange, ifUnused);
		//channel.exchangeDeleteNoWait(exchange, ifUnused);
		
		
		// 声明队列
		// queue:队列名称
		// durable: 持久化,默认为false,true表示存盘重启不会丢失(持久化队列元数据,不是消息)
		// exclusive:是否排他,为 true 则设置队列为排他的。如果一个队列被声明为排他队列,该队列仅对首次声明它的连接可见,并在连接断开时自动删除。
		// 			     这里需要注意三点:排他队列是基于连接( Connection) 可见的,同 个连接的不同信道 (Channel)
		//			     是可以同时访问同一连接创建的排他队列; "首次"是指如果 个连接己经声明了
		//			     排他队列,其他连接是不允许建立同名的排他队列的,这个与普通队列不同:即使该队
		//			     列是持久化的,一旦连接关闭或者客户端退出,该排他队列都会被自动删除,这种队列
		//			     适用于一个客户端同时发送和读取消息的应用场景。
		// autoDelete: 是否自动删除,true表示自动删除,前提是至少有一个消费者连接到这个队列,然后所有消费者都断开与这个队列的连接,才会自动删除
		// arguments: 设置其他一些参数,如x-message-ttl, x-expires, x-max-length, x-dead-letter-exchange, x-dead-letter-routing-key等等
		channel.queueDeclare("QUEUE_1", false, false, false, null);
		//channel.queueDeclare();		// 默认创建一个由rabbitmq命名的队列,匿名队列,排他的、自动删除的、非持久化
		//channel.queueDeclare(queue, durable, exclusive, autoDelete, arguments);
		// 返回void,无需等待服务器的任何返回
		//channel.queueDeclareNoWait(queue, durable, exclusive, autoDelete, arguments);
		// 检测队列是否存在,如果存在则正常返回,如果不存在则抛出异常
		//channel.queueDeclarePassive(queu
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值