Rabbitmq基本使用
阿新 • • 發佈:2018-11-19
基本概念
channel:訊息通道
exchage:訊息路由規則,四種模式(topic、direct、fanout、header)
direct:預設,根據routingKey完全匹配,好處是先匹配再發送
topic:根據繫結關鍵字萬用字元規則匹配、比較靈活
fanout:不需要指定routingkey,相當於群發
header:不太常用,可以自定義匹配規則
queue:訊息儲存
routerKey:訊息路由關鍵字(傳送的時候成為bindingkey,接收成為routingKey)
佇列的概念(生產者消費者啟動報錯大多數都是這幾個不匹配導致)
durable:持久化到硬碟
exclusive:唯一性
autoDelete:自動刪除
/** * 第二個引數:queue的持久化是通過durable=true來實現的。 * 第三個引數:exclusive:排他佇列,如果一個佇列被宣告為排他佇列,該佇列僅對首次申明它的連線可見,並在連線斷開時自動刪除。這裡需要注意三點:
1. 排他佇列是基於連線可見的,同一連線的不同通道是可以同時訪問同一連線建立的排他佇列;
2.“首次”,如果一個連線已經聲明瞭一個排他佇列,其他連線是不允許建立同名的排他佇列的,這個與普通佇列不同;
3.即使該佇列是持久化的,一旦連線關閉或者客戶端退出,該排他佇列都會被自動刪除的,這種佇列適用於一個客戶端傳送讀取訊息的應用場景。 * 第四個引數:自動刪除,如果該佇列沒有任何訂閱的消費者的話,該佇列會被自動刪除。這種佇列適用於臨時佇列。 *@param * @return * @Author zxj */ @Bean public Queue queue() { Map<String, Object> arguments = new HashMap<>(); arguments.put("x-message-ttl", 25000);//25秒自動刪除 Queue queue = new Queue("topic.messages", true, false, true, arguments); returnqueue; }
@Configuration public class RabbitConfig { // 傳送訊息的格式轉換器 @Bean public RabbitTemplate rabbitTemplate(ConnectionFactory connectionFactory) { RabbitTemplate template = new RabbitTemplate(connectionFactory); template.setMessageConverter(new Jackson2JsonMessageConverter()); return template; } // 接收訊息的格式轉換器 @Bean public SimpleRabbitListenerContainerFactory rabbitListenerContainerFactory(ConnectionFactory connectionFactory) { SimpleRabbitListenerContainerFactory factory = new SimpleRabbitListenerContainerFactory(); factory.setConnectionFactory(connectionFactory); factory.setMessageConverter(new Jackson2JsonMessageConverter()); return factory; } // 通道配置,此地使用direct模式 @Bean public DirectExchange defaultExchange() { return new DirectExchange(MQConstant.EXCHANGE, true, false); } // 配置佇列規則屬性 例如保活時間 持久化 是否自動刪除等 @Bean public Queue queue() { Map<String, Object> arguments = new HashMap<>(); arguments.put("x-message-ttl", 25000);//25秒自動刪除 Queue queue = new Queue(MQConstant.QUEUE_NAME, true, false, true, arguments); return queue; } // 繫結佇列和exchange @Bean public Binding binding() { return BindingBuilder.bind(queue()).to(defaultExchange()).with(MQConstant.QUEUE_NAME); } } 如何傳送 @Autowired private RabbitTemplate template; //convertAndSend和send的區別是這個convert更方便使用,可以傳object進去 template.convertAndSend(MQConstant.EXCHANGE, bindingKey, msg); //如何接收,注意佇列名稱、exchange名稱、routingKey的指定。 //注意:佇列的訊息只要被一個消費者匹配消費後就不存在了 @Component @RabbitListener(containerFactory = "rabbitListenerContainerFactory", bindings = @QueueBinding(value = @Queue(value = "default_queue", durable = "true"), exchange = @Exchange(value = "default_exchange", type = ExchangeTypes.TOPIC), key = "meeting")) @Log4j public class RabbitMqListener { @RabbitHandler public void processMessage(MqMsg message) { log.error( message); } }
Rabbitmq常用配置
spring.rabbitmq.addresses指定client連線到的server的地址,多個以逗號分隔. spring.rabbitmq.dynamic是否建立AmqpAdmin bean. 預設為: true) spring.rabbitmq.host指定RabbitMQ host.預設為: localhost) spring.rabbitmq.listener.acknowledge-mode指定Acknowledge的模式. spring.rabbitmq.listener.auto-startup是否在啟動時就啟動mq,預設: true) spring.rabbitmq.listener.concurrency指定最小的消費者數量. spring.rabbitmq.listener.max-concurrency指定最大的消費者數量. spring.rabbitmq.listener.prefetch指定一個請求能處理多少個訊息,如果有事務的話,必須大於等於transaction數量. spring.rabbitmq.listener.transaction-size指定一個事務處理的訊息數量,最好是小於等於prefetch的數量. spring.rabbitmq.password指定broker的密碼. spring.rabbitmq.port指定RabbitMQ 的埠,預設: 5672) spring.rabbitmq.requested-heartbeat指定心跳超時,0為不指定. spring.rabbitmq.ssl.enabled是否開始SSL,預設: false) spring.rabbitmq.ssl.key-store指定持有SSL certificate的key store的路徑 spring.rabbitmq.ssl.key-store-password指定訪問key store的密碼. spring.rabbitmq.ssl.trust-store指定持有SSL certificates的Trust store. spring.rabbitmq.ssl.trust-store-password指定訪問trust store的密碼. spring.rabbitmq.username指定登陸broker的使用者名稱. spring.rabbitmq.virtual-host指定連線到broker的Virtual host. spring.rabbitmq.publisher-confirms=true 開啟發送確認 spring.rabbitmq.publisher-returns=true 開啟發送失敗退回