項目中,作為生產者自定義消息發(fā)送到RabbitMq。
1.引入rmq依賴
<!-- rabbitmq 依賴 -->
<dependency>
<groupId>com.rabbitmq</groupId>
<artifactId>amqp-client</artifactId>
<version>5.9.0</version>
</dependency>
2.創(chuàng)建鏈接、斷開連接工具類。
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
import java.io.IOException;
import java.util.concurrent.TimeoutException;
/**
* RabbitMq 工具類
*
* @author Klay
* @date 2023/6/25
*/
public class RabbitmqUtils {
private static Channel channel = null;
private static Connection connection = null;
/**
* 獲取連接
*
* @author Klay
* @date 2023/6/25 10:37
*/
public static Channel getChannel() {
//定義連接池
ConnectionFactory factory = new ConnectionFactory();
//設置主機地址
factory.setHost("127.0.0.1");
//設置端口
factory.setPort(5672);
//設置用戶名
factory.setUsername("guest");
//密碼
factory.setPassword("guest");
//虛擬機路徑
factory.setVirtualHost("/");
try {
connection = factory.newConnection();
//創(chuàng)建信道
channel = connection.createChannel();
} catch (IOException e) {
e.printStackTrace();
} catch (TimeoutException e) {
e.printStackTrace();
}
return channel;
}
/**
* 關閉連接
*
* @author Klay
* @date 2023/6/25 10:37
*/
public static void closeConnection() {
try {
channel.close();
connection.close();
} catch (IOException e) {
e.printStackTrace();
} catch (TimeoutException e) {
e.printStackTrace();
}
}
}
3.發(fā)送消息。大部分業(yè)務應用場景中,只需要發(fā)送消息到指定的交換機(exchange)中。如果業(yè)務需要創(chuàng)建交換機,則將注釋的代碼打開,創(chuàng)建交換機、隊列,并綁定。發(fā)送消息時,將對應的交換機、路由進行替換即可。
import com.hikvision.ardatatormq.utils.RabbitmqUtils;
import com.rabbitmq.client.Channel;
import lombok.extern.slf4j.Slf4j;
import java.io.IOException;
/**
* @author Klay
* @date 2023/10/16 016
*/
@Slf4j
public class SendMessageTest {
public static void main(String[] args){
//利用寫好工具類獲取信道連接
Channel channel = RabbitmqUtils.getChannel();
try {
/**
*創(chuàng)建一個交換機
*1.交換機名稱
*2.交換機類型有fanout,direct,topic,headers
*3.是否持久化
*4.設置是自動刪除,當沒有隊列與當前交換機綁定時自動刪除
*5.設置是否內置,表示內置的交換機
*6.設置其他的一些結構化參數
*/
// channel.exchangeDeclare("text_pubsub", BuiltinExchangeType.FANOUT, false, false, false, null);
/**
*1.隊列名稱
*2.是否持久化,持久化會存盤,重啟也還存在
*3.exclusive 是否排他如果一個隊列被聲明為排他的隊列,該隊列僅對首次聲明它的連接可見,并在連接斷開時自動刪除這里需要注意三點:排他的隊列是基于連接(Connection)可見的,同一個連接的不同信道(Channel)是可以同時訪問同一連接創(chuàng)建的排他隊列;“首次”是指如果一個連接已經聲明了一個排他隊列,其它連接是不允許建立同名的排他隊列的,這個與普通隊列不同;即使該隊列是持久化的,一旦連接關閉或者客戶端退出,該排他隊列都會被自動刪除,這種隊列適用于一個客戶端同時發(fā)送和讀取消息的應用場景。
*4.是否自動刪除至少有一個消費者連接到這個隊列,之后所有與這個隊列連接的消費者都斷開時,才會自動刪除
*5.設置隊列的其他配置參數
*/
// channel.queueDeclare("pubsub_queue1", false, false, false, null);
/**
*將交換機與隊列綁定
*1.隊列名稱
*2.交換機名稱
*3.routerkey(路由key)
*4.其他的綁定參數
*/
// channel.queueBind("pubsub_queue1", "text_pubsub", "routingKeyTest");
/**
*發(fā)送消息
*1.交換機名稱
*2.routerkey路由key,目前沒有指定雙引號即可
*3.無額外配置寫null
*4.消息體
*/
String msg = "發(fā)布訂閱模式?。?!";
channel.basicPublish("amq.topic", "routingKeyTest", null, msg.getBytes());
log.info("消息發(fā)送成功!:{}", msg);
} catch (IOException e) {
log.error("發(fā)送消息IOException:{}", e);
} finally {
//關閉連接
RabbitmqUtils.closeConnection();
}
}
}
4.進行測試。
? ? ? ? 4.1為交換機amq.topic創(chuàng)建一個測試隊列并綁定。
? ? ?4.2發(fā)送消息文章來源:http://www.zghlxwxcb.cn/news/detail-722926.html
文章來源地址http://www.zghlxwxcb.cn/news/detail-722926.html
到了這里,關于JAVA發(fā)送消息到RabbitMq的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網!