亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

4.RabbitMQ使用規范&整合spring

2019-11-10 17:52:22
字體:
來源:轉載
供稿:網友

特性規范 

sPRing(建議4.2以上,mq支持注解)+RabbitMQ1.6.6默認配置的連接是5個,當rabbit服務器重啟后,會自動重連所有隊列、路由默認是持久化的,當rabbit服務器重啟后,會自動恢復創建優先級隊列級別設置建議為10(權重越大表示優先執行)延遲隊列延遲時間最大建議設置為???所有接收器設置其ack為手動響應,且在listener使用后必須回寫,防止隊列阻塞所有數據發送采用字符串,且存儲數據信息盡量小于10K(已配置使用默認的json轉換器)隊列、路由在創建后,屬性不可更改,如有需要,需申請運維協助(建議使用新的隊列,舊的隊列數據處理完后可以刪除)

 

命名規范

#命名規范:容器名稱.[隊列特點or路由特點].使用的平臺名稱.作用#@容器名稱:queue、exchange#@隊列特點:非持久化標記(undurable)、延時隊列(delay)、優先級隊列(priority)#@路由特點:direct、topic、fanout、headers#@使用的平臺名稱:xiangshang、xiangqian……#@作用:干什么的#eg:消息隊列(queue.xiangshang.message)、延時消息隊列(queue.delay.xiangshang.message)、普通路由(exchange.direct.xiangshang.common)、通用路由(exchange.direct.xiangshang.common)

 

整合Spring

大綱只需以下幾步,即可實現測試,測試環境xshell賬號(服務器:10.200.0.150       用戶名:root           密碼:xs360..COM)rabbitMQ管理平臺(http://10.200.0.150:15672/         用戶名:guest  密碼:guest  連接端口:5672) 項目結構  

依賴的jar

<properties>    <spring.amqp.version>1.6.6.RELEASE</spring.amqp.version></properties><dependencies>    <dependency>        <groupId>org.springframework.amqp</groupId>        <artifactId>spring-amqp</artifactId>        <version>${spring.amqp.version}</version>        <exclusions>            <exclusion>                <groupId>org.springframework</groupId>                <artifactId>spring-core</artifactId>            </exclusion>        </exclusions>    </dependency>    <dependency>        <groupId>org.springframework.amqp</groupId>        <artifactId>spring-rabbit</artifactId>        <version>${spring.amqp.version}</version>        <exclusions>            <exclusion>                <groupId>org.springframework</groupId>                <artifactId>spring-core</artifactId>            </exclusion>            <exclusion>                <groupId>org.springframework</groupId>                <artifactId>spring-messaging</artifactId>            </exclusion>            <exclusion>                <groupId>org.springframework</groupId>                <artifactId>spring-tx</artifactId>            </exclusion>            <exclusion>                <groupId>org.springframework</groupId>                <artifactId>spring-context</artifactId>            </exclusion>        </exclusions>    </dependency></dependencies>

連接配置(rabbitmq-config.properties)

#RabbitMQ服務器工廠參數設置rmq.addresses=10.200.0.150:5672rmq.username=rootrmq.passWord=123456#命名規范:容器名稱.[隊列特點or路由特點].使用的平臺名稱.作用#@容器名稱:queue、exchange#@隊列特點:非持久化標記(undurable)、延時隊列(delay)、優先級隊列(priority)#@路由特點:direct、topic、fanout、headers#@使用的平臺名稱:xiangshang、xiangqian……#@作用:干什么的#eg:消息隊列(queue.xiangshang.message)、延時消息隊列(queue.delay.xiangshang.message)、普通路由(exchange.direct.xiangshang.common)、通用路由(exchange.direct.xiangshang.common)rmq.queue.xiangshang.test=queue.xiangshang.testrmq.queue.undurable.xiangshang.test=queue.undurable.xiangshang.testrmq.queue.priority.xiangshang.test=queue.priority.xiangshang.testrmq.queue.delay.xiangshang.test=queue.delay.xiangshang.testrmq.exchange.direct.xiangshang.test=exchange.direct.xiangshang.testrmq.exchange.fanout.xiangshang.test=exchange.fanout.xiangshang.testrmq.exchange.headers.xiangshang.test=exchange.headers.xiangshang.test

xml配置(rabbitConfiguration.xml)

<?xml version="1.0" encoding="UTF-8"?><beans xmlns="<a href="http://www.springframework.org/schema/beans" "="" style="color: rgb(59, 115, 175); text-decoration: none; border-radius: 0px !important; background: none !important; border: 0px !important; bottom: auto !important; float: none !important; height: auto !important; left: auto !important; line-height: 20px !important; margin: 0px !important; outline: 0px !important; overflow: visible !important; padding: 0px !important; position: static !important; right: auto !important; top: auto !important; vertical-align: baseline !important; width: auto !important; box-sizing: content-box !important; min-height: auto !important;">http://www.springframework.org/schema/beans" xmlns:xsi="<a href="http://www.w3.org/2001/XMLSchema-instance" "="" style="color: rgb(59, 115, 175); text-decoration: none; border-radius: 0px !important; background: none !important; border: 0px !important; bottom: auto !important; float: none !important; height: auto !important; left: auto !important; line-height: 20px !important; margin: 0px !important; outline: 0px !important; overflow: visible !important; padding: 0px !important; position: static !important; right: auto !important; top: auto !important; vertical-align: baseline !important; width: auto !important; box-sizing: content-box !important; min-height: auto !important;">http://www.w3.org/2001/XMLSchema-instance"xmlns:rabbit="<a href="http://www.springframework.org/schema/rabbit" "="" style="color: rgb(59, 115, 175); text-decoration: none; border-radius: 0px !important; background: none !important; border: 0px !important; bottom: auto !important; float: none !important; height: auto !important; left: auto !important; line-height: 20px !important; margin: 0px !important; outline: 0px !important; overflow: visible !important; padding: 0px !important; position: static !important; right: auto !important; top: auto !important; vertical-align: baseline !important; width: auto !important; box-sizing: content-box !important; min-height: auto !important;">http://www.springframework.org/schema/rabbit"xmlns:context="<a href="http://www.springframework.org/schema/context" "="" style="color: rgb(59, 115, 175); text-decoration: none; border-radius: 0px !important; background: none !important; border: 0px !important; bottom: auto !important; float: none !important; height: auto !important; left: auto !important; line-height: 20px !important; margin: 0px !important; outline: 0px !important; overflow: visible !important; padding: 0px !important; position: static !important; right: auto !important; top: auto !important; vertical-align: baseline !important; width: auto !important; box-sizing: content-box !important; min-height: auto !important;">http://www.springframework.org/schema/context"    xsi:schemaLocation="http://www.springframework.org/schema/rabbit http://www.springframework.org/schema/rabbit/spring-rabbit-1.6.xsd        http://www.springframework.org/schema/beans  http://www.springframework.org/schema/beans/spring-beans-4.0.xsd        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd ">    <description>rabbitMQ連接服務配置</description>         <context:property-placeholder location="classpath:rabbitmq-config.properties"/>         <!-- 連接配置 -->    <rabbit:connection-factory id="connectionFactory" addresses="${rmq.addresses}" username="${rmq.username}" password="${rmq.password}" />    <rabbit:admin connection-factory="connectionFactory" />    <!-- 消息轉換器 -->    <bean id="gsonConverter" class="org.springframework.amqp.support.converter.Jackson2JsonMessageConverter" />    <!-- 連接模板 -->    <rabbit:template id="rabbitTemplate" connection-factory="connectionFactory" message-converter="gsonConverter" exchange="${rmq.exchange.direct.xiangshang.test}" />    <!-- 消息隊列  begin -->    <rabbit:queue name="${rmq.queue.xiangshang.test}" durable="true" />    <rabbit:queue name="${rmq.queue.undurable.xiangshang.test}" durable="false" />    <rabbit:queue name="${rmq.queue.priority.xiangshang.test}" durable="false">        <rabbit:queue-arguments>            <entry key="x-max-priority">                <value type="java.lang.Integer">10</value>            </entry>        </rabbit:queue-arguments>    </rabbit:queue>    <rabbit:queue name="${rmq.queue.delay.xiangshang.test}">        <rabbit:queue-arguments>            <entry key="x-message-ttl">                <value type="java.lang.Long">60000</value>            </entry>            <entry key="x-dead-letter-exchange" value="${rmq.exchange.direct.xiangshang.test}"/>            <entry key="x-dead-letter-routing-key" value="${rmq.queue.xiangshang.test}"/>        </rabbit:queue-arguments>    </rabbit:queue>    <!-- 消息隊列 end -->    <!-- 消息路由  begin -->    <rabbit:direct-exchange name="${rmq.exchange.direct.xiangshang.test}">        <rabbit:bindings>            <rabbit:binding queue="${rmq.queue.xiangshang.test}" key="${rmq.queue.xiangshang.test}" />            <rabbit:binding queue="${rmq.queue.undurable.xiangshang.test}" key="${rmq.queue.undurable.xiangshang.test}" />            <rabbit:binding queue="${rmq.queue.priority.xiangshang.test}" key="${rmq.queue.priority.xiangshang.test}" />            <rabbit:binding queue="${rmq.queue.delay.xiangshang.test}" key="${rmq.queue.delay.xiangshang.test}" />        </rabbit:bindings>    </rabbit:direct-exchange>         <!-- 發布訂閱 -->    <rabbit:fanout-exchange name="${rmq.exchange.fanout.xiangshang.test}">        <rabbit:bindings>            <rabbit:binding queue="${rmq.queue.xiangshang.test}"  />            <rabbit:binding queue="${rmq.queue.undurable.xiangshang.test}" />        </rabbit:bindings>    </rabbit:fanout-exchange>         <!-- 路由轉發 -->    <rabbit:headers-exchange name="${rmq.exchange.headers.xiangshang.test}">        <rabbit:bindings>            <rabbit:binding queue="${rmq.queue.delay.xiangshang.test}">                <rabbit:binding-arguments>                    <entry key="x-match" value="all"/>                    <entry key="Operator" value="xsjf"/>                    <entry key="sex" value="male"/>                </rabbit:binding-arguments>            </rabbit:binding>        </rabbit:bindings>    </rabbit:headers-exchange>    <!-- 消息路由  end -->         <!-- 監聽器  begin -->    <!-- 消息接收:DirectListener.java繼承MessageListener接口實現onMessage方法即可,concurrency表示并發處理的監聽數量 -->    <bean id="directListener" class="com.xiangshang.mq.listener.DirectListener" />    <rabbit:listener-container connection-factory="connectionFactory" message-converter="gsonConverter" concurrency="1" acknowledge="manual">        <rabbit:listener queues="${rmq.queue.xiangshang.test},${rmq.queue.undurable.xiangshang.test}" ref="directListener" />    </rabbit:listener-container>    <!-- 監聽器  end --></beans>

客戶端發送(DirectQueueTest.java示例)

package com.xiangshang.mq.test;import java.util.Random;import org.springframework.amqp.core.AmqpTemplate;import org.springframework.amqp.core.Message;import org.springframework.amqp.core.MessageDeliveryMode;import org.springframework.amqp.core.MessageProperties;import org.springframework.beans.BeansException;import org.springframework.context.ConfigurableapplicationContext;import org.springframework.context.support.ClassPathXmlApplicationContext;public class DirectQueueTest {    private static String RMQ_QUEUE_XIANGSHANG_TEST;    private static String RMQ_QUEUE_UNDURABLE_XIANGSHANG_TEST;    private static String RMQ_QUEUE_PRIORITY_XIANGSHANG_TEST;    private static String RMQ_QUEUE_DELAY_XIANGSHANG_TEST;         private static String RMQ_EXCHANGE_DIRECT_XIANGSHANG_TEST;    private static String RMQ_EXCHANGE_FANOUT_XIANGSHANG_TEST;    private static String RMQ_EXCHANGE_HEADERS_XIANGSHANG_TEST;         private static ConfigurableApplicationContext context = null;    private static AmqpTemplate rabbitTemplate = null;         static {        RMQ_QUEUE_XIANGSHANG_TEST = "queue.xiangshang.test";        RMQ_QUEUE_UNDURABLE_XIANGSHANG_TEST = "queue.undurable.xiangshang.test";        RMQ_QUEUE_PRIORITY_XIANGSHANG_TEST = "queue.priority.xiangshang.test";        RMQ_QUEUE_DELAY_XIANGSHANG_TEST = "queue.delay.xiangshang.test";                 RMQ_EXCHANGE_DIRECT_XIANGSHANG_TEST = "exchange.direct.xiangshang.test";        RMQ_EXCHANGE_FANOUT_XIANGSHANG_TEST = "exchange.fanout.xiangshang.test";        RMQ_EXCHANGE_HEADERS_XIANGSHANG_TEST = "exchange.headers.xiangshang.test";                 try {            context = new ClassPathXmlApplicationContext("rabbitConfiguration.xml");        catch (BeansException e) {            e.printStackTrace();        }        rabbitTemplate = context.getBean("rabbitTemplate", AmqpTemplate.class);    }         public static void main(String[] args) {        demo1();    }         /**     * 對隊列發送消息     */    public static void demo1() {        String sendMsg = "隊列消息." + String.valueOf(new Random().nextDouble());                 /*         * 默認路由已配置為exchange.direct.xiangshang.test         * 發送普通消息:rabbit服務重啟后,數據丟失         */        MessageProperties mp1 = new MessageProperties();        mp1.setDeliveryMode(MessageDeliveryMode.NON_PERSISTENT);        Message msg1 = new Message(sendMsg.getBytes(), mp1);        rabbitTemplate.convertAndSend(RMQ_QUEUE_XIANGSHANG_TEST, msg1);        rabbitTemplate.convertAndSend(RMQ_EXCHANGE_DIRECT_XIANGSHANG_TEST, RMQ_QUEUE_XIANGSHANG_TEST, msg1);// 效果同上        rabbitTemplate.convertAndSend(RMQ_QUEUE_UNDURABLE_XIANGSHANG_TEST, msg1);                 /*         *  發送持久化消息:rabbit服務重啟后,持久化隊列數據可恢復(默認情況是持久化的)         */        rabbitTemplate.convertAndSend(RMQ_QUEUE_XIANGSHANG_TEST, sendMsg);        rabbitTemplate.convertAndSend(RMQ_QUEUE_UNDURABLE_XIANGSHANG_TEST, sendMsg);    }         /**     * 發送廣播:此時廣播下所有隊列均可接收到數據     */    public static void demo2() {        String sendMsg = "廣播消息." + String.valueOf(new Random().nextDouble());        rabbitTemplate.convertAndSend(RMQ_EXCHANGE_FANOUT_XIANGSHANG_TEST, RMQ_QUEUE_UNDURABLE_XIANGSHANG_TEST, sendMsg);    }         /**     * 優先級隊列     */    public static void demo3() {        for (int i = 0; i < 10; i++) {            int priority = new Random().nextInt(10);            String sendMsg = "隊列消息." + String.valueOf(new Random().nextDouble()) + "[" + priority + "]";            System.out.println(sendMsg);            MessageProperties mp = new MessageProperties();            mp.setPriority(priority);            Message msg = new Message(sendMsg.getBytes(), mp);            rabbitTemplate.convertAndSend(RMQ_QUEUE_PRIORITY_XIANGSHANG_TEST, msg);        }    }         /**     * 延遲消息隊列     * 1.當前rabbitMQ沒有自動排序的隊列,它所支持的隊列是無序的     * 2.隊列遵守先進先出,因此它執行的順序是確認第一條數據過期時間為基準,如果第二條過期時間在第一條之前,第二條不會在第一條之前執行     *   eg:隊列數據過期時間依次為 30s后、10秒后、20秒后,此時必須等到30秒后隊列才出數據     * 3.因此,延遲消息功能需要規范以下幾點:     *   3.1 每個延遲業務申明獨有的路由、隊列,并標注業務使用說明     *   3.2 延遲隊列最好設置消息的最大過期時間,到期后要轉發的路由和隊列     *   3.3 header采用全部匹配,路由中需匹配與生產端header相同     */    public static void demo4() {        for (int i = 0; i < 3; i++) {            int delay = (i + 1) * 2 1000;            String sendMsg = "隊列消息." + String.valueOf(new Random().nextDouble()) + "[" + delay + "]";            System.out.println(sendMsg);                         MessageProperties mp = new MessageProperties();            mp.setExpiration(String.valueOf(delay));// 設置消息過期時間                         mp.setHeader("operator""xsjf");            mp.setHeader("sex""male");                         Message msg = new Message(sendMsg.getBytes(), mp);            rabbitTemplate.convertAndSend(RMQ_EXCHANGE_HEADERS_XIANGSHANG_TEST, "", msg);        }    }}

消息監聽(DirectListener.java示例)

package com.xiangshang.mq.listener;import org.springframework.amqp.core.Message;import org.springframework.amqp.rabbit.core.ChannelAwareMessageListener;import com.rabbitmq.client.Channel; public class DirectListener implements ChannelAwareMessageListener {    /* (non-Javadoc)     * @see org.springframework.amqp.core.MessageListener#onMessage(org.springframework.amqp.core.Message)     */    @Override    public void onMessage(Message message, Channel channel) throws Exception {        System.out.println("DirectListener 獲取的消息內容:" new String(message.getBody()));        channel.basicAck(message.getMessageProperties().getDeliveryTag(), false);// 返回成功ack        // channel.basicNack(message.getMessageProperties().getDeliveryTag(), false, true);// 返回失敗ack,并且數據重新入隊        Thread.currentThread().sleep(1000);    }}

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产99在线|中文| 亚洲精品影视在线观看| 成人写真视频福利网| 亚洲第一级黄色片| 久久夜色精品国产亚洲aⅴ| 97久久精品人搡人人玩| 欧美日韩加勒比精品一区| 亚洲一区亚洲二区| 亚洲成色777777女色窝| 日韩电影免费在线观看| 欧美日韩一区二区精品| 日韩69视频在线观看| 欧美天天综合色影久久精品| 日本一欧美一欧美一亚洲视频| 中文字幕在线成人| 日韩电影网在线| 66m—66摸成人免费视频| 日韩精品亚洲视频| 精品国产乱码久久久久酒店| 久久久视频精品| 日韩在线观看网站| 精品国产91乱高清在线观看| 亚洲免费视频在线观看| 日韩高清中文字幕| 国产午夜精品一区二区三区| 欧美激情中文字幕乱码免费| 午夜精品一区二区三区在线| 不卡av在线网站| 韩国福利视频一区| 国产精品私拍pans大尺度在线| 91国内在线视频| 久久国产精品免费视频| 伊人亚洲福利一区二区三区| 国产精品嫩草视频| 性色av一区二区三区| 色视频www在线播放国产成人| 日韩在线免费av| 亚洲aⅴ日韩av电影在线观看| 欧美一级大片在线免费观看| 精品久久久久久电影| 亚洲美女免费精品视频在线观看| 91手机视频在线观看| 日韩在线视频观看正片免费网站| 亚洲毛片一区二区| 91精品国产91久久久久| 亚洲午夜性刺激影院| 精品日韩美女的视频高清| 精品久久香蕉国产线看观看亚洲| 午夜精品视频在线| 91情侣偷在线精品国产| 亚洲色图18p| 亚洲午夜女主播在线直播| 亚洲电影免费观看高清| 欧美成人午夜激情视频| 91在线免费观看网站| 在线成人免费网站| 精品久久久久久久久久| 亚洲肉体裸体xxxx137| 日韩禁在线播放| 国产精品久久久久久久久久久久久| 欧美激情综合亚洲一二区| 性欧美办公室18xxxxhd| 久热精品视频在线观看一区| 色婷婷综合成人av| 久久久视频免费观看| 日韩中文字幕国产| 国产精品福利久久久| 亚洲精品视频久久| 中文字幕日本欧美| 国产精品丝袜视频| 日韩午夜在线视频| 亚洲中国色老太| 自拍亚洲一区欧美另类| 久久精品国产一区二区三区| 亚洲精品永久免费精品| 国产手机视频精品| 精品一区二区电影| 国产精品久久久久久久久久久久| 国产亚洲美女精品久久久| 成人淫片在线看| 久久九九热免费视频| 欧美亚洲一区在线| 亚洲欧美日韩视频一区| 欧美大奶子在线| 成人国产在线激情| 九色精品免费永久在线| 久久久国产一区二区三区| 久久久久久国产精品美女| 久久久免费在线观看| 国产精品久久久久久av| 日韩中文字幕久久| 国产精品福利在线| 日韩在线观看网址| 国产精品久久久久久久9999| 最近2019年手机中文字幕| 亚洲国产精品专区久久| 欧美一级淫片丝袜脚交| 中文字幕亚洲一区在线观看| 亚洲欧美在线看| 不卡av在线网站| 欧美大片在线看| 91精品国产色综合久久不卡98| 亚洲国产精品va在线观看黑人| 这里只有精品久久| 国产成人精品在线观看| 91啪国产在线| 亚洲风情亚aⅴ在线发布| 国产精品爽爽ⅴa在线观看| 欧美中在线观看| 国产一区二区三区高清在线观看| 亚洲第一精品自拍| 欧美成人精品一区二区| 日本一欧美一欧美一亚洲视频| 亚洲级视频在线观看免费1级| 91高潮在线观看| 亚洲xxx大片| 久久影视免费观看| 日韩欧美在线播放| 国产精品午夜一区二区欲梦| 国产亚洲精品久久久久久牛牛| 欧美二区乱c黑人| 国产精品女人久久久久久| 日本高清视频一区| 国产一区二区三区在线观看视频| 国产亚洲欧美日韩一区二区| 欧美成人精品在线播放| 精品伊人久久97| 另类色图亚洲色图| 亚洲直播在线一区| 欧美激情第6页| 久久国产一区二区三区| 久久精品中文字幕一区| 欧美性猛交丰臀xxxxx网站| 精品一区二区三区四区在线| 91精品国产91久久久| 美女少妇精品视频| 国产69久久精品成人| 国产精品∨欧美精品v日韩精品| 亚洲精品国产精品国自产观看浪潮| 日韩av在线免费观看| 2024亚洲男人天堂| 精品国产鲁一鲁一区二区张丽| 九九热在线精品视频| 韩国19禁主播vip福利视频| 亚洲福利在线观看| 欧美精品在线第一页| 北条麻妃一区二区三区中文字幕| 国内免费精品永久在线视频| 国产免费成人av| 亚洲аv电影天堂网| 欧美日韩在线视频首页| 国外成人性视频| 午夜精品在线观看| 久久天天躁日日躁| 欧美日韩免费网站| 国产一区二区在线播放| 国产精品av在线播放| 亚洲香蕉成人av网站在线观看| 久久综合伊人77777尤物| 国产精品视频免费观看www| 4438全国亚洲精品在线观看视频| 国产成人精品在线视频| 日韩激情片免费| 精品电影在线观看|