隨筆 - 41  文章 - 7  trackbacks - 0
          <2016年7月>
          262728293012
          3456789
          10111213141516
          17181920212223
          24252627282930
          31123456

          常用鏈接

          留言簿

          隨筆分類

          隨筆檔案

          搜索

          •  

          最新評(píng)論

          閱讀排行榜

          評(píng)論排行榜

               摘要: serverStatus.pdf原文:https://docs.mongodb.com/v3.0/reference/command/serverStatus/定義serverStatusserverStatus命令用于返回?cái)?shù)據(jù)庫進(jìn)程狀態(tài)的概述文檔. 大部分監(jiān)控程序都會(huì)定期運(yùn)行此命令來收集實(shí)例相關(guān)的統(tǒng)計(jì)信息:{ serverStatus: 1 } 其值(即上面的1)不影響命令的操作。2.4版本中修...  閱讀全文
          posted @ 2017-06-26 21:08 胡小軍 閱讀(2564) | 評(píng)論 (0)編輯 收藏

          SQL標(biāo)準(zhǔn)定義了4類隔離級(jí)別,包括了一些具體規(guī)則,用來限定事務(wù)內(nèi)外的哪些改變是可見的,哪些是不可見的。低級(jí)別的隔離級(jí)一般支持更高的并發(fā)處理,并擁有更低的系統(tǒng)開銷。
          Read Uncommitted(讀取未提交內(nèi)容)

                 在該隔離級(jí)別,所有事務(wù)都可以看到其他未提交事務(wù)的執(zhí)行結(jié)果。本隔離級(jí)別很少用于實(shí)際應(yīng)用,因?yàn)樗男阅芤膊槐绕渌?jí)別好多少。讀取未提交的數(shù)據(jù),也被稱之為臟讀(Dirty Read)。
          Read Committed(讀取提交內(nèi)容)

                 這是大多數(shù)數(shù)據(jù)庫系統(tǒng)的默認(rèn)隔離級(jí)別(但不是MySQL默認(rèn)的)。它滿足了隔離的簡(jiǎn)單定義:一個(gè)事務(wù)只能看見已經(jīng)提交事務(wù)所做的改變。這種隔離級(jí)別 也支持所謂的不可重復(fù)讀(Nonrepeatable Read),因?yàn)橥皇聞?wù)的其他實(shí)例在該實(shí)例處理其間可能會(huì)有新的commit,所以同一select可能返回不同結(jié)果。
          Repeatable Read(可重讀)

                 這是MySQL的默認(rèn)事務(wù)隔離級(jí)別,它確保同一事務(wù)的多個(gè)實(shí)例在并發(fā)讀取數(shù)據(jù)時(shí),會(huì)看到同樣的數(shù)據(jù)行。不過理論上,這會(huì)導(dǎo)致另一個(gè)棘手的問題:幻讀 (Phantom Read)。簡(jiǎn)單的說,幻讀指當(dāng)用戶讀取某一范圍的數(shù)據(jù)行時(shí),另一個(gè)事務(wù)又在該范圍內(nèi)插入了新行,當(dāng)用戶再讀取該范圍的數(shù)據(jù)行時(shí),會(huì)發(fā)現(xiàn)有新的“幻影” 行。InnoDB和Falcon存儲(chǔ)引擎通過多版本并發(fā)控制(MVCC,Multiversion Concurrency Control)機(jī)制解決了該問題。

          Serializable(可串行化) 
                 這是最高的隔離級(jí)別,它通過強(qiáng)制事務(wù)排序,使之不可能相互沖突,從而解決幻讀問題。簡(jiǎn)言之,它是在每個(gè)讀的數(shù)據(jù)行上加上共享鎖。在這個(gè)級(jí)別,可能導(dǎo)致大量的超時(shí)現(xiàn)象和鎖競(jìng)爭(zhēng)。

                   這四種隔離級(jí)別采取不同的鎖類型來實(shí)現(xiàn),若讀取的是同一個(gè)數(shù)據(jù)的話,就容易發(fā)生問題。例如:

                   臟讀(Drity Read):某個(gè)事務(wù)已更新一份數(shù)據(jù),另一個(gè)事務(wù)在此時(shí)讀取了同一份數(shù)據(jù),由于某些原因,前一個(gè)RollBack了操作,則后一個(gè)事務(wù)所讀取的數(shù)據(jù)就會(huì)是不正確的。

                   不可重復(fù)讀(Non-repeatable read):在一個(gè)事務(wù)的兩次查詢之中數(shù)據(jù)不一致,這可能是兩次查詢過程中間插入了一個(gè)事務(wù)更新的原有的數(shù)據(jù)。

                   幻讀(Phantom Read):在一個(gè)事務(wù)的兩次查詢中數(shù)據(jù)筆數(shù)不一致,例如有一個(gè)事務(wù)查詢了幾列(Row)數(shù)據(jù),而另一個(gè)事務(wù)卻在此時(shí)插入了新的幾列數(shù)據(jù),先前的事務(wù)在接下來的查詢中,就會(huì)發(fā)現(xiàn)有幾列數(shù)據(jù)是它先前所沒有的。

                   在MySQL中,實(shí)現(xiàn)了這四種隔離級(jí)別,分別有可能產(chǎn)生問題如下所示:


          下面,將利用MySQL的客戶端程序,分別測(cè)試幾種隔離級(jí)別。測(cè)試數(shù)據(jù)庫為test,表為tx;表結(jié)構(gòu):

          id                              int

          num

                                        int

          兩個(gè)命令行客戶端分別為A,B;不斷改變A的隔離級(jí)別,在B端修改數(shù)據(jù)。

          (一)、將A的隔離級(jí)別設(shè)置為read uncommitted(未提交讀)

           在B未更新數(shù)據(jù)之前:

          客戶端A:

          B更新數(shù)據(jù):

          客戶端B:

          客戶端A:

                  經(jīng)過上面的實(shí)驗(yàn)可以得出結(jié)論,事務(wù)B更新了一條記錄,但是沒有提交,此時(shí)事務(wù)A可以查詢出未提交記錄。造成臟讀現(xiàn)象。未提交讀是最低的隔離級(jí)別。

          (二)、將客戶端A的事務(wù)隔離級(jí)別設(shè)置為read committed(已提交讀)

           在B未更新數(shù)據(jù)之前:

          客戶端A:

          B更新數(shù)據(jù):

          客戶端B:

          客戶端A:

                 經(jīng)過上面的實(shí)驗(yàn)可以得出結(jié)論,已提交讀隔離級(jí)別解決了臟讀的問題,但是出現(xiàn)了不可重復(fù)讀的問題,即事務(wù)A在兩次查詢的數(shù)據(jù)不一致,因?yàn)樵趦纱尾樵冎g事務(wù)B更新了一條數(shù)據(jù)。已提交讀只允許讀取已提交的記錄,但不要求可重復(fù)讀。

          (三)、將A的隔離級(jí)別設(shè)置為repeatable read(可重復(fù)讀)

           在B未更新數(shù)據(jù)之前:

          客戶端A:

          B更新數(shù)據(jù):

          客戶端B:

          客戶端A:

          B插入數(shù)據(jù):

          客戶端B:

          客戶端A:

                 由以上的實(shí)驗(yàn)可以得出結(jié)論,可重復(fù)讀隔離級(jí)別只允許讀取已提交記錄,而且在一個(gè)事務(wù)兩次讀取一個(gè)記錄期間,其他事務(wù)部的更新該記錄。但該事務(wù)不要求與其他事務(wù)可串行化。例如,當(dāng)一個(gè)事務(wù)可以找到由一個(gè)已提交事務(wù)更新的記錄,但是可能產(chǎn)生幻讀問題(注意是可能,因?yàn)閿?shù)據(jù)庫對(duì)隔離級(jí)別的實(shí)現(xiàn)有所差別)。像以上的實(shí)驗(yàn),就沒有出現(xiàn)數(shù)據(jù)幻讀的問題。

          (四)、將A的隔離級(jí)別設(shè)置為 可串行化 (Serializable)

          A端打開事務(wù),B端插入一條記錄

          事務(wù)A端:

          事務(wù)B端:

          因?yàn)榇藭r(shí)事務(wù)A的隔離級(jí)別設(shè)置為serializable,開始事務(wù)后,并沒有提交,所以事務(wù)B只能等待。

          事務(wù)A提交事務(wù):

          事務(wù)A端

          事務(wù)B端

                
           serializable完全鎖定字段,若一個(gè)事務(wù)來查詢同一份數(shù)據(jù)就必須等待,直到前一個(gè)事務(wù)完成并解除鎖定為止 。是完整的隔離級(jí)別,會(huì)鎖定對(duì)應(yīng)的數(shù)據(jù)表格,因而會(huì)有效率的問題。

           轉(zhuǎn)自:http://xm-king.iteye.com/blog/770721
          posted @ 2016-09-24 00:06 胡小軍 閱讀(248) | 評(píng)論 (0)編輯 收藏

          一、rsync的概述

          rsync是類unix系統(tǒng)下的數(shù)據(jù)鏡像備份工具,從軟件的命名上就可以看出來了——remote sync。rsync是Linux系統(tǒng)下的文件同步和數(shù)據(jù)傳輸工具,它采用“rsync”算法,可以將一個(gè)客戶機(jī)和遠(yuǎn)程文件服務(wù)器之間的文件同步,也可以 在本地系統(tǒng)中將數(shù)據(jù)從一個(gè)分區(qū)備份到另一個(gè)分區(qū)上。如果rsync在備份過程中出現(xiàn)了數(shù)據(jù)傳輸中斷,恢復(fù)后可以繼續(xù)傳輸不一致的部分。rsync可以執(zhí)行 完整備份或增量備份。它的主要特點(diǎn)有:

          1.可以鏡像保存整個(gè)目錄樹和文件系統(tǒng);

          2.可以很容易做到保持原來文件的權(quán)限、時(shí)間、軟硬鏈接;無須特殊權(quán)限即可安裝;

          3.可以增量同步數(shù)據(jù),文件傳輸效率高,因而同步時(shí)間短;

          4.可以使用rcp、ssh等方式來傳輸文件,當(dāng)然也可以通過直接的socket連接;

          5.支持匿名傳輸,以方便進(jìn)行網(wǎng)站鏡象等;

          6.加密傳輸數(shù)據(jù),保證了數(shù)據(jù)的安全性;

           

          二、鏡像目錄與內(nèi)容

          rsync -av duying  /tmp/test

           

          查看/tmp/test目錄,我們可以看到此命令是把duying這個(gè)文件夾目錄連同內(nèi)容全部考到當(dāng)前目錄下了

           

          rsync  -av duying/ /tmp/test         注意:比上一條命令多了符號(hào)“/” 

           

          再次查看/tmp/test目錄,我們發(fā)現(xiàn)沒有duying這個(gè)目錄,只是看到了目錄中的內(nèi)容

           

          三、增量備份本地文件

          rsync -avzrtopgL  --progress /src /dst


          -v是“--verbose”,即詳細(xì)模式輸出; -z表示“--compress”,即傳輸時(shí)對(duì)數(shù)據(jù)進(jìn)行壓縮處理;

          -r表示“--recursive”,即對(duì)子目錄以遞歸的模式處理;-t是“--time”,即保持文件時(shí)間信息;

          -o表示“owner”,用來保持文件屬主信息;-p是“perms”,用來保持文件權(quán)限;

          -g是“group”,用來保持文件的屬組信息;

          --progress用于顯示數(shù)據(jù)鏡像同步的過程;

           

          四、鏡像同步備份文件

          rsync -avzrtopg --progress --delete /src  /dst


          --delete選項(xiàng)指定以rsync服務(wù)器端為基礎(chǔ)進(jìn)行數(shù)據(jù)鏡像同步,也就是要保持rsync服務(wù)器端目錄與客戶端目錄的完全一致;

          --exclude選項(xiàng)用于排除不需要傳輸?shù)奈募愋停?/p>

           

          五、設(shè)置定時(shí)備份策略

          crontab -e

          30 3 * * * rsync -avzrtopg  --progress  --delete  --exclude "*access*"

          --exclude "*debug*"  /src /dst

           

          如果文件比較大,可使用nohup將進(jìn)程放到后臺(tái)執(zhí)行。

          nohup rsync -avzrtopgL  --progress /data/opt /data2/  >/var/log/$(date +%Y%m%d).mail.log & 

           

          六、rsync的優(yōu)點(diǎn)與不足

          與傳統(tǒng)的cp、tar備份方式對(duì)比,rsync具有安全性高、備份迅速、支持增量備份等優(yōu)點(diǎn),通過rsync可以解決對(duì)實(shí)時(shí)性要求不高的數(shù)據(jù)備份需求,例如,定期地備份文件服務(wù)器數(shù)據(jù)到遠(yuǎn)端服務(wù)器,對(duì)本地磁盤定期進(jìn)行數(shù)據(jù)鏡像等。

          但是隨著系統(tǒng)規(guī)模的不斷擴(kuò)大,rsync的缺點(diǎn)逐漸被暴露了出來。首先,rsync做數(shù)據(jù)同步時(shí),需要掃描所有文件后進(jìn)行對(duì)比,然后進(jìn)行差量傳輸。如果文 件很大,掃面文件是非常耗時(shí)的,而且發(fā)生變化的文件往往是很少一部分,因此rsync是非常低效的方式。其次,rsync不能實(shí)時(shí)監(jiān)測(cè)、同步數(shù)據(jù),雖然它 可以通過Linux守護(hù)進(jìn)程的方式觸發(fā)同步,但是兩次觸發(fā)動(dòng)作一定會(huì)有時(shí)間差,可能導(dǎo)致服務(wù)器端和客戶端數(shù)據(jù)出現(xiàn)不一致。


          轉(zhuǎn)自:http://blog.sina.com.cn/s/blog_6954b9a901011esn.html

          posted @ 2016-09-23 22:01 胡小軍 閱讀(254) | 評(píng)論 (0)編輯 收藏

               Linux下如何查看版本信息, 包括位數(shù)、版本信息以及CPU內(nèi)核信息、CPU具體型號(hào)等等,整個(gè)CPU信息一目了然。

           
            1、# uname -a   (Linux查看版本當(dāng)前操作系統(tǒng)內(nèi)核信息)
           
            Linux localhost.localdomain 2.4.20-8 #1 Thu Mar 13 17:54:28 EST 2003 i686 athlon i386 GNU/Linux
           
            2、# cat /proc/version (Linux查看當(dāng)前操作系統(tǒng)版本信息)
           
                Linux version 2.4.20-8 (bhcompile@porky.devel.redhat.com)
                (gcc version 3.2.2 20030222 (Red Hat Linux 3.2.2-5)) #1 Thu Mar 13 17:54:28 EST 2003
           
            3、# cat /etc/issue  或cat /etc/redhat-release(Linux查看版本當(dāng)前操作系統(tǒng)發(fā)行版信息)
           
            Red Hat Linux release 9 (Shrike)
            4、# cat /proc/cpuinfo (Linux查看cpu相關(guān)信息,包括型號(hào)、主頻、內(nèi)核信息等)
           
            processor        : 0
               vendor_id         : AuthenticAMD
            cpu family        : 15
            model             : 1
            model name      : AMD A4-3300M APU with Radeon(tm) HD Graphics
            stepping         : 0
            cpu MHz          : 1896.236
            cache size       : 1024 KB
            fdiv_bug         : no
            hlt_bug          : no
            f00f_bug        : no
            coma_bug      : no
            fpu                : yes
            fpu_exception   : yes
            cpuid level      : 6
            wp                : yes
            flags             : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr
                                     sse sse2 syscall mmxext lm 3dnowext 3dnow
            bogomips      : 3774.87
           
            5、# getconf LONG_BIT  (Linux查看版本說明當(dāng)前CPU運(yùn)行在32bit模式下, 但不代表CPU不支持64bit)
           
            32
           
            6、# lsb_release -a

                以上文章轉(zhuǎn)載自:http://www.cnblogs.com/lanxuezaipiao/archive/2012/10/22/2732857.html
          posted @ 2016-09-23 21:58 胡小軍 閱讀(242) | 評(píng)論 (0)編輯 收藏
               摘要: 原文:http://shiro.apache.org/reference.htmlApache Shiro介紹Apache Shiro是什么?Apache Shiro 是一個(gè)可干凈處理認(rèn)證,授權(quán),企業(yè)會(huì)話管理以及加密的強(qiáng)大且靈活的開源安全框架.Apache Shiro的首要目標(biāo)是易于使用和理解. 安全可以是非常復(fù)雜的,有時(shí)甚至是痛苦的,但它不是. 框架應(yīng)該隱藏復(fù)雜的地方,暴露干凈而方便的API,以...  閱讀全文
          posted @ 2016-08-18 17:32 胡小軍 閱讀(2506) | 評(píng)論 (0)編輯 收藏
          1. 在項(xiàng)目上右鍵進(jìn)入Properties,選擇Deployment Assembly,再點(diǎn)擊Add...,如下圖所示:

            2.然后在彈出的窗口中,選擇
            Java Build Path Entries,點(diǎn)擊Next,如下圖所示:



            3.選擇你要你引入的UserLibrary,點(diǎn)擊Finish即可

            注意:如果在Java Web Project引入了其它Java Project,默認(rèn)引用的Java Project的編譯后字節(jié)碼是不會(huì)部署到WEB-INF/class下的,此時(shí)需要使用上面的Project進(jìn)行導(dǎo)出.
          posted @ 2016-08-17 12:53 胡小軍 閱讀(2343) | 評(píng)論 (0)編輯 收藏

          原文:http://hg.rabbitmq.com/rabbitmq-management/raw-file/3646dee55e02/priv/www-api/help.html

          介紹

          除了幫助頁面,所有URIs只會(huì)服務(wù)application/json類型的資源,并且需要HTTP基礎(chǔ)認(rèn)證(使用標(biāo)準(zhǔn)RabbitMQ用戶數(shù)據(jù)庫). 默認(rèn)用戶是guest/guest.

          大多數(shù)URIs需要虛擬主機(jī)名稱作為其路徑的一部分, 因?yàn)槊Q是虛擬主機(jī)的唯一標(biāo)識(shí)符對(duì)象. 默認(rèn)虛擬主機(jī)稱為"/", 它需要編碼為"%2f".

          PUT一個(gè)資源會(huì)對(duì)其進(jìn)行創(chuàng)建. 你上傳的JSON對(duì)象必須有某個(gè)鍵keys (下面文檔有描述),其它的鍵會(huì)被忽略. 缺失鍵會(huì)引發(fā)錯(cuò)誤.

          在AMQP中,由于綁定沒有名稱或IDs,因此我們基于其所有屬性人工合成了一個(gè). 

          由于一般情況下很難預(yù)測(cè)這個(gè)名字, 你可以通過POST一個(gè)工廠URI來創(chuàng)建綁定.查看下面的例子.

          注意事項(xiàng)

          這些注意事項(xiàng)適用于當(dāng)前管理AP的開發(fā)版本。在未來,他們將是固定的。
          • arguments 字段會(huì)被忽略.你不創(chuàng)建一個(gè)隊(duì)列,交換器或使用參數(shù)進(jìn)行綁定. 帶有參數(shù)的隊(duì)列,交換器或綁定也不會(huì)顯示這些參數(shù).
          • 權(quán)限偶爾才需要強(qiáng)制執(zhí)行.如果一個(gè)用戶能用HTTP API進(jìn)行認(rèn)證,那么它們可以做任何事情.
          • 從GET請(qǐng)求中返回的對(duì)象中包含許多與監(jiān)控相關(guān)的信息. 它們是無證實(shí)的,并且將來可能要發(fā)生變化.

          示例

          下面有幾個(gè)快速例子,它們使用了Unix命令行工具curl:

          • 獲取虛擬主機(jī)列表:
            $ curl -i -u guest:guest http://localhost:55672/api/vhosts 
            HTTP/1.1 200 OK
            Server: MochiWeb/1.1 WebMachine/1.7 (participate in the frantic)
            Date: Tue, 31 Aug 2010 15:46:59 GMT
            Content-Type: application/json
            Content-Length: 5
            ["/"]
          • 創(chuàng)建一個(gè)新虛擬主機(jī):
            $ curl -i -u guest:guest -H "content-type:application/json" \   -XPUT http://localhost:55672/api/vhosts/foo 
            HTTP/1.1 204 No Content
            Server: MochiWeb/1.1 WebMachine/1.7 (participate in the frantic)
            Date: Fri, 27 Aug 2010 16:56:00 GMT
            Content-Type: application/json
            Content-Length: 0

            注意: 你必須將mime類型指定為application/json.

            Note: 在上傳的JSON對(duì)象中,對(duì)象名稱是不需要的,因?yàn)樗呀?jīng)包含在了URI中. 由于一個(gè)虛擬主機(jī)除了名稱外沒有其它屬性,這意味著你完全不需要指定一個(gè)body.

          • 在默認(rèn)虛擬主機(jī)中創(chuàng)建一個(gè)新的交換器:
            $ curl -i -u guest:guest -H "content-type:application/json" \   -XPUT -d'{"type":"direct","auto_delete":false,"durable":true,"arguments":[]}' \   http://localhost:55672/api/exchanges/%2f/my-new-exchange 
            HTTP/1.1 204 No Content
            Server: MochiWeb/1.1 WebMachine/1.7 (participate in the frantic)
            Date: Fri, 27 Aug 2010 17:04:29 GMT
            Content-Type: application/json
            Content-Length: 0

            注意: 在PUT或DELETE的響應(yīng)中, 除非失敗了,否則我們絕不會(huì)返回一個(gè)body.

          • 再刪除它:
            $ curl -i -u guest:guest -H "content-type:application/json" \   -XDELETE http://localhost:55672/api/exchanges/%2f/my-new-exchange 
            HTTP/1.1 204 No Content
            Server: MochiWeb/1.1 WebMachine/1.7 (participate in the frantic)
            Date: Fri, 27 Aug 2010 17:05:30 GMT
            Content-Type: application/json
            Content-Length: 0

          參考


          GETPUTDELETEPOSTPathDescription
          X


          /api/overview
          描述整個(gè)系統(tǒng)的各種隨機(jī)信息。
          X


          /api/connections所有打開連接的列表.
          X
          X
          /api/connections/name一個(gè)單獨(dú)的連接. DELETE它會(huì)導(dǎo)致連接關(guān)閉.
          X


          /api/channels所有打開通道的列表.
          X


          /api/channels/channel單個(gè)通道的詳情.
          X


          /api/exchanges所有交換器的列表.
          X


          /api/exchanges/vhost指定虛擬主機(jī)中所有交換器列表.
          XXX
          /api/exchanges/vhost/name一個(gè)單獨(dú)的交換器.要PUT一個(gè)交換器,你需要一些像下面這樣的body:
          {"type":"direct","auto_delete":false,"durable":true,"arguments":[]}
          X


          /api/exchanges/vhost/name/bindings指定交換器中的綁定列表.
          X


          /api/queues所有隊(duì)列的列表.
          X


          /api/queues/vhost指定虛擬主機(jī)中所有隊(duì)列列表.
          XXX
          /api/queues/vhost/name一個(gè)單獨(dú)隊(duì)列.要PUT一個(gè)隊(duì)列, 你需要一些像下面這樣的body:
          {"auto_delete":false,"durable":true,"arguments":[]}
          X


          /api/queues/vhost/queue/bindings指定隊(duì)列中的所有綁定列表.
          X


          /api/bindings所有綁定列表.
          X


          /api/bindings/vhost指定虛擬主機(jī)上的所有綁定列表.
          X

          X/api/bindings/vhost/queue/exchange隊(duì)列和交換器之間的所有綁定列表. 記住,隊(duì)列和交換器可以綁定多次!要?jiǎng)?chuàng)建一個(gè)新綁定, POST 這個(gè)URI.你需要一些像下面這樣的body:
          {"routing_key":"my_routing_key","arguments":[]}
          響應(yīng)會(huì)包含一個(gè)Location header,它會(huì)告訴你新綁定的URI.
          XXX
          /api/bindings/vhost/queue/exchange/props隊(duì)列和交換器之間的單個(gè)綁定. URI的props部分是一個(gè)名稱,用于由路由鍵和屬性組成的綁定.你可以通過PUT這個(gè)URI來創(chuàng)建一個(gè)綁定,它比上面POST URI更方便.
          X


          /api/vhosts所有虛擬主機(jī)列表.
          XXX
          /api/vhosts/name單個(gè)虛擬主機(jī).由于虛擬主機(jī)只有一個(gè)名稱,因此在PUT時(shí)不需要body.
          X


          /api/users所有用戶列表.
          XXX
          /api/users/name單個(gè)用戶. 要PUT一個(gè)用戶, 你需要一些像下面這樣的body:
          {"password":"secret"}
          X


          /api/users/user/permissions指定用戶的所有權(quán)限列表.
          X


          /api/permissions所有用戶的所有權(quán)限列表.
          XXX
          /api/permissions/vhost/user一個(gè)虛擬主機(jī)中某個(gè)用戶的個(gè)人權(quán)限. 要PUT一個(gè)權(quán)限,你需要一些像下面這樣的body:
          {"scope":"client","configure":".*","write":".*","read":".*"}
          posted @ 2016-08-13 21:50 胡小軍 閱讀(7322) | 評(píng)論 (0)編輯 收藏
               摘要: 3.1.15 消息監(jiān)聽器容器配置有相當(dāng)多的配置SimpleMessageListenerContainer 相關(guān)事務(wù)和服務(wù)質(zhì)量的選項(xiàng),它們之間可以互相交互.當(dāng)使用命名空間來配置<rabbit:listener-container/>時(shí),下表顯示了容器屬性名稱和它們等價(jià)的屬性名稱(在括號(hào)中).未被命名空間暴露的屬性,以`N/A`表示.Table 3.3. 消...  閱讀全文
          posted @ 2016-08-13 16:24 胡小軍 閱讀(6561) | 評(píng)論 (0)編輯 收藏
               摘要: 3.1.10 配置broker介紹AMQP 規(guī)范描述了協(xié)議是如何用于broker中隊(duì)列,交換器以及綁定上的.這些操作是從0.8規(guī)范中移植的,更高的存在于org.springframework.amqp.core包中的AmqpAdmin 接口中. 那個(gè)接口的RabbitMQ 實(shí)現(xiàn)是RabbitAdmin,它位于org.springframework.amqp.rabbit.core 包.A...  閱讀全文
          posted @ 2016-08-13 16:07 胡小軍 閱讀(4972) | 評(píng)論 (0)編輯 收藏
               摘要: 3.1.9 Request/Reply 消息介紹AmqpTemplate 也提供了各種各樣的sendAndReceive 方法,它們接受同樣的參數(shù)選項(xiàng)(exchange, routingKey, and Message)來執(zhí)行單向發(fā)送操作. 這些方法對(duì)于request/reply 場(chǎng)景也是有用的,因?yàn)樗鼈冊(cè)诎l(fā)送前處理了必要的"reply-to"屬性配置,并能通過它在專...  閱讀全文
          posted @ 2016-08-13 15:59 胡小軍 閱讀(6663) | 評(píng)論 (0)編輯 收藏
               摘要: Consumer Tags從1.4.5版本開始,你可以提供一種策略來生成consumer tags.默認(rèn)情況下,consumer tag是由broker來生成的.public interface ConsumerTagStrategy { String createConsumerTag(String queue); }該隊(duì)列是可用的,所以它可以(可選)在tag中使用。參考Sectio...  閱讀全文
          posted @ 2016-08-13 12:48 胡小軍 閱讀(13052) | 評(píng)論 (0)編輯 收藏
               摘要: Queue Affinity 和 LocalizedQueueConnectionFactory當(dāng)在集群中使用HA隊(duì)列時(shí),為了獲取最佳性能,可以希望連接到主隊(duì)列所在的物理broker. 雖然CachingConnectionFactory 可以配置為使用多個(gè)broker 地址; 這會(huì)失敗的,client會(huì)嘗試按順序來連接. LocalizedQueueConnectionFac...  閱讀全文
          posted @ 2016-08-13 12:38 胡小軍 閱讀(6257) | 評(píng)論 (0)編輯 收藏
               摘要: 3. 參考這部分參考文檔詳細(xì)描述了組成Sring AMQP的各種組件. main chapter 涵蓋了開發(fā)AMQP應(yīng)用程序的核心類. 這部分也包含了有關(guān)示例程序的章節(jié).3.1 使用 Spring AMQP在本章中,我們將探索接口和類,它們是使用Spring AMQP來開發(fā)應(yīng)用程序的必要組件 .3.1.1 AMQP 抽象介紹Spring ...  閱讀全文
          posted @ 2016-08-13 12:21 胡小軍 閱讀(6597) | 評(píng)論 (0)編輯 收藏
               摘要: 原文:http://docs.spring.io/spring-amqp/docs/1.6.0.RELEASE/reference/html/1. 前言Spring AMQP項(xiàng)目將其核心Spring概念應(yīng)用于基于AMQP消息解決方案的開發(fā)中.我們提供了一個(gè)發(fā)送和接收消息的高級(jí)抽象模板.同時(shí),我們也提供了消息驅(qū)動(dòng)POJO的支持.這些包有助于AMQP資源的管理,從而提升依賴注入和聲明式配置的使用. 在...  閱讀全文
          posted @ 2016-08-13 12:03 胡小軍 閱讀(5919) | 評(píng)論 (0)編輯 收藏
               摘要: 1 概述1.1 本文檔的目標(biāo)此文檔定義了一個(gè)網(wǎng)絡(luò)協(xié)議-高級(jí)消息隊(duì)列協(xié)議(AMQP), 它使一致的客戶端程序可以與一致的消息中間件服務(wù)器進(jìn)行通信.我們面對(duì)的是這個(gè)領(lǐng)域有經(jīng)驗(yàn)的技術(shù)讀者,同時(shí)還提供了足夠的規(guī)范和指南.技術(shù)工程師可以根據(jù)這些文檔,在任何硬件平臺(tái)上使用各種編程語言來構(gòu)建遵從該協(xié)議的解決方案。1.2 摘要1.2.1 為什么使用AMQP?AMQP在一致性客戶端和消息中間件(也稱為"broker...  閱讀全文
          posted @ 2016-08-12 18:30 胡小軍 閱讀(10856) | 評(píng)論 (0)編輯 收藏
               摘要: 原文:http://docs.spring.io/spring/docs/current/spring-framework-reference/htmlsingle/#beans-java7.12.1 基本概念: @Bean 和 @Configuration在Spring新的Java配置支持中,其核心構(gòu)件是@Configuration注解類和@Bean注解方法.@Bean 注解用來表示方...  閱讀全文
          posted @ 2016-08-05 17:04 胡小軍 閱讀(2312) | 評(píng)論 (0)編輯 收藏
               摘要: RabbitMQ內(nèi)置支持TLS。自RabbitMQ 3.4.0起, 為防止 POODLE attack 攻擊,已經(jīng)自動(dòng)禁用了SSLv3.使用TLS時(shí),推薦安裝的Erlang/OTP版本為17.5或以上版本. R16版本在某些證書中可以工作,但存在major limitations.必須安裝Erlang加密程序,并且保證它能工作.對(duì)于那些從源碼進(jìn)行Erlang編譯的Windows...  閱讀全文
          posted @ 2016-08-02 22:25 胡小軍 閱讀(11921) | 評(píng)論 (0)編輯 收藏
               摘要: 原文:http://www.rabbitmq.com/configure.htmlRabbitMQ 提供了三種方式來定制服務(wù)器:環(huán)境變量定義端口,文件位置和名稱(接受shell輸入,或者在環(huán)境配置文件(rabbitmq-env.conf)中設(shè)置)配置文件為服務(wù)器組件設(shè)置權(quán)限,限制和集群,也可以定義插件設(shè)置.運(yùn)行時(shí)參數(shù)和策略可在運(yùn)行時(shí)進(jìn)行修改集群設(shè)置大部分設(shè)置都使用前面的兩種方法,但本指南會(huì)全部講解...  閱讀全文
          posted @ 2016-08-02 09:38 胡小軍 閱讀(49332) | 評(píng)論 (0)編輯 收藏

          名稱

          rabbitmqctl — 用于管理中間件的命令行工具

          語法

          rabbitmqctl [-n node] [-t timeout] [-q] {command} [command options...]

          描述

          RabbitMQ是AMQP的實(shí)現(xiàn), 后者是高性能企業(yè)消息通信的新興標(biāo)準(zhǔn). RabbitMQ server是AMQP 中間件健壯的,可擴(kuò)展的實(shí)現(xiàn).

          rabbitmqctl 用來管理RabbitMQ中間件的命令行工具.它通過連接中間件節(jié)點(diǎn)來執(zhí)行所有操作。

          如果中間件沒有運(yùn)行,將會(huì)顯示診斷信息, 不能到達(dá),或因不匹配Erlang cookie而拒絕連接.

          選項(xiàng)

          [-n node]

          默認(rèn)節(jié)點(diǎn)是"rabbit@server",此處的server是本地主機(jī). 在一個(gè)名為"server.example.com"的主機(jī)上, RabbitMQ Erlang node 的節(jié)點(diǎn)名稱通常是rabbit@server (除非RABBITMQ_NODENAME在啟動(dòng)時(shí)設(shè)置了非默認(rèn)值). hostname -s 的輸出通常是"@" 標(biāo)志后的東西.查看rabbitmq-server(1)來了解配置RabbitMQ broker的細(xì)節(jié).

          [-q]

          使用-q標(biāo)志來啟用寧靜(quiet)模式,這會(huì)一致消息輸出.

          [-t timeout]

          操作超時(shí)時(shí)間(秒為單位). 只適用于"list" 命令. 默認(rèn)是無窮大.

          命令

          應(yīng)用程序和集群管理

          stop [pid_file]

          用于停止運(yùn)行RabbitMQ的Erlang node.如果指定了pid_file,還將等待指定的過程結(jié)束。例如:

          rabbitmqctl stop

          此命令會(huì)終止RabbitMQ node的運(yùn)行.

          stop_app

          停止RabbitMQ application,但Erlang node會(huì)繼續(xù)運(yùn)行.此命令主要用于優(yōu)先執(zhí)行其它管理操作(這些管理操作需要先停止RabbitMQ application),如reset.例如:

          rabbitmqctl stop_app

          start_app

          啟動(dòng)RabbitMQ application.

          此命令典型用于在執(zhí)行了其它管理操作之后,重新啟動(dòng)停止的RabbitMQ application。如reset.例如:

          rabbitmqctl start_app

          此命令來指導(dǎo)RabbitMQ node來啟動(dòng)RabbitMQ application.

          wait {pid_file}

          等待RabbitMQ application啟動(dòng).此命令用來等待RabbitMQ application來啟動(dòng)node。它會(huì)等待創(chuàng)建pid文件,然后等待pid文件中的特定pid過程啟動(dòng),最后等待RabbitMQ  application 來啟動(dòng)node. 

          pid file是通過rabbitmq-server 腳本來創(chuàng)建的.默認(rèn)情況下,它存放于Mnesia目錄中. 修改RABBITMQ_PID_FILE 環(huán)境變量可以改變此位置。如:

          rabbitmqctl wait /var/run/rabbitmq/pid

          此命令會(huì)在RabbitMQ node啟動(dòng)后返回.

          reset

          將RabbitMQ node還原到最初狀態(tài).包括從所在群集中刪除此node,從管理數(shù)據(jù)庫中刪除所有配置數(shù)據(jù),如已配置的用戶和虛擬主機(jī),以及刪除所有持久化消息.

          執(zhí)行reset和force_reset之前,必須停止RabbitMQ application ,如使用stop_app.

          示例:

          rabbitmqctl reset

          此命令會(huì)重設(shè)RabbitMQ node.

          force_reset

          強(qiáng)制RabbitMQ node還原到最初狀態(tài).

          不同于reset , force_reset 命令會(huì)無條件地重設(shè)node,不論當(dāng)前管理數(shù)據(jù)庫的狀態(tài)和集群配置是什么. 它只能在數(shù)據(jù)庫或集群配置已損壞的情況下才可使用。

          執(zhí)行reset和force_reset之前,必須停止RabbitMQ application ,如使用stop_app.

          示例:

          rabbitmqctl force_reset

          此命令會(huì)重設(shè)RabbitMQnode.

          rotate_logs {suffix}

          指示RabbitMQ node循環(huán)日志文件.

          RabbitMQ 中間件會(huì)將原來日志文件中的內(nèi)容追加到原始名稱和后輟的日志文件中,然后再將原始日志文件內(nèi)容復(fù)制到新創(chuàng)建的日志上。實(shí)際上,當(dāng)前日志內(nèi)容會(huì)移到以此后輟結(jié)尾的文件上。當(dāng)目標(biāo)文件不存在時(shí),將會(huì)進(jìn)行創(chuàng)建。如果不指定后輟,則不會(huì)發(fā)生循環(huán),日志文件只是重新打開。示例:

          rabbitmqctl rotate_logs .1

          此命令指示RabbitMQ node將日志文件的內(nèi)容追加到新日志文件(文件名由原日志文件名和.1后輟構(gòu)成)中。如. rabbit@mymachine.log.1 和 rabbit@mymachine-sasl.log.1. 最后, 日志會(huì)在原始位置恢復(fù)到新文件中.

          集群管理

          join_cluster {clusternode} [--ram]

          clusternode

          加入集群的節(jié)點(diǎn).

          [--ram]

          如果進(jìn)行了設(shè)置,節(jié)點(diǎn)將以RAM節(jié)點(diǎn)身份加入集群.

          指導(dǎo)節(jié)點(diǎn)成為集群中的一員. 在加入集群之前,節(jié)點(diǎn)會(huì)重置,因此在使用此命令時(shí),必須小心. 這個(gè)命令要成功,RabbitMQ應(yīng)用程序必須先停止,如stop_app.

          集群節(jié)點(diǎn)可以是兩種類型: 磁盤節(jié)點(diǎn)(Disc Node) 或 內(nèi)存節(jié)點(diǎn)(RAM Node).磁盤節(jié)點(diǎn)會(huì)在RAM和磁盤中復(fù)制數(shù)據(jù), 通過冗余可以防止節(jié)點(diǎn)失效事件,并可從斷電這種全局事件中進(jìn)行恢復(fù). RAM節(jié)點(diǎn)只在RAM中復(fù)制數(shù)據(jù)(除了隊(duì)列的內(nèi)容外,還依賴于隊(duì)列是否是持久化的或者內(nèi)容對(duì)于內(nèi)存來說是否過大) ,并主要用于可伸縮性. RAM節(jié)點(diǎn)只有當(dāng)管理資源(如,增加/刪除隊(duì)列,交換機(jī),或綁定)的時(shí)候才具有更高的性能.一個(gè)集群必須至少有一個(gè)磁盤節(jié)點(diǎn),通常來說還不止一個(gè).

          默認(rèn)情況下,節(jié)點(diǎn)是磁盤節(jié)點(diǎn).如果你想要?jiǎng)?chuàng)建內(nèi)存節(jié)點(diǎn),需要提供--ram 標(biāo)志.

          在執(zhí)行cluster命令之后, 無論何時(shí),當(dāng)前節(jié)點(diǎn)上啟動(dòng)的RabbitMQ 應(yīng)用程序在節(jié)點(diǎn)宕機(jī)的情況下,會(huì)嘗試連接集群中的其它節(jié)點(diǎn)。

          要脫離集群, 必須重設(shè)(reset)節(jié)點(diǎn). 你也可以通過forget_cluster_node 命令來遠(yuǎn)程刪除節(jié)點(diǎn).

          更多詳情,參考集群指南.

          例如:

          rabbitmqctl join_cluster hare@elena --ram

          此命令用于指示RabbitMQ node以ram節(jié)點(diǎn)的形式將 hare@elena 加入集群.

          cluster_status

          按節(jié)點(diǎn)類型來分組展示集群中的所有節(jié)點(diǎn),包括當(dāng)前運(yùn)行的節(jié)點(diǎn).

          例如:

          rabbitmqctl cluster_status

          此命令會(huì)顯示集群中的所有節(jié)點(diǎn).

          change_cluster_node_type {disc | ram}

          修改集群節(jié)點(diǎn)的類型. 要成功執(zhí)行此操作,必須首先停止節(jié)點(diǎn),要將節(jié)點(diǎn)轉(zhuǎn)換為RAM節(jié)點(diǎn),則此節(jié)點(diǎn)不能是集群中的唯一disc節(jié)點(diǎn)。

          例如:

          rabbitmqctl change_cluster_node_type disc

          此命令會(huì)將一個(gè)RAM節(jié)點(diǎn)轉(zhuǎn)換為disc節(jié)點(diǎn).

          forget_cluster_node [--offline]

          [--offline]

          允許節(jié)點(diǎn)從脫機(jī)節(jié)點(diǎn)中刪除. 這只在所有節(jié)點(diǎn)都脫機(jī)且最后一個(gè)掉線節(jié)點(diǎn)不能再上線的情況下有用,從而防止整個(gè)集群從啟動(dòng)。它不能使用在其它情況下,因?yàn)檫@會(huì)導(dǎo)致不一致

          遠(yuǎn)程刪除一個(gè)集群節(jié)點(diǎn).要?jiǎng)h除的節(jié)點(diǎn)必須是脫機(jī)的, 而在刪除節(jié)點(diǎn)期間節(jié)點(diǎn)必須是在線的,除非使用了--offline 標(biāo)志.

          當(dāng)使用--offline 標(biāo)志時(shí),rabbitmqctl不會(huì)嘗試正常連接節(jié)點(diǎn);相反,它會(huì)臨時(shí)改變節(jié)點(diǎn)以作修改.如果節(jié)點(diǎn)不能正常啟動(dòng)的話,這是非常有用的.在這種情況下,節(jié)點(diǎn)將變成集群元數(shù)據(jù)的規(guī)范源(例如,隊(duì)列的存在),即使它不是以前的。因此,如果有可能,你應(yīng)該在最新的節(jié)點(diǎn)上使用這個(gè)命令來關(guān)閉。

          例如:

          rabbitmqctl -n hare@mcnulty forget_cluster_node rabbit@stringer

          此命令會(huì)從節(jié)點(diǎn)hare@mcnulty中刪除rabbit@stringer節(jié)點(diǎn).

          rename_cluster_node {oldnode1} {newnode1} [oldnode2] [newnode2 ...]

          支持在本地?cái)?shù)據(jù)庫中重命名集群節(jié)點(diǎn).

          此子命令會(huì)促使rabbitmqctl臨時(shí)改變節(jié)點(diǎn)以作出修改. 因此本地集群必須是停止的,其它節(jié)點(diǎn)可以是在線或離線的.

          這個(gè)子命令接偶數(shù)個(gè)參數(shù),成對(duì)表示節(jié)點(diǎn)的舊名稱和新名稱.你必須指定節(jié)點(diǎn)的舊名稱和新名稱,因?yàn)槠渌V沟墓?jié)點(diǎn)也可能在同一時(shí)間重命名.

          同時(shí)停止所有節(jié)點(diǎn)來重命名也是可以的(在這種情況下,每個(gè)節(jié)點(diǎn)都必須給出舊名稱和新名稱)或一次停止一個(gè)節(jié)點(diǎn)來重命名(在這種情況下,每個(gè)節(jié)點(diǎn)只需要被告知其名句是如何變化的).

          例如:

          rabbitmqctl rename_cluster_node rabbit@misshelpful rabbit@cordelia

          此命令來將節(jié)點(diǎn)名稱rabbit@misshelpful 重命名為rabbit@cordelia.

          update_cluster_nodes {clusternode}

          clusternode

          用于咨詢具有最新消息的節(jié)點(diǎn).

          指示已集群的節(jié)點(diǎn)醒來時(shí)聯(lián)系clusternode.這不同于join_cluster ,因?yàn)樗粫?huì)加入任何集群 - 它會(huì)檢查節(jié)點(diǎn)已經(jīng)以clusternode的形式存在于集群中了.

          需要這個(gè)命令的動(dòng)機(jī)是當(dāng)節(jié)點(diǎn)離線時(shí),集群可以變化.考慮這樣的情況,節(jié)點(diǎn)A和節(jié)點(diǎn)B都在集群里邊,這里節(jié)點(diǎn)A掉線了,C又和B集群了,然后B又離開了集群.當(dāng)A醒來的時(shí)候,它會(huì)嘗試聯(lián)系B,但這會(huì)失敗,因?yàn)椋乱呀?jīng)不在集群中了.update_cluster_nodes -n A C 可解決這種場(chǎng)景.

          force_boot

          確保節(jié)點(diǎn)將在下一次啟動(dòng),即使它不是最后一個(gè)關(guān)閉的。通常情況下,當(dāng)你關(guān)閉整個(gè)RabbitMQ 集群時(shí),你重啟的第一個(gè)節(jié)點(diǎn)應(yīng)該是最后一個(gè)下線的節(jié)點(diǎn),因?yàn)樗梢钥吹狡渌?jié)點(diǎn)所看不到的事情. 但有時(shí)這是不可能的:例如,如果整個(gè)集群是失去了電力而所有節(jié)點(diǎn)都在想它不是最后一個(gè)關(guān)閉的.

          在這種節(jié)點(diǎn)掉線情況下,你可以調(diào)用rabbitmqctl force_boot .這就告訴節(jié)點(diǎn)下一次無條件的啟動(dòng)節(jié)點(diǎn).在此節(jié)點(diǎn)關(guān)閉后,集群的任何變化,它都會(huì)丟失.

          如果最后一個(gè)掉線的節(jié)點(diǎn)永久丟失了,那么你需要優(yōu)先使用rabbitmqctl forget_cluster_node --offline因?yàn)樗梢源_保在丟失的節(jié)點(diǎn)上掌握的鏡像隊(duì)列得到提升。

          例如:

          rabbitmqctl force_boot

          這可以強(qiáng)制節(jié)點(diǎn)下次啟動(dòng)時(shí)不用等待其它節(jié)點(diǎn).

          sync_queue [-p vhost] {queue}

          queue
          同步隊(duì)列的名稱

          指示未同步slaves上的鏡像隊(duì)列自行同步.同步發(fā)生時(shí),隊(duì)列會(huì)阻塞(所有出入隊(duì)列的發(fā)布者和消費(fèi)者都會(huì)阻塞).此命令成功執(zhí)行后,隊(duì)列必須是鏡像的.

          注意,未同步隊(duì)列中的消息被耗盡后,最終也會(huì)變成同步. 此命令主要用于未耗盡的隊(duì)列。

          cancel_sync_queue [-p vhost] {queue}

          queue

          取消同步的隊(duì)列名稱.

          指示同步鏡像隊(duì)列停止同步.

          purge_queue [-p vhost] {queue}

          queue

          要清除隊(duì)列的名稱.

          清除隊(duì)列(刪除其中的所有消息).

          set_cluster_name {name}

          設(shè)置集群名稱. 集群名稱在client連接時(shí),會(huì)通報(bào)給client,也可用于federation和shovel插件記錄消息的來源地. 群集名稱默認(rèn)是來自在群集中的第一個(gè)節(jié)點(diǎn)的主機(jī)名,但可以改變。

          例如:

          rabbitmqctl set_cluster_name london

          設(shè)置集群名稱為"london".

          用戶管理

          注意rabbitmqctl 管理RabbitMQ 內(nèi)部用戶數(shù)據(jù)庫. 任何來自其它認(rèn)證后端的用戶對(duì)于rabbitmqctl來說是不可見的.

          add_user {username} {password}

          username

          要?jiǎng)?chuàng)建的用戶名稱.

          password

          設(shè)置創(chuàng)建用戶登錄broker的密碼.       

          rabbitmqctl add_user tonyg changeit

          此命令用于指示RabbitMQ broker 創(chuàng)建一個(gè)擁有非管理權(quán)限的用戶,其名稱為tonyg, 初始密碼為changeit.


          delete_user {username}

          username

          要?jiǎng)h除的用戶名稱.

          例如:

          rabbitmqctl delete_user tonyg

          此命令用于指示RabbitMQ broker刪除名為tonyg的用戶

          change_password {username} {newpassword}

          username

          要修改密碼的用戶名稱.

          newpassword

          用戶的新密碼.

          例如:

          rabbitmqctl change_password tonyg newpass

          此命令用于指定RabbitMQ broker將tonyg 用戶的密碼修改為newpass.

          clear_password {username}

          username

          要清除密碼的用戶名稱.

          例如:

          rabbitmqctl clear_password tonyg

          此命令會(huì)指示RabbitMQ broker清除名為tonyg的用戶密碼.現(xiàn)在,此用戶不能使用密碼登錄(但可以通過SASL EXTERNAL登錄,如果配置了的話).

          authenticate_user {username} {password}

          username

          用戶的名稱.

          password

          用戶的密碼.

          例如:

          rabbitmqctl authenticate_user tonyg verifyit

          此命令會(huì)指示RabbitMQ broker以名稱為tonyg, 密碼為verifyit來進(jìn)行驗(yàn)證.

          set_user_tags {username} {tag ...}

          username

          要設(shè)置tag的用戶名稱.

          tag

          用于設(shè)置0個(gè),1個(gè)或多個(gè)tags.任何現(xiàn)有的tags都將被刪除.

          例如:

          rabbitmqctl set_user_tags tonyg administrator

          此命令指示RabbitMQ broker用于確保tonyg 是administrator.當(dāng)通過AMQP來登錄時(shí),這沒有什么效果,但用戶通過其它的途經(jīng)來登錄時(shí),它可用來管理用戶,虛擬主機(jī)和權(quán)限(如使用管理插件).

          rabbitmqctl set_user_tags tonyg

          此命令會(huì)指示RabbitMQ broker刪除tonyg上的任何現(xiàn)有的tag.

          list_users

          列出用戶. 每個(gè)結(jié)果行都包含用戶名,其后緊跟用戶的tags.

          例如:

          rabbitmqctl list_users

          此命令指示RabbitMQ broker列出所有用戶.

          訪問控制

          注意rabbitmqctl 會(huì)管理RabbitMQ的內(nèi)部用戶數(shù)據(jù)庫. 無權(quán)限的用戶將不能使用rabbitmqctl.

          add_vhost {vhost}

          vhost

          要?jiǎng)?chuàng)建虛擬主機(jī)名稱.

          創(chuàng)建一個(gè)虛擬主機(jī).

          例如:

          rabbitmqctl add_vhost test

          此命令指示RabbitMQ broker來創(chuàng)建一個(gè)新的名為test的虛擬主機(jī).

          delete_vhost {vhost}

          vhost

          要?jiǎng)h除的虛擬主機(jī)的名稱.

          刪除一個(gè)虛擬主機(jī).

          刪除一個(gè)虛擬主機(jī),同時(shí)也會(huì)刪除所有交換機(jī),隊(duì)列,綁定,用戶權(quán)限,參數(shù)和策略.

          例如:

          rabbitmqctl delete_vhost test

          此命令指示RabbitMQ broker刪除名為test的虛擬主機(jī).

          list_vhosts [vhostinfoitem ...]

          列出所有虛擬主機(jī).

          vhostinfoitem 參數(shù)用于標(biāo)識(shí)哪些虛擬主機(jī)應(yīng)該包含在結(jié)果集中.結(jié)果集中的列順序會(huì)匹配參數(shù)的順序.vhostinfoitem 可接受下面的值:

          name

          虛擬主機(jī)的名稱.

          tracing

          是否對(duì)虛擬主機(jī)啟用追蹤.

          如果沒有指定vhostinfoitem 參數(shù),那么會(huì)顯示虛擬主機(jī)名稱.

          例如:

          rabbitmqctl list_vhosts name tracing

          此命令用于指示RabbitMQ broker顯示所有虛擬主機(jī).

          set_permissions [-p vhost] {user} {conf} {write} {read}

          vhost

          授予用戶可訪問的虛擬機(jī)名稱,默認(rèn)是/.

          user

          可訪問指定虛擬主機(jī)的用戶名稱.

          conf

          一個(gè)用于匹配用戶在哪些資源名稱上擁有配置權(quán)限的正則表達(dá)式

          write

          一個(gè)用于匹配用戶在哪些資源名稱上擁有寫權(quán)限的正則表達(dá)式.

          read

          一個(gè)用于匹配用戶在哪些資源名稱上擁有讀權(quán)限的正則表達(dá)式.

          設(shè)置用戶權(quán)限.

          例如:

          rabbitmqctl set_permissions -p /myvhost tonyg "^tonyg-.*" ".*" ".*"

          此命令表示RabbitMQ broker授予tonyg 用戶可訪問 /myvhost虛擬主機(jī),并在資源名稱以"tonyg-"開頭的所有資源上都具有配置權(quán)限,并在所有資源上都擁有讀寫權(quán)限。

          clear_permissions [-p vhost] {username}

          vhost

          用于設(shè)置禁止用戶訪問的虛擬主機(jī)名稱,默認(rèn)為/.

          username

          禁止訪問特定虛擬主機(jī)的用戶名稱.

          設(shè)置用戶權(quán)限.

          例如:

          rabbitmqctl clear_permissions -p /myvhost tonyg

          此命令用于指示RabbitMQ broker禁止tonyg 用戶訪問/myvhost虛擬主機(jī).

          list_permissions [-p vhost]

          vhost

          用于指定虛擬主機(jī)名稱,將會(huì)列出所有可訪問此虛擬主機(jī)的所有用戶名稱和權(quán)限.默認(rèn)為/.

          顯示虛擬機(jī)上權(quán)限.

          例如:

          rabbitmqctl list_permissions -p /myvhost

          此命令指示RabbitMQ broker列出所有已授權(quán)訪問/myvhost 虛擬主機(jī)的用戶,同時(shí)也會(huì)列出這些用戶能在虛擬主機(jī)資源可操作的權(quán)限.注意,空字符串表示沒有任何授予的權(quán)限。

          list_user_permissions {username}

          username

          要顯示權(quán)限的用戶名稱.

          列出用戶權(quán)限.

          例如:

          rabbitmqctl list_user_permissions tonyg

          此命令指示RabbitMQ broker列出tonyg可授權(quán)訪問的所有虛擬主機(jī)名稱,以及在這些虛擬主機(jī)上的操作.

          參數(shù)管理

          RabbitMQ的某些特性(如聯(lián)合插件)是動(dòng)態(tài)控制的. 每個(gè)參數(shù)都是與特定虛擬主機(jī)相關(guān)的組件名稱, name和value構(gòu)成的. 組件名稱和name都是字符串,值是Erlang term. 參數(shù)可被設(shè)置,清除和顯示.通常你可以參考文檔來了解如何設(shè)置參數(shù).

          set_parameter [-p vhost] {component_name} {name} {value}

          設(shè)置一個(gè)參數(shù).

          component_name

          要設(shè)置的組件名稱.

          name

          要設(shè)置的參數(shù)名稱.

          value

          要設(shè)置的參數(shù)值,作不JSON項(xiàng)。在多數(shù)shells中,你更喜歡將其引起來.

          例如:

          rabbitmqctl set_parameter federation local_username '"guest"'

          此命令用于在默認(rèn)虛擬主機(jī)上設(shè)置federation 組件的local_username 參數(shù)值"guest".

          clear_parameter [-p vhost] {component_name} {key}

          清除參數(shù).

          component_name

          要清除參數(shù)的組件名稱.

          name

          要清除的參數(shù)名稱.

          例如:

          rabbitmqctl clear_parameter federation local_username

          此命令用于清除默認(rèn)虛擬主機(jī)上的federation 組件的local_username 參數(shù)值.

          list_parameters [-p vhost]

          列出虛擬主機(jī)上的所有參數(shù).

          示例:

          rabbitmqctl list_parameters

          此命令用于列出默認(rèn)虛擬主機(jī)上的所有參數(shù).

          策略管理

          策略用于在集群范圍的基礎(chǔ)上用于控制和修改隊(duì)列和交換機(jī)的行為. 策略應(yīng)用于虛擬主機(jī),由name, pattern, definition或可選的priority組成. 策略可被設(shè)置,清除和列舉.

          set_policy [-p vhost] [--priority priority] [--apply-to apply-to] {name} {pattern} {definition}

          設(shè)置策略.

          name

          策略名稱.

          pattern

          正則表達(dá)式, 匹配要應(yīng)用的資源

          definition

          策略的定義,JSON形式.在大多數(shù)shells中,你很可能需要引用這個(gè)

          priority

          策略的整數(shù)優(yōu)先級(jí). 數(shù)字越高則優(yōu)先級(jí)越高.默認(rèn)是0.

          apply-to

          策略適用的對(duì)象類型,其值可為 "queues", "exchanges" 或 "all".默認(rèn)是"all".

          例如:

          rabbitmqctl set_policy federate-me "^amq." '{"federation-upstream-set":"all"}'

          此命令在默認(rèn)虛擬主機(jī)上設(shè)置策略為federate-me,這樣內(nèi)建的交換器將進(jìn)行聯(lián)合.

          clear_policy [-p vhost] {name}

          清除策略.

          name

          要清除的策略名稱.

          例如:

          rabbitmqctl clear_policy federate-me

          此命令來清除默認(rèn)虛擬主機(jī)上的federate-me 策略.

          list_policies [-p vhost]

          顯示虛擬主機(jī)上的所有策略.

          例如:

          rabbitmqctl list_policies

          此命令會(huì)顯示默認(rèn)虛擬主機(jī)上的所有策略.

          服務(wù)器狀態(tài)

          服務(wù)器狀態(tài)查詢查詢服務(wù)器返回一個(gè)結(jié)果以制表符分隔的列表. 某些查詢(list_queueslist_exchangeslist_bindings, 和 list_consumers) 接受一個(gè)可選的vhost 參數(shù). 如果這個(gè)參數(shù)出現(xiàn)了,那么它必須指定在查詢的后面.

          list_queues, list_exchanges and list_bindings 命令接受一個(gè)可選的虛擬主機(jī)參數(shù)以顯示其結(jié)果.默認(rèn)值為"/".

          list_queues [-p vhost] [queueinfoitem ...]

          返回隊(duì)列的詳細(xì)信息. 如果無-p標(biāo)志,將顯示/虛擬主機(jī)上的隊(duì)列詳情."-p" 標(biāo)志可用來覆蓋此默認(rèn)值.

          queueinfoitem 參數(shù)用于指示哪些隊(duì)列信息項(xiàng)會(huì)包含在結(jié)果集中.結(jié)果集的列順序?qū)⑵ヅ鋮?shù)的順序.queueinfoitem 可以是下面列表中的任何值:

          name

          非ASCII字符的隊(duì)列名稱.

          durable

          服務(wù)器重啟后,隊(duì)列是否能幸存.

          auto_delete

          不再使用時(shí),是否需要自動(dòng)刪除隊(duì)列.

          arguments

          隊(duì)列參數(shù).

          policy

          應(yīng)用到隊(duì)列上的策略名稱.

          pid

          關(guān)聯(lián)隊(duì)列的Erlang進(jìn)程ID.

          owner_pid

          表示隊(duì)列專用所有者的代表連接的Erlang進(jìn)程ID.如果隊(duì)列是非專用的,此值將為空.

          exclusive

          True:如果隊(duì)列是專用的(即有owner_pid), 反之false

          exclusive_consumer_pid

          表示此channel的專用消費(fèi)者訂閱到此隊(duì)列的Erlang進(jìn)程Id. 如果沒有專用消費(fèi)者,則為空.

          exclusive_consumer_tag

          專用消費(fèi)者訂閱到此隊(duì)列的Consumer tag.如果沒有專用消費(fèi)者,則為空.

          messages_ready

          準(zhǔn)備分發(fā)給客戶端的消息數(shù)目.

          messages_unacknowledged

          分發(fā)到客戶端但尚未應(yīng)答的消息數(shù)目.

          messages

          準(zhǔn)備分發(fā)和未應(yīng)答消息的總和(隊(duì)列深度).

          messages_ready_ram

          駐留在ram中messages_ready的消息數(shù)目.

          messages_unacknowledged_ram

          駐留在ram中messages_unacknowledged的消息數(shù)目.

          messages_ram

          駐留在ram中的消息總數(shù).

          messages_persistent

          隊(duì)列中持久化消息的數(shù)目(對(duì)于瞬時(shí)隊(duì)列總是0).

          message_bytes

          隊(duì)列中所有消息體的大小總和.這不包括消息屬性(包括headers) 或任何開銷(overhead)。

          message_bytes_ready

          類似于message_bytes ,但只統(tǒng)計(jì)準(zhǔn)備投遞給clients的那些消息.

          message_bytes_unacknowledged

          類似于message_bytes ,但只統(tǒng)計(jì)那些已經(jīng)投遞給clients但還未應(yīng)答的消息

          message_bytes_ram

          類似于message_bytes ,但只統(tǒng)計(jì)那些在RAM中的消息

          message_bytes_persistent

          類似于message_bytes ,但只統(tǒng)計(jì)那些持久化的消息

          head_message_timestamp

          如果存在,只顯示隊(duì)列中第1個(gè)消息的timestamp屬性. 消息的時(shí)間戳只出現(xiàn)在分頁情況下.

          disk_reads

          從隊(duì)列啟動(dòng)開如,已從磁盤上讀取該隊(duì)列的消息總次數(shù).

          disk_writes

          從隊(duì)列啟動(dòng)開始,已向磁盤隊(duì)列寫消息總次數(shù).

          consumers

          消費(fèi)者數(shù)目.

          consumer_utilisation

          時(shí)間分?jǐn)?shù)(0.0與1.0之間),隊(duì)列可立即向消費(fèi)者投遞消息. 它可以小于1.0,如果消費(fèi)者受限于網(wǎng)絡(luò)堵塞或預(yù)提取數(shù)量.

          memory

          與隊(duì)列相關(guān)的Erlang進(jìn)程消耗的內(nèi)存字節(jié)數(shù),包括棧,堆以及內(nèi)部結(jié)構(gòu).

          slave_pids

          如果隊(duì)列是鏡像的,這里給出的是當(dāng)前slaves的IDs.

          synchronised_slave_pids

          如果隊(duì)列是鏡像的,當(dāng)前slaves的IDs是master同步的- 即它們可在無消息丟失的情況下,接管master.

          state

          隊(duì)列狀態(tài).正常情況下是'running', 但如果隊(duì)列正在同步也可能是"{syncing, MsgCount}". 處于集群下的節(jié)點(diǎn)如果掉線了,隊(duì)列狀態(tài)交顯示'down' (大多數(shù)queueinfoitems 將不可用).

          如果沒有指定queueinfoitems,那么將顯示隊(duì)列名稱和隊(duì)列深度.

          例如:

          rabbitmqctl list_queues -p /myvhost messages consumers

          此命令顯示了/myvhost虛擬主機(jī)中每個(gè)隊(duì)列的深度和消費(fèi)者數(shù)目.

          list_exchanges [-p vhost] [exchangeinfoitem ...]

          返回交換器細(xì)節(jié).如果沒有指定"-p"選項(xiàng),將返回 / 虛擬主機(jī)的細(xì)節(jié).  "-p" 選項(xiàng)可用來覆蓋默認(rèn)虛擬主機(jī).

          exchangeinfoitem 參數(shù)用來表示哪些交換器信息要包含在結(jié)果中. 結(jié)果集中列的順序?qū)⑴c參數(shù)順序保持一致. exchangeinfoitem 可接受下面的列表中任何值:

          name

          交換器名稱.

          type

          交換器類型(如[directtopicheadersfanout]).

          durable

          當(dāng)服務(wù)器重啟時(shí),交換器是否能復(fù)活.

          auto_delete

          當(dāng)不再使用時(shí),交換器是否需要自動(dòng)刪除.

          internal

          交換器是否是內(nèi)部的,即不能由client直接發(fā)布.

          arguments

          交換器參數(shù)


          policy

          應(yīng)用到交換器上的策略名稱.

          如果沒有指定exchangeinfoitems,那么將會(huì)顯示交換器類型和類型

          例如:

          rabbitmqctl list_exchanges -p /myvhost name type

          此命令會(huì)顯示/myvhost中每個(gè)交換器的名稱和類型.

          list_bindings [-p vhost] [bindinginfoitem ...]

          返回綁定細(xì)節(jié).默認(rèn)情況下返回的是 / 虛擬主機(jī)上的綁定詳情.可使用"-p" 標(biāo)記來覆蓋默認(rèn)虛擬主機(jī).

          bindinginfoitem 參數(shù)用來表示結(jié)果中包含哪些綁定信息. 結(jié)果集中列的順序?qū)⑵ヅ鋮?shù)的順序.bindinginfoitem可接受下面列表的任意值:

          source_name

          綁定中消息來源的名稱. C中非ASCII轉(zhuǎn)義字符.

          source_kind

          綁定中消息來源的類別.當(dāng)前總是exchange. C中非ASCII轉(zhuǎn)義字符.

          destination_name

          綁定中消息目的地名稱.C中非ASCII轉(zhuǎn)義字符.

          destination_kind

          綁定中消息目的地的種類. C中非ASCII轉(zhuǎn)義字符.

          routing_key

          綁定的路由鍵,C中非ASCII轉(zhuǎn)義字符.

          arguments

          綁定參數(shù).

          如果沒有指定bindinginfoitems,將會(huì)顯示所有上述條目.

          例如:

          rabbitmqctl list_bindings -p /myvhost exchange_name queue_name

          此命令來顯示/myvhost虛擬主機(jī)上綁定的交換器名稱和隊(duì)列名稱.

          list_connections [connectioninfoitem ...]

          返回TCP/IP連接統(tǒng)計(jì).

          connectioninfoitem 參數(shù)用來表示在結(jié)果中包含哪些連接信息. 結(jié)果集中列的順序?qū)⑵ヅ鋮?shù)的順序.               connectioninfoitem可接受下面列表的任意值:

          pid

          與連接相關(guān)的Erlang進(jìn)程ID.

          name

          連接的可讀名稱.

          port

          服務(wù)器端口.

          host

          返回反向DNS獲取的服務(wù)器主機(jī)名稱,或 IP地址(反向DNS解析失敗) 或者未啟用.

          peer_port

          Peer 端口.

          peer_host
             返回反向DNS獲取的Peer主機(jī)名稱,或 IP地址(反向DNS解析失敗) 或者未啟用.
          ssl

          用Boolean來表示連接是否是SSL的.

          ssl_protocol

          SSL 協(xié)議(如. tlsv1)

          ssl_key_exchange

          SSL key exchange 算法 (如 rsa)

          ssl_cipher

          SSL cipher 算法 (如aes_256_cbc)

          ssl_hash

          SSL hash 函數(shù) (如 sha)

          peer_cert_subject

          peer的 SSL 安全證書的主體, RFC4514形式.

          peer_cert_issuer

          peer的 SSL安全證書的發(fā)行者, RFC4514 形式.

          peer_cert_validity

          peer的SSL安全證書的有效期.

          state

          連接狀態(tài)(可為[startingtuningopeningrunningflowblockingblockedclosingclosed]其中一個(gè)).

          channels
          使用連接的channel數(shù)。
          protocol

          使用的AMQP協(xié)議版本(當(dāng)前是{0,9,1} 或{0,8,0}). 注意,如果client請(qǐng)求的是AMQP 0-9 連接, 我們會(huì)視為AMQP 0-9-1.

          auth_mechanism

          使用的SASL認(rèn)證機(jī)制,如PLAIN.

          user

          與連接相關(guān)的用戶名

          vhost

          虛擬主機(jī)名稱,C中非ASCII轉(zhuǎn)義字符.

          timeout

          連接超時(shí)/協(xié)商的心跳間隔,秒為單位.

          frame_max

          最大 frame 大小(字節(jié)).

          channel_max
                  此連接上channel的最大數(shù)目.
          client_properties

          連接建立期間由client發(fā)送的信息屬性.

          recv_oct

          Octets已收到.

          recv_cnt

          Packets 已收到.

          send_oct

          Octets 發(fā)送.

          send_cnt

          Packets 發(fā)送.

          send_pend

          發(fā)送隊(duì)列大小.

          connected_at

          連接建立的日期和時(shí)間,當(dāng)作timestamp.

          如果沒有connectioninfoitems, 那么會(huì)顯示user, peer host, peer port,流量控制和內(nèi)存塊狀態(tài)的時(shí)間

          例如:

          rabbitmqctl list_connections send_pend port

          此命令會(huì)顯示發(fā)送隊(duì)列的大小以及第個(gè)連接的服務(wù)器端口.

          list_channels [channelinfoitem ...]

          返回所有當(dāng)前channel上的信息,邏輯容器執(zhí)行大部分 AMQP命令.這將包含最初AMQP連接的部分,以及不同插件和其它擴(kuò)展創(chuàng)建的channels.

          channelinfoitem 參數(shù)用來表示在結(jié)果集中包含哪些channel信息.結(jié)果集中列的順序?qū)⑵ヅ鋮?shù)的順序. channelinfoitem 可接受下面列表中的任何一個(gè)參數(shù):

          pid

          與連接相關(guān)的Erlang進(jìn)程ID.

          connection

          channel所屬的連接Erlang進(jìn)程ID.

          name

          channel的可讀名稱.

          number

          channel的數(shù)目,在一個(gè)連接中,它有唯一的標(biāo)識(shí)符.

          user

          與channel相關(guān)的用戶名稱.

          vhost

          channel操作的虛擬主機(jī).

          transactional

          True:如果channel處于事務(wù)模式,其它情況為false.

          confirm

          True:如果channel是確認(rèn)模式,其它情況為false.

          consumer_count

          在channel中接收消息的邏輯AMQP消費(fèi)者數(shù)目.

          messages_unacknowledged

          在channel中消息已投遞但還未應(yīng)答的消息數(shù)目.

          messages_uncommitted

          在channel中已收到消息但還沒有提交事務(wù)的消息個(gè)數(shù).

          acks_uncommitted
          確認(rèn)收到一個(gè)還未提交的事務(wù)數(shù)。
          messages_unconfirmed
          尚未確認(rèn)已發(fā)布消息的數(shù)目。在通道不在確認(rèn)模式下時(shí),這將是0。
          prefetch_count

          新消費(fèi)者QoS預(yù)提取限制, 0表示無上限.

          global_prefetch_count

          整個(gè)channel QoS預(yù)提取限制, 0表示無上限.

          如果沒有指定channelinfoitems,那么將顯示pid, user, consumer_count,messages_unacknowledged.


          例如:

          rabbitmqctl list_channels connection messages_unacknowledged

          此命令會(huì)顯示每個(gè)channel中連接進(jìn)程和未應(yīng)答消息的數(shù)目.

          list_consumers [-p vhost]

          列舉消費(fèi)者, 即訂閱隊(duì)列的消息流. 每行將打印出由制表符分隔的已訂閱隊(duì)列的名稱,創(chuàng)建并管理訂閱的channel進(jìn)程的標(biāo)識(shí),channel中訂閱的consumer tag唯一標(biāo)識(shí)符, boolean值表示投遞到此消費(fèi)者的消息是否需要應(yīng)答,整數(shù)值表示表示預(yù)提取限制(為0表示無限制), 以及關(guān)于此消費(fèi)者的任何其它參數(shù).

          status

          顯示 broker 狀態(tài)信息,如當(dāng)前Erlang節(jié)點(diǎn)上運(yùn)行的應(yīng)用程序, RabbitMQ 和 Erlang 的版本信息, OS 名稱, 內(nèi)存和文件描述符統(tǒng)計(jì)信息. (查看cluster_status 命令來找出那些節(jié)點(diǎn)是集群化的以及正在運(yùn)行的.)

          例如:

          rabbitmqctl status

          此命令顯示了RabbitMQ broker的相關(guān)信息.

          environment

          顯示每個(gè)運(yùn)行程序環(huán)境中每個(gè)變量的名稱和值.

          report

          為所有服務(wù)器狀態(tài)生成一個(gè)服務(wù)器狀態(tài)報(bào)告,輸出應(yīng)該重定向到一個(gè)文件.

          例如:

          rabbitmqctl report > server_report.txt

          此命令創(chuàng)建了一個(gè)服務(wù)器報(bào)告,可將它附著在支持請(qǐng)求的電子郵件中.

          eval {expr}

          執(zhí)行任意Erlang表達(dá)式.

          例如:

          rabbitmqctl eval 'node().'

          此命令用于返回rabbitmqctl連接的節(jié)點(diǎn)名稱

          雜項(xiàng)

          close_connection {connectionpid} {explanation}

          connectionpid

          要關(guān)閉的與連接相關(guān)的Erlang進(jìn)程ID.

          explanation

          解釋字符串.

          指示broker關(guān)閉與Erlang進(jìn)程id相關(guān)的連接(可通過list_connections 命令查看), 通過為連接客戶端傳遞解釋字符串(作為AMQP連接關(guān)閉協(xié)議的一部分).

          例如:

          rabbitmqctl close_connection "<rabbit@tanto.4262.0>" "go away"

          此命令指示RabbitMQ broker關(guān)閉與Erlang 進(jìn)程id<rabbit@tanto.4262.0>相關(guān)聯(lián)的連接, 同時(shí)向客戶端傳遞go away字符串.

          trace_on [-p vhost]

          vhost

          要開啟追蹤的虛擬主機(jī)的名稱.

          開啟追蹤.注意,追蹤狀態(tài)不是持久化的; 如果服務(wù)器重啟,追蹤狀態(tài)將會(huì)丟失.

          trace_off [-p vhost]

          vhost

          要停止追蹤的虛擬主機(jī)名稱.

          停止追蹤.

          set_vm_memory_high_watermark {fraction}

          fraction
          當(dāng)一個(gè)浮點(diǎn)數(shù)大于或等于0時(shí),會(huì)觸發(fā)流量控制新內(nèi)存閾值部分。

          set_vm_memory_high_watermark absolute {memory_limit}

          memory_limit

          流程控制觸發(fā)的新內(nèi)存限制, 以字節(jié)來表示大于或等于0的整數(shù)或以字符串和內(nèi)存單位來表示(如 512M或1G). 可用的單位是: k, kiB: kibibytes (2^10 bytes) M, MiB: mebibytes (2^20) G, GiB: gibibytes (2^30) kB: kilobytes (10^3) MB: megabytes (10^6) GB: gigabytes (10^9)

          set_disk_free_limit {disk_limit}

          disk_limit

          以整數(shù)或字符串單位的可用磁盤下限限制(查看vm_memory_high_watermark), 如 512M or 1G. 一旦可用磁盤空間達(dá)到這個(gè)限制,就會(huì)設(shè)置磁盤報(bào)警.

          set_disk_free_limit mem_relative {fraction}

          fraction

          相對(duì)于整個(gè)可用內(nèi)存的限制,其值為非負(fù)浮點(diǎn)數(shù). 當(dāng)值小于1.0時(shí)是很危險(xiǎn)的,應(yīng)該謹(jǐn)慎使用.

          posted @ 2016-07-30 16:52 胡小軍 閱讀(12801) | 評(píng)論 (0)編輯 收藏
          原文:http://www.rabbitmq.com/production-checklist.html
          介紹
          像RabbitMQ這樣的數(shù)據(jù)服務(wù)經(jīng)常有許多的可調(diào)參數(shù).某些配置對(duì)于開發(fā)環(huán)境來說是意義的,但卻不適合產(chǎn)品環(huán)境. 單個(gè)配置不能滿足每種使用情況. 因此,在進(jìn)入產(chǎn)品環(huán)境時(shí),評(píng)估配置是很重要的. 這就是本指南提供幫助的目的.
          虛擬主機(jī),用戶,權(quán)限
          Virtual Hosts
          在單租戶環(huán)境中,例如,當(dāng)RabbitMQ在產(chǎn)品環(huán)境中只致力于為某單個(gè)系統(tǒng)服務(wù)時(shí),使用默認(rèn)虛擬主機(jī) (/)是非常好的.
          在多租戶環(huán)境中,為每個(gè)租戶/環(huán)境使用單獨(dú)的虛擬主機(jī),如:project1_developmentproject1_productionproject2_developmentproject2_production, 等等.
          用戶
          在產(chǎn)品環(huán)境中,刪除默認(rèn)用戶(guest). 默認(rèn)情況下,默認(rèn)用戶只能通過本地來連接, 因?yàn)樗斜娝艿膽{證.為了不啟用遠(yuǎn)程連接,可考慮使用帶有administrative權(quán)限和生成密碼的獨(dú)立用戶來代替
          強(qiáng)烈建議在每個(gè)程序中使用單獨(dú)的用戶,例如,如果你有一個(gè)mobile app, 一個(gè)Web app, 和一個(gè)數(shù)據(jù)聚合系統(tǒng), 你最好有3個(gè)獨(dú)立的用戶. 這會(huì)使許多事情變得更簡(jiǎn)單:
          • 使 client 連接與程序相關(guān)聯(lián)
          • 使用細(xì)粒度的權(quán)限
          • 憑據(jù)翻滾(如. 周期性地或遭到破壞的情況下)
          如果有許多相同應(yīng)用程序的實(shí)例,有一個(gè)更好安全性權(quán)衡(每一個(gè)實(shí)例的憑據(jù))和方便的配置(共享一些或所有實(shí)例之間的一組憑據(jù))。物聯(lián)網(wǎng)的應(yīng)用涉及很多客戶執(zhí)行相同或相似的功能,有固定的IP地址,它可以使用X509證書或源IP地址范圍驗(yàn)證。
          資源限制
          當(dāng)消費(fèi)者跟不上的時(shí)候,RabbitMQ 使用Resource-driven alarms (資源驅(qū)動(dòng)報(bào)警)來壓制(throttle)發(fā)布者. 在進(jìn)入生產(chǎn)之前評(píng)估資源限制配置是重要的。
          內(nèi)存
          默認(rèn)情況下, RabbitMQ會(huì)使用可用RAM的40%. 這專門針對(duì)于那些運(yùn)行RabbitMQ的節(jié)點(diǎn),通常情況下,提高此限制是合理的. 然而,應(yīng)注意的是,操作系統(tǒng)和文件系統(tǒng)的緩存也需要內(nèi)存來運(yùn)行。如果不這樣做,會(huì)由于操作系統(tǒng)交換導(dǎo)致嚴(yán)重的吞吐量下降,甚至導(dǎo)致操作系統(tǒng)會(huì)終止RabbitMQ過程的運(yùn)行。
          下面是一些基本的指導(dǎo)方針,用于確定推薦的RAM limit:
          • 至少有128 MB
          • 當(dāng)RAM達(dá)到4GB時(shí),可配置為75%的RAM限制
          • 當(dāng)RAM達(dá)到4GB-8GB時(shí),可配置為80%的RAM限制
          • 當(dāng)RAM達(dá)到8GB-16GB時(shí),可配置為85%的RAM限制
          • 當(dāng)RAM大于16GB時(shí),可配置為90%的RAM限制
          高于0.9的值是很危險(xiǎn)的,不推薦配置
          可用磁盤空間
          必要的可用磁盤空間可防止disk space alarms.(磁盤空間報(bào)警) .默認(rèn)情況下,RabbitMQ始終需要 50 MiB的可用磁盤空間.在大多數(shù)Linux發(fā)行者,根據(jù)開發(fā)者的經(jīng)驗(yàn),可將放置到小分區(qū)的/var 目錄下. 然而,對(duì)于產(chǎn)品環(huán)境來說,這不是一個(gè)推薦值, 因?yàn)樗鼈兛赡苊黠@的更高的RAM 限制. 下面是一些基本的指導(dǎo)方針,如何確定有多少空閑磁盤空間是推薦的:
          • 至少有2 GB
          • 當(dāng)限制為1到8GB的RAM時(shí),可配置為RAM限制的50%
          • 當(dāng)限制為8到32GB的RAM時(shí),可配置為RAM限制的40%
          • 當(dāng)限制超過32GB的RAM時(shí),可配置為RAM限制的30%
          rabbit.disk_free_limit 配置可通過 {mem_relative, N}來完成,使其相對(duì)于RAM限制的百分比來計(jì)算. 例如, 使用{mem_relative, 0.5} 設(shè)為50%, {mem_relative, 0.25}設(shè)為25%等等.
          打開文件句柄限制
          操作系統(tǒng)限制了并發(fā)打開的文件句柄的最大數(shù)量,其中包括網(wǎng)絡(luò)套接字。確保您的限制設(shè)置得足夠高,以允許預(yù)期數(shù)量的并發(fā)連接和隊(duì)列。
          對(duì)于有效RabbitMQ用戶,確保你的環(huán)境允許至少50K的打開文件描述符,包括開發(fā)環(huán)境。
          作為經(jīng)驗(yàn)法則,并發(fā)連接數(shù)的95%乘以2再加上隊(duì)列的總數(shù)可以計(jì)算出打開文件句柄限制( multiple the 95th percentile number of concurrent connections by 2 and add total number of queues to calculate recommended open file handle limit). 值高于500K也是恰當(dāng)?shù)兀粫?huì)消耗太多的硬件資源,因此建議在生產(chǎn)環(huán)境中設(shè)置. 查看Networking guide 來了解更多信息.
          安全注意事項(xiàng)
          用戶和權(quán)限
          查看vhosts, users, 和 證書章節(jié).
          Erlang Cookie
          在Linux 和BSD 系統(tǒng)中, 有必要限制只有運(yùn)行RabbitMQ和rabbitmqctl工具的用戶才能訪問Erlang cookie.
          TLS
          如果有可能,我們建議使用LS connections, 至少要加密通信. Peer驗(yàn)證(身份驗(yàn)證)也被推薦 . 開發(fā)和QA 環(huán)境可使用self-signed TLS certificates. 當(dāng)RabbitMQ和所有程序運(yùn)行在可信網(wǎng)絡(luò)或隔離(使用像VMware NSX技術(shù))環(huán)境中時(shí),自簽名證書可以應(yīng)用于產(chǎn)品環(huán)境.
          雖然RabbitMQ試圖提供一個(gè)默認(rèn)的安全TLS 配置 (如.SSLv3是禁用的), 我們推薦評(píng)估TLS 版本和密碼套件. 請(qǐng)參考TLS guide 了解更多信息.
          網(wǎng)絡(luò)配置
          產(chǎn)品環(huán)境需要調(diào)整網(wǎng)絡(luò)配置.請(qǐng)參考 Networking Guide 來了解細(xì)節(jié).
          自動(dòng)連接恢復(fù)
          某些client libraries, 例如 Java.NET, 和 Ruby, 在網(wǎng)絡(luò)失敗后,支持自動(dòng)連接恢復(fù).如果client提供了這種功能,建議使用它來代替你自己的恢復(fù)機(jī)制.
          集群化考慮
          集群大小
          當(dāng)確定集群大小時(shí),需要重點(diǎn)考慮下面的幾個(gè)因素:
          • 希望的吞吐量
          • 希望的復(fù)制( mirrors的數(shù)目)
          • 數(shù)據(jù)局部性
          因?yàn)榭蛻舳丝梢赃B接到任何節(jié)點(diǎn),RabbitMQ可能需要進(jìn)行集群間消息路由和內(nèi)部操作。嘗試使消費(fèi)者和生產(chǎn)者連接到同一個(gè)節(jié)點(diǎn),如果可能的話:這將減少節(jié)點(diǎn)間的流量。 使消費(fèi)者連接到持有隊(duì)列的master上(可使用HTTP API進(jìn)行推斷),也是有幫助的.當(dāng)考慮到數(shù)據(jù)局部性時(shí),總的集群吞吐量可以達(dá)到不平凡的量
          對(duì)于大多數(shù)環(huán)境中,鏡像超過一半的群集節(jié)點(diǎn)是足夠的。建議使用一個(gè)奇數(shù)的節(jié)點(diǎn)(3,5,等等)的集群。
          分區(qū)處理策略
          在用于產(chǎn)品環(huán)境之前,挑選partition handling strategy 是很重要的. 有疑問時(shí),使用theautoheal策略。
          posted @ 2016-07-30 16:47 胡小軍 閱讀(1660) | 評(píng)論 (0)編輯 收藏
          原文:http://www.rabbitmq.com/memory.html
          RabbitMQ服務(wù)器在啟動(dòng)時(shí)以及abbitmqctl set_vm_memory_high_watermark fraction 執(zhí)行時(shí),會(huì)檢查計(jì)算機(jī)的RAM總大小. 默認(rèn)情況下下, 當(dāng) RabbitMQ server 的使用量超過RAM的40% ,它就會(huì)發(fā)出內(nèi)存警報(bào),并阻塞所有連接. 一旦內(nèi)存警報(bào)清除 (如,服務(wù)器將消息轉(zhuǎn)存于磁盤,或者將消息投遞給clients),服務(wù)又地恢復(fù).
          默認(rèn)內(nèi)存閥值設(shè)置為已安裝RAM的40%. 注意這并不會(huì)阻止RabbitMQ server使用內(nèi)存量超過40%, 它只是為了壓制發(fā)布者. Erlang的垃圾回收器最壞情況下,可使用配置內(nèi)存的2倍(默認(rèn)情況下t, RAMr的80%). 因此強(qiáng)制建議開啟OS swap或page files .
          32位架構(gòu)傾向于每一個(gè)進(jìn)程有2GB的內(nèi)存限制. 64位架構(gòu)的一般實(shí)現(xiàn)(i.e. AMD64 和 Intel EM64T) 只允許每個(gè)進(jìn)程為256TB. 64-位 Windows 限制為8TB. 但是,請(qǐng)注意,即使是64位操作系統(tǒng)下,一個(gè)32位的過程往往只有一個(gè)2GB的最大地址空間。
          配置內(nèi)存閥值
          內(nèi)存閥值可通過編輯configuration file來配置.下面的例子將閥值設(shè)為默認(rèn)值0.4:
          [{rabbit, [{vm_memory_high_watermark, 0.4}]}].
          默認(rèn)值0.4 代表的是已安裝RAM的 40% , 有時(shí)候還更小.如:在 32位平臺(tái)中,如果你安裝有4GB RAM , 4GB 的40% 是 1.6GB, 但是 32-位 Windows 正常情況下限制進(jìn)程為2GB,因此實(shí)際閥值是2GB的40% (即820MB).
          另外, 內(nèi)存閥值也可以設(shè)置為絕對(duì)值. 下面的例子將閥值設(shè)為了1073741824 字節(jié) (1024 MB):
          [{rabbit, [{vm_memory_high_watermark, {absolute, 1073741824}}]}].
          同例, 也可使用內(nèi)存單位:
          [{rabbit, [{vm_memory_high_watermark, {absolute, "1024MiB"}}]}].
          如果絕對(duì)上限大于了安裝的RAM可用的虛擬地址空間, 閥值上限會(huì)略小.
          當(dāng)RabbitMQ服務(wù)器啟動(dòng)時(shí),內(nèi)存限制將追加到RABBITMQ_NODENAME.log 文件中:
          =INFO REPORT==== 29-Oct-2009::15:43:27 === Memory limit set to 2048MB.
          內(nèi)存限制也可以使用rabbitmqctl status命令查詢
          其閥值也可以在broker運(yùn)行時(shí),通過rabbitmqctl set_vm_memory_high_watermark fraction 命令或 rabbitmqctl set_vm_memory_high_watermark absolute memory_limit 命令修改. 內(nèi)存單位也可以在命令中使用. 此命令會(huì)在broker重啟后生效. 當(dāng)執(zhí)行此命令時(shí),內(nèi)存限制可能會(huì)改變熱插拔RAM,而不會(huì)發(fā)生報(bào)警,這是因?yàn)樾枰繑?shù)量的系統(tǒng)RAM.
          禁止所有發(fā)布
          其值為0時(shí),會(huì)立即觸發(fā)報(bào)警并禁用所有發(fā)布 (當(dāng)需要禁用全局發(fā)布時(shí),這可能是有用的); use rabbitmqctl set_vm_memory_high_watermark 0.
          限制的地址空間
          當(dāng)在64位操作系統(tǒng)中運(yùn)行32位 Erlang VM時(shí),(or a 32 bit OS with PAE), 可用地址內(nèi)存是受限制的. 服務(wù)器探測(cè)到后會(huì)記錄像下邊的日志消息:
          =WARNING REPORT==== 19-Dec-2013::11:27:13 === Only 2048MB of 12037MB memory usable due to limited address space. Crashes due to memory exhaustion are possible - see http://www.rabbitmq.com/memory.html#address-space
          內(nèi)存報(bào)警系統(tǒng)是不完美的.雖然停止發(fā)布通常會(huì)防止任何進(jìn)一步的內(nèi)存使用,但可能有其他東西繼續(xù)增加內(nèi)存使用。通常情況下,當(dāng)這種情況發(fā)生時(shí),物理內(nèi)存耗盡,操作系統(tǒng)將開始交換。但是當(dāng)運(yùn)行一個(gè)有限的地址空間,超過限制的運(yùn)行會(huì)導(dǎo)致虛擬機(jī)崩潰。
          因此強(qiáng)制建議在在64位操作系統(tǒng)上運(yùn)行64位的Erlang VM.
          配置分頁閾值
          在broker達(dá)到最高水位阻塞發(fā)布者之前,它會(huì)嘗試將隊(duì)列內(nèi)容分頁輸出到磁盤上來釋放內(nèi)存. 持久化和瞬時(shí)消息都會(huì)分頁輸出 (已經(jīng)在磁盤上的持久化消息會(huì)被趕出內(nèi)存).
          默認(rèn)情況下,在達(dá)最高水位的50%時(shí),就會(huì)發(fā)生這種情況. (即,默認(rèn)最高水位為0.4, 這會(huì)在內(nèi)存使用達(dá)到20%時(shí)就會(huì)發(fā)生). 要修改此值,可修改vm_memory_high_watermark_paging_ratio 配置的0.5默認(rèn)值. 例如:
          [{rabbit, [{vm_memory_high_watermark_paging_ratio, 0.75}, {vm_memory_high_watermark, 0.4}]}].
          上面的配置表示在內(nèi)存使用達(dá)到30%時(shí),就會(huì)啟動(dòng),40%的時(shí)候會(huì)阻塞發(fā)布者.
          也可以將vm_memory_high_watermark_paging_ratio 值設(shè)為大于1.0的值.在這種情況下,隊(duì)列不會(huì)把它的內(nèi)容分頁到磁盤上.如果這引起了內(nèi)存報(bào)警關(guān)閉,那么生產(chǎn)者會(huì)如上面預(yù)期的一樣被阻塞.
          未確認(rèn)的平臺(tái)
          如果RabbitMQ服務(wù)器不能識(shí)別你的系統(tǒng),它將在RABBITMQ_NODENAME.log 文件中追加警告.
          然后它會(huì)假設(shè)安裝了超過了1GB的RAM:
          =WARNING REPORT==== 29-Oct-2009::17:23:44 === Unknown total memory size for your OS {unix,magic_homebrew_os}. Assuming memory size is 1024MB.
          在這種情況下,vm_memory_high_watermark 配置值假設(shè)為1GB RAM. 在 vm_memory_high_watermark 默認(rèn)設(shè)為 0.4的情況下, RabbitMQ的內(nèi)存閥值設(shè)為了410MB, 因此當(dāng)RabbitMQ使用了多于410M內(nèi)存時(shí),它會(huì)阻塞生產(chǎn)者.因此當(dāng)RabbitMQ不能識(shí)別你的平臺(tái)時(shí),如果你實(shí)際有8GB RAM,并且你想讓RabbitMQ內(nèi)存使用量超過3GB阻塞生產(chǎn)者,你可以設(shè)置vm_memory_high_watermark為3.
          推薦RAM 水位設(shè)置,可參考Production Checklist.

          posted @ 2016-07-30 15:05 胡小軍 閱讀(7967) | 評(píng)論 (0)編輯 收藏
          鳥欲高飛先振翅,人求上進(jìn)先讀書。本文是原書的第9章 線程的監(jiān)控及其日常工作中如何分析里的9.3.3節(jié)常見的內(nèi)存溢出的三種情況。
          3. 常見的內(nèi)存溢出的三種情況:
          1)JVM Heap(堆)溢出:java.lang.OutOfMemoryError: Java heap space
          JVM在啟動(dòng)的時(shí)候會(huì)自動(dòng)設(shè)置JVM Heap的值, 可以利用JVM提供的-Xmn -Xms -Xmx等選項(xiàng)可進(jìn)行設(shè)置。Heap的大小是Young Generation 和Tenured Generaion 之和。在JVM中如果98%的時(shí)間是用于GC,且可用的Heap size 不足2%的時(shí)候?qū)伋龃水惓P畔ⅰ?/span>
          解決方法:手動(dòng)設(shè)置JVM Heap(堆)的大小。
          2)PermGen space溢出: java.lang.OutOfMemoryError: PermGen space
          PermGen space的全稱是Permanent Generation space,是指內(nèi)存的永久保存區(qū)域。為什么會(huì)內(nèi)存溢出,這是由于這塊內(nèi)存主要是被JVM存放Class和Meta信息的,Class在被Load的時(shí)候被放入PermGen space區(qū)域,它和存放Instance的Heap區(qū)域不同,sun的 GC不會(huì)在主程序運(yùn)行期對(duì)PermGen space進(jìn)行清理,所以如果你的APP會(huì)載入很多CLASS的話,就很可能出現(xiàn)PermGen space溢出。一般發(fā)生在程序的啟動(dòng)階段。
          解決方法: 通過-XX:PermSize和-XX:MaxPermSize設(shè)置永久代大小即可。
          3)棧溢出: java.lang.StackOverflowError : Thread Stack space
          棧溢出了,JVM依然是采用棧式的虛擬機(jī),這個(gè)和C和Pascal都是一樣的。函數(shù)的調(diào)用過程都體現(xiàn)在堆棧和退棧上了。調(diào)用構(gòu)造函數(shù)的 “層”太多了,以致于把棧區(qū)溢出了。 通常來講,一般棧區(qū)遠(yuǎn)遠(yuǎn)小于堆區(qū)的,因?yàn)楹瘮?shù)調(diào)用過程往往不會(huì)多于上千層,而即便每個(gè)函數(shù)調(diào)用需要 1K的空間(這個(gè)大約相當(dāng)于在一個(gè)C函數(shù)內(nèi)聲明了256個(gè)int類型的變量),那么棧區(qū)也不過是需要1MB的空間。通常棧的大小是1-2MB的。通俗一點(diǎn)講就是單線程的程序需要的內(nèi)存太大了。 通常遞歸也不要遞歸的層次過多,很容易溢出。
          解決方法:1:修改程序。2:通過 -Xss: 來設(shè)置每個(gè)線程的Stack大小即可。
          4. 所以Server容器啟動(dòng)的時(shí)候我們經(jīng)常關(guān)心和設(shè)置JVM的幾個(gè)參數(shù)如下(詳細(xì)的JVM參數(shù)請(qǐng)參看附錄三):
          -Xms:java Heap初始大小, 默認(rèn)是物理內(nèi)存的1/64。
          -Xmx:ava Heap最大值,不可超過物理內(nèi)存。
          -Xmn:young generation的heap大小,一般設(shè)置為Xmx的3、4分之一 。增大年輕代后,將會(huì)減小年老代大小,可以根據(jù)監(jiān)控合理設(shè)置。
          -Xss:每個(gè)線程的Stack大小,而最佳值應(yīng)該是128K,默認(rèn)值好像是512k。
          -XX:PermSize:設(shè)定內(nèi)存的永久保存區(qū)初始大小,缺省值為64M。
          -XX:MaxPermSize:設(shè)定內(nèi)存的永久保存區(qū)最大大小,缺省值為64M。
          -XX:SurvivorRatio:Eden區(qū)與Survivor區(qū)的大小比值,設(shè)置為8,則兩個(gè)Survivor區(qū)與一個(gè)Eden區(qū)的比值為2:8,一個(gè)Survivor區(qū)占整個(gè)年輕代的1/10
          -XX:+UseParallelGC:F年輕代使用并發(fā)收集,而年老代仍舊使用串行收集.
          -XX:+UseParNewGC:設(shè)置年輕代為并行收集,JDK5.0以上,JVM會(huì)根據(jù)系統(tǒng)配置自行設(shè)置,所無需再設(shè)置此值。
          -XX:ParallelGCThreads:并行收集器的線程數(shù),值最好配置與處理器數(shù)目相等 同樣適用于CMS。
          -XX:+UseParallelOldGC:年老代垃圾收集方式為并行收集(Parallel Compacting)。
          -XX:MaxGCPauseMillis:每次年輕代垃圾回收的最長(zhǎng)時(shí)間(最大暫停時(shí)間),如果無法滿足此時(shí)間,JVM會(huì)自動(dòng)調(diào)整年輕代大小,以滿足此值。
          -XX:+ScavengeBeforeFullGC:Full GC前調(diào)用YGC,默認(rèn)是true。
          實(shí)例如:JAVA_OPTS=”-Xms4g -Xmx4g -Xmn1024m -XX:PermSize=320M -XX:MaxPermSize=320m -XX:SurvivorRatio=6″
          原創(chuàng)文章,轉(zhuǎn)載請(qǐng)注明: 轉(zhuǎn)載自并發(fā)編程網(wǎng) – ifeve.com本文鏈接地址: 《 Java并發(fā)編程從入門到精通》 常見的內(nèi)存溢出的三種情況
          posted @ 2016-07-26 23:05 胡小軍 閱讀(335) | 評(píng)論 (0)編輯 收藏

          原文:http://www.oracle.com/technetwork/articles/java/jsr356-1937161.html

          學(xué)習(xí)如何在你的應(yīng)用程序中集成WebSockets.

          Published April 2013

          對(duì)于許多基于客戶端-服務(wù)器程序來說,老的HTTP 請(qǐng)求-響應(yīng)模型已經(jīng)有它的局限性. 信息必須通過多次請(qǐng)求才能將其從服務(wù)端傳送到客戶端.

          過去許多的黑客使用某些技術(shù)來繞過這個(gè)問題,例如:長(zhǎng)輪詢(long polling)、基于 HTTP 長(zhǎng)連接的服務(wù)器推技術(shù)(Comet)

          然而,基于標(biāo)準(zhǔn)的、雙向的、客戶端和服務(wù)器之間全雙工的信道需求再不斷增加。

          在2011年, IETF發(fā)布了標(biāo)準(zhǔn)WebSocket協(xié)議-RFC 6455. 從那時(shí)起,大多數(shù)Web瀏覽器都實(shí)現(xiàn)了支持WebSocket協(xié)議的客戶端APIs.同時(shí),許多Java 包也開始實(shí)現(xiàn)了WebSocket協(xié)議.

          WebSocket協(xié)議利用HTTP升級(jí)技術(shù)來將HTTP連接升級(jí)到WebSocket. 一旦升級(jí)后,連接就有了在兩個(gè)方向上相互獨(dú)立(全雙式)發(fā)送消息(數(shù)據(jù)楨)的能力. 

          不需要headers 或cookies,這大大降低了所需的帶寬通常,WebSockets來周期性地發(fā)送小消息 (例如,幾個(gè)字節(jié)). 

          額外的headers常常會(huì)使開銷大于有效負(fù)載(payload)。

          JSR 356

          JSR 356, WebSocket的Java API, 明確規(guī)定了API,當(dāng)Java開發(fā)者需要在應(yīng)用程序中集成WebSocket時(shí),就可以使用此API—服務(wù)端和客戶端均可. 每個(gè)聲明兼容JSR 356的WebSocket協(xié)議,都必須實(shí)現(xiàn)這個(gè)API. 

          因此,開發(fā)人員可以自己編寫?yīng)毩⒂诘讓覹ebSocket實(shí)現(xiàn)的WebSocket應(yīng)用。這是一個(gè)巨大的好處,因?yàn)樗梢苑乐构?yīng)商鎖定,并允許更多的選擇、自由的庫、應(yīng)用程序服務(wù)器。

          JSR 356是即將到來的java EE 7標(biāo)準(zhǔn)的一部分,因此,所有與Java EE 7兼容的應(yīng)用服務(wù)器都有JSR 365標(biāo)準(zhǔn)WebSocket的實(shí)現(xiàn).一旦建立,WebSocket客戶端和服務(wù)器節(jié)點(diǎn)已經(jīng)是對(duì)稱的了。客戶端API與服務(wù)器端API的區(qū)別是很小的,JSR 356定義的Java client API只是Java EE7完整API的子集.

          客戶段-服務(wù)器端程序使用WebSockets,通常會(huì)包含一個(gè)服務(wù)器組件和多個(gè)客戶端組件, 如圖1所示:

          Figure 1

          圖1

          在這個(gè)例子中,server application 是通過Java編寫的,WebSocket 協(xié)議細(xì)節(jié)是由包含在Java EE 7容器中JSR 356 實(shí)現(xiàn)來處理的.

          JavaFX 客戶端可依賴任何與JSR 356兼容的客戶端實(shí)現(xiàn)來處理WebSocket協(xié)議問題. 

          其它客戶端(如,iOS 客戶端和HTML5客戶端)可使用其它 (非Java)與RFC6455兼容的實(shí)現(xiàn)來與server application通信.

          編程模型

          JSR 356定義的專家小組,希望支持Java EE開發(fā)人員常用的模式和技術(shù)。因此,JSR 356使用了注釋和注入。

          一般來說,支持兩種編程模型:

          • 注解驅(qū)動(dòng)(annotation-driven). 通過使用注解POJOs, 開發(fā)者可與WebSocket生命周期事件交互.
          • 接口驅(qū)動(dòng)(interface-driven). 開發(fā)者可實(shí)現(xiàn)Endpoint接口和與生命周期交互的方法.

          生命周期事件

          典型的WebSocket 交互生命周期如下:

          • 一端 (客戶端) 通過發(fā)送HTTP握手請(qǐng)求來初始化連接.
          • 其它端(服務(wù)端) 回復(fù)握手響應(yīng).
          • 建立連接.從現(xiàn)在開始,連接是完全對(duì)稱的.
          • 兩端都可發(fā)送和接收消息.
          • 其中一端關(guān)閉連接.

          大部分WebSocket生命周期事件都與Java方法對(duì)應(yīng),不管是 annotation-driven 還是interface-driven.

          Annotation-Driven 方式

          接受WebSocket請(qǐng)求的端點(diǎn)可以是以 @ServerEndpoint 注解的POJO. 

          此注解告知容器,此類應(yīng)該被認(rèn)為是WebSocket端點(diǎn). 

          必須的value 元素指定了WebSocket端點(diǎn)的路徑.

          考慮下面的代碼片斷:

          @ServerEndpoint("/hello")  public class MyEndpoint { } 

          此代碼將會(huì)以相對(duì)路徑hello來發(fā)布一個(gè)端點(diǎn).在后續(xù)方法調(diào)用中,此路徑可攜帶路徑參數(shù),如: /hello/{userid}是一個(gè)有效路徑,在這里{userid} 的值,可在生命周期方法使用@PathParam 注解獲取.

          在GlassFish中,如果你的應(yīng)用程序是用上下文mycontextroot 部署的,且在localhost的8080端口上監(jiān)聽, WebSocket可通過使用ws://localhost:8080/mycontextroot/hello來訪問.

          初始化WebSocket連接的端點(diǎn)可以是以 @ClientEndpoint 注解的POJO.@ClientEndpoint 和 @ServerEndpoint的主要區(qū)別是ClientEndpoint 不接受路徑路值元素,因?yàn)樗O(jiān)聽進(jìn)來的請(qǐng)求。

          @ClientEndpoint  public class MyClientEndpoint {} 

          Java中使用注解驅(qū)動(dòng)POJO方式來初始化WebSocket連接,可通過如下代碼來完成:

          javax.websocket.WebSocketContainer container = javax.websocket.ContainerProvider.getWebSocketContainer();  container.conntectToServer(MyClientEndpoint.class, new URI("ws://localhost:8080/tictactoeserver/endpoint")); 

          此后,以 @ServerEndpoint 或@ClientEndpoint 注解的類都稱為注解端點(diǎn).

          一旦建立了WebSocket連接 ,就會(huì)創(chuàng)建 Session,并且會(huì)調(diào)用注解端點(diǎn)中以@OnOpen注解的方法. 

          此方法包含了幾個(gè)參數(shù):

          • javax.websocket.Session 參數(shù), 代表創(chuàng)建的Session
          • EndpointConfig 實(shí)例包含了關(guān)于端點(diǎn)配置的信息
          • 0個(gè)或多個(gè)以 @PathParam注解的字符串參數(shù),指的是端點(diǎn)路徑的path參數(shù)

          下面的方法實(shí)現(xiàn)了當(dāng)打開WebSocket時(shí),將會(huì)打印session的標(biāo)識(shí)符:

          @OnOpen public void myOnOpen (Session session) {    System.out.println ("WebSocket opened: "+session.getId()); } 

          Session實(shí)例只要WebSocket未關(guān)閉就會(huì)一直有效Session類中包含了許多有意思的方法,以允許開發(fā)者獲取更多關(guān)于的信息

          同時(shí),Session 也包含了應(yīng)用程序特有的數(shù)據(jù)鉤子,即通過getUserProperties() 方法來返回 Map<String, Object>

          這允許開發(fā)者可以使用session-和需要在多個(gè)方法調(diào)用間共享的應(yīng)用程序特定信息來填充Session實(shí)例.

          i當(dāng)WebSocket端收到消息時(shí),將會(huì)調(diào)用以@OnMessage注解的方法.以@OnMessage 注解的方法可包含下面的參數(shù):

          • javax.websocket.Session 參數(shù).
          • 0個(gè)或多個(gè)以 @PathParam注解的字符串參數(shù),指的是端點(diǎn)路徑的path參數(shù)
          • 消息本身. 下面有可能消息類型描述.

          當(dāng)其它端發(fā)送了文本消息時(shí),下面的代碼片斷會(huì)打印消息內(nèi)容:

          @OnMessage public void myOnMessage (String txt) {    System.out.println ("WebSocket received message: "+txt); }  

          如果以@OnMessage i注解的方法返回值不是void, WebSocket實(shí)現(xiàn)會(huì)將返回值發(fā)送給其它端點(diǎn).下面的代碼片斷會(huì)將收到的文本消息以首字母大寫的形式發(fā)回給發(fā)送者:

          @OnMessage public String myOnMessage (String txt) {    return txt.toUpperCase(); }  

          另一種通過WebSocket連接來發(fā)送消息的代碼如下:

          RemoteEndpoint.Basic other = session.getBasicRemote(); other.sendText ("Hello, world"); 

          在這種方式中,我們從Session 對(duì)象開始,它可以從生命周期回調(diào)方法中獲取(例如,以 @OnOpen注解的方法).session實(shí)例上getBasicRemote() 方法返回的是WebSocket其它部分的代表RemoteEndpointRemoteEndpoint 實(shí)例可用于發(fā)送文本或其它類型的消息,后面有描述.

          當(dāng)關(guān)閉WebSocket連接時(shí),將會(huì)調(diào)用@OnClose 注解的方法。此方法接受下面的參數(shù):

          • javax.websocket.Session 參數(shù). 注意,一旦WebSocket真正關(guān)閉了,此參數(shù)就不能被使用了,這通常發(fā)生在@OnClose 注解方法返回之后.
          • javax.websocket.CloseReason 參數(shù),用于描述關(guān)閉WebSocket的原因,如:正常關(guān)閉,協(xié)議錯(cuò)誤,服務(wù)過載等等.
          • 0個(gè)或多個(gè)以 @PathParam注解的字符串參數(shù),指的是端點(diǎn)路徑的path參數(shù)

          下面的代碼片段打印了WebSocket關(guān)閉的原因:

          @OnClose public void myOnClose (CloseReason reason) {    System.out.prinlnt ("Closing a WebSocket due to "+reason.getReasonPhrase()); } 

          完整情況下,這里還有一個(gè)生命周期注解:如果收到了錯(cuò)誤,將會(huì)調(diào)用 @OnError 注解的方法。

          Interface-Driven 方式

          annotation-driven 方式允許我們注解一個(gè)Java類,以及使用生命周期注解來注解方法. 

          使用interface-driven方式,開發(fā)者可繼承javax.websocket.Endpoint 并覆蓋其中的onOpenonClose, 以及onError 方法:

          public class myOwnEndpoint extends javax.websocket.Endpoint {    public void onOpen(Session session, EndpointConfig config) {...}    public void onClose(Session session, CloseReason closeReason) {...}    public void onError (Session session, Throwable throwable) {...} } 

          為了攔截消息,需要在onOpen實(shí)現(xiàn)中注冊(cè)一個(gè)javax.websocket.MessageHandler:

          public void onOpen (Session session, EndpointConfig config) {    session.addMessageHandler (new MessageHandler() {...}); } 

          MessageHandler 接口有兩個(gè)子接口: MessageHandler.Partial和 MessageHandler.Whole

          MessageHandler.Partial 接口應(yīng)該用于當(dāng)開發(fā)者想要收到部分消息通知的時(shí)候,MessageHandler.Whole的實(shí)現(xiàn)應(yīng)該用于整個(gè)消息到達(dá)通知

          下面的代碼片斷會(huì)監(jiān)聽進(jìn)來的文件消息,并將文本信息轉(zhuǎn)換為大小版本后發(fā)回給其它端點(diǎn):

          public void onOpen (Session session, EndpointConfig config) {    final RemoteEndpoint.Basic remote = session.getBasicRemote();    session.addMessageHandler (new MessageHandler.Whole<String>() {       public void onMessage(String text) {                  try {                      remote.sendString(text.toUpperCase());                  } catch (IOException ioe) {                      // handle send failure here                  }              }     }); } 

          消息類型,編碼器,解碼器

          WebSocket的JavaAPI非常強(qiáng)大,因?yàn)樗试S發(fā)送任或接收任何對(duì)象作為WebSocket消息.

          基本上,有三種不同類型的消息:

          • 基于文本的消息
          • 二進(jìn)制消息
          • Pong 消息,它是WebSocket連接自身

          當(dāng)使用interface-driven模式,每個(gè)session最多只能為這三個(gè)不同類型的消息注冊(cè)一個(gè)MessageHandler.

          當(dāng)使用annotation-driven模式,針對(duì)不同類型的消息,只允許出現(xiàn)一個(gè)@onMessage 注解方法. 在注解方法中,消息內(nèi)容中允許的參數(shù)依賴于消息類型。

          Javadoc for the @OnMessage annotation 明確指定了消息類型上允許出現(xiàn)的消息參數(shù):

          • "如果方法用于處理文本消息: 

            • String 用于接收整個(gè)消息
            • Java 原型或等價(jià)的類用于接收整個(gè)消息并將其轉(zhuǎn)換為此類型
            • String 和 boolean 對(duì)用于部分接收消息
            • Reader 用于以阻塞流的方式接收整個(gè)消息
            • 端點(diǎn)的任何對(duì)象參數(shù)存在文本解碼器 (Decoder.Text 或 Decoder.TextStream).
          • 如果方法用于處理二進(jìn)制消息: 

            • byte[] 或 ByteBuffer 用于接收整個(gè)消息
            • byte[] 和 boolean 對(duì), 或者 ByteBuffer 和boolean對(duì)用于部分接收消息
            • InputStream 用于按阻塞流的方式接收整個(gè)消息
            • 端點(diǎn)的任何對(duì)象參數(shù)存在二進(jìn)制解碼器(Decoder.Binary or Decoder.BinaryStream).
          • 如果方法是用于處理pong消息: 

          任何Java對(duì)象使用編碼器都可以編碼為基于文本或二進(jìn)制的消息.這種基于文本或二進(jìn)制的消息將轉(zhuǎn)輸?shù)狡渌它c(diǎn),在其它端點(diǎn),它可以解碼成Java對(duì)象-或者被另外的WebSocket 包解釋. 

          通常情況下,XML或JSON用于來傳送WebSocket消息, 編碼/解碼然后會(huì)將Java對(duì)象編組成XML或JSON并在另一端解碼為Java對(duì)象.

          encoder是以javax.websocket.Encoder 接口的實(shí)現(xiàn)來定義,decoder是以javax.websocket.Decoder 接口的實(shí)現(xiàn)來定義的. 

          有時(shí),端點(diǎn)實(shí)例必須知道encoders和decoders是什么.使用annotation-driven方式, 可向@ClientEndpoint 和 @ServerEndpoint l注解中的encode和decoder元素傳遞 encoders和decoders的列表。

          Listing 1 中的代碼展示了如何注冊(cè)一個(gè) MessageEncoder 類(它定義了MyJavaObject實(shí)例到文本消息的轉(zhuǎn)換). MessageDecoder 是以相反的轉(zhuǎn)換來注冊(cè)的.

          @ServerEndpoint(value="/endpoint", encoders = MessageEncoder.class, decoders= MessageDecoder.class) public class MyEndpoint { ... }  class MessageEncoder implements Encoder.Text<MyJavaObject> {    @override    public String encode(MyJavaObject obj) throws EncodingException {       ...    } }  class MessageDecoder implements Decoder.Text<MyJavaObject> {    @override     public MyJavaObject decode (String src) throws DecodeException {       ...    }     @override     public boolean willDecode (String src) {       // return true if we want to decode this String into a MyJavaObject instance    } } 

          Listing 1

          Encoder 接口有多個(gè)子接口:

          • Encoder.Text 用于將Java對(duì)象轉(zhuǎn)成文本消息
          • Encoder.TextStream 用于將Java對(duì)象添加到字符流中
          • Encoder.Binary 用于將Java對(duì)象轉(zhuǎn)換成二進(jìn)制消息
          • Encoder.BinaryStream 用于將Java對(duì)象添加到二進(jìn)制流中

          類似地,Decoder 接口有四個(gè)子接口:

          • Decoder.Text 用于將文本消息轉(zhuǎn)換成Java對(duì)象
          • Decoder.TextStream 用于從字符流中讀取Java對(duì)象
          • Decoder.Binary 用于將二進(jìn)制消息轉(zhuǎn)換成Java對(duì)象
          • Decoder.BinaryStream 用于從二進(jìn)制流中讀取Java對(duì)象

          結(jié)論

          WebSocket Java API為Java開發(fā)者提供了標(biāo)準(zhǔn)API來集成IETF WebSocket標(biāo)準(zhǔn).通過這樣做,Web 客戶端或本地客戶端可使用任何WebSocket實(shí)現(xiàn)來輕易地與Java后端通信。

          Java Api是高度可配置的,靈活的,它允許java開發(fā)者使用他們喜歡的模式。

          也可參考

          posted @ 2016-07-24 01:35 胡小軍 閱讀(2774) | 評(píng)論 (0)編輯 收藏
               摘要: Servlets定義為JSR 340,可以下載完整規(guī)范.servlet是托管于servlet容器中的web組件,并可生成動(dòng)態(tài)內(nèi)容.web clients可使用請(qǐng)求/響應(yīng)模式同servlet交互. servlet容器負(fù)責(zé)處理servlet的生命周期事件,接收請(qǐng)求和發(fā)送響應(yīng),以及執(zhí)行其它必要的編碼/解碼部分.WebServlet它是在POJO上使用@WebServlet注...  閱讀全文
          posted @ 2016-07-24 01:32 胡小軍 閱讀(866) | 評(píng)論 (0)編輯 收藏
          主站蜘蛛池模板: 拉孜县| 比如县| 囊谦县| 宁海县| 乌拉特中旗| 滨州市| 桐庐县| 修文县| 含山县| 陇南市| 德化县| 新邵县| 田林县| 自治县| 绿春县| 沽源县| 南平市| 东阳市| 明溪县| 鄄城县| 新密市| 清流县| 肃宁县| 江孜县| 鹤壁市| 潜山县| 肥东县| 柘城县| 柳林县| 津南区| 沅江市| 关岭| 改则县| 永定县| 共和县| 上饶市| 光山县| 洪雅县| 台安县| 东乌珠穆沁旗| 左贡县|