文章目錄
- 一、代碼
- 1、添加依賴
- 2、配置RabbitMQ連接
- 3、RabbitMQ配置
- 4、創建生產者
- 5、創建消費者
- 6、測試
- 二、遇到的問題
- 1、Channel shutdown
- 2、收不到信息
- 3、安裝RabbitMQ,無法訪問控制臺訪問
一、代碼
1、添加依賴
在pom.xml文件中添加RabbitMQ的相關依賴
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-amqp</artifactId>
</dependency>
2、配置RabbitMQ連接
在application.properties文件中配置RabbitMQ的連接信息
spring.rabbitmq.host=your-rabbitmq-host
spring.rabbitmq.port=your-rabbitmq-port
spring.rabbitmq.username=your-rabbitmq-username
spring.rabbitmq.password=your-rabbitmq-password
其中,spring.rabbitmq.host和spring.rabbitmq.port是RabbitMQ服務器的地址和端口號,默認端口號為5672;spring.rabbitmq.username和spring.rabbitmq.password是登錄RabbitMQ的用戶名和密碼,首次安裝,默認賬號和密碼都為guest。
3、RabbitMQ配置
注:導入的包是org.springframework.amqp下面的
啟動時,自動幫我們創建好Queue和Exchange,進行綁定
@Configuration
public class RabbitMQConfig {@Autowiredprivate ConnectionFactory connectionFactory;@Beanpublic RabbitAdmin rabbitAdmin() {return new RabbitAdmin(connectionFactory);}@Beanpublic Queue queue() {Queue queue = new Queue("forlan-queue");rabbitAdmin().declareQueue(queue);return queue;}@Beanpublic DirectExchange exchange() {DirectExchange exchange = new DirectExchange("forlan-exchange");rabbitAdmin().declareExchange(exchange);return exchange;}@Beanpublic Binding binding() {return BindingBuilder.bind(queue()).to(exchange()).with("forlan-routing-key");}
}
4、創建生產者
@Component
public class RabbitMQProducer {@Autowiredprivate RabbitTemplate rabbitTemplate;public void testSend(){rabbitTemplate.convertAndSend("forlan-exchange", "forlan-routing-key", "測試發送RabbitMQ");}
}
其中,RabbitTemplate是Spring AMQP庫提供的一個類,用于操作RabbitMQ隊列;convertAndSend方法用于將消息對象轉換成RabbitMQ的消息格式,并通過指定的交換機和路由鍵將消息發送到指定的隊列中,在這里,我們使用了"forlan-exchange和"forlan-routing-key"作為交換機和路由鍵的名稱。
5、創建消費者
@Component
public class RabbitMQConsumer {@RabbitListener(queues = "forlan-queue")public void handleMessage(String message) {System.out.println("RabbitMQConsumer收到消息:" + message);}
}
@RabbitListener 是Spring框架為簡化RabbitMQ消息監聽而提供的一個注解。通過在方法上添加此注解,Spring會將該方法注冊為一個消息監聽器,當RabbitMQ隊列中有消息到達時,會自動調用該方法進行處理。也就是當RabbitMQ中的 “forlan-queue” 隊列中有新的消息到達時,就會自動調用 handleMessage 方法進行處理。
6、測試
@Autowired
private RabbitMQProducer rabbitMQProducer;
@Test
public void send() {rabbitMQProducer.testSend("Forlan測試發送RabbitMQ消息");
}
消費者成功收到信息
二、遇到的問題
1、Channel shutdown
Channel shutdown: channel error; protocol method: #method<channel.close>(reply-code=404, reply-text=NOT_FOUND - no exchange 'forlan-exchange' in vhost '/', class-id=60, method-id=40)
不存在的,不會自動幫你創建,你可以在RabbitMQ后臺創建,也可以在代碼中設置不存在時創建,項目中就是采取在代碼中自動創建了
2、收不到信息
因為RabbitMQConsumer沒有注入到容器中,記得加上@Component,如下:
@Component
public class RabbitMQConsumer {...
}
3、安裝RabbitMQ,無法訪問控制臺訪問
需要開放控制臺遠程登錄權限,在安裝的目錄/etc/rabbitmq下配置好rabbitmq.config,內容如下:
[{rabbit,[{loopback_users,[]}]}].
注:記得配置不要有多余的標點符號,不然會出現Failed to start RabbitMQ broker.