agapple

          BlogJava 首頁(yè) 新隨筆 聯(lián)系 聚合 管理
            13 Posts :: 1 Stories :: 1 Comments :: 0 Trackbacks

          #

               摘要: 背景     前段時(shí)間在工作中,包括一些代碼閱讀過(guò)程中,spring aop經(jīng)常性的會(huì)看到cglib中的相關(guān)內(nèi)容,包括BeanCopier,BulkBean,Enancher等內(nèi)容,以前雖大致知道一些內(nèi)容,原理是通過(guò)bytecode,但沒(méi)具體深入代碼研究,只知其所用不知其所以然,所以就特地花了半天多的工作時(shí)間研究了CGLIB的相關(guān)源碼,同時(shí)結(jié)合看了下 spring ...  閱讀全文
          posted @ 2010-11-01 22:24 agapple 閱讀(1319) | 評(píng)論 (0)編輯 收藏

             最近在做offerdetail優(yōu)化時(shí),替換了數(shù)據(jù)庫(kù)驅(qū)動(dòng),從c3p0 0.9.1 -> dbcp 1.4,順便研究了下dbcp的自動(dòng)重連的一套機(jī)制,也做一下分享,大家周知一下。

           

          數(shù)據(jù)庫(kù)鏈接 常見(jiàn)的問(wèn)題:

          1. 數(shù)據(jù)庫(kù)意外重啟后,原先的數(shù)據(jù)庫(kù)連接池能自動(dòng)廢棄老的無(wú)用的鏈接,建立新的數(shù)據(jù)庫(kù)鏈接

          2. 網(wǎng)絡(luò)異常中斷后,原先的建立的tcp鏈接,應(yīng)該能進(jìn)行自動(dòng)切換。比如網(wǎng)站演習(xí)中的交換機(jī)重啟會(huì)導(dǎo)致網(wǎng)絡(luò)瞬斷

          3. 分布式數(shù)據(jù)庫(kù)中間件,比如cobar會(huì)定時(shí)的將空閑鏈接異常關(guān)閉,客戶(hù)端會(huì)出現(xiàn)半開(kāi)的空閑鏈接。

           

          大致思考解決思路:

          1.      sql心跳檢查(主動(dòng)式)

          2.      拿鏈接嘗試一下,發(fā)現(xiàn)處理失敗丟棄鏈接,探雷的請(qǐng)求會(huì)失敗幾個(gè) (犧牲小我,完成大我的精神)

          3.      設(shè)置合理的空閑鏈接的超時(shí)時(shí)間,避免半開(kāi)鏈接(懶模式,解決半開(kāi)鏈接)

           

           

          下面我們來(lái)看看,在dbcp中是如何實(shí)現(xiàn)。

          sql心跳檢查

          sql validate配置

          <property name="testWhileIdle"><value>true</value></property>

          <property name="testOnBorrow"><value>false</value></property>

          <property name="testOnReturn"><value>false</value></property>

          <property name="validationQuery"><value>select sysdate from dual</value></property>

          <property name="validationQueryTimeout"><value>1</value></property>

          <property name="timeBetweenEvictionRunsMillis"><value>30000</value></property>

          <property name="numTestsPerEvictionRun"><value>16</value></property>

          參數(shù)說(shuō)明

            

             dbcp是采用了commons-pool做為其連接池管理,testOnBorrow,testOnReturn, testWhileIdlepool是提供的幾種校驗(yàn)機(jī)制,通過(guò)外部鉤子的方式回調(diào)dbcp的相關(guān)數(shù)據(jù)庫(kù)鏈接(validationQuery)校驗(yàn), dbcp相關(guān)外部鉤子類(lèi):PoolableConnectionFactory,繼承于common-pool PoolableObjectFactory , dbcp通過(guò)GenericObjectPool這一入口,進(jìn)行連接池的borrow,return處理。

          具體參數(shù)描述:

             1. testOnBorrow : 顧明思義,就是在進(jìn)行borrowObject進(jìn)行處理時(shí),對(duì)拿到的connection進(jìn)行validateObject校驗(yàn)

             2. testOnReturn : 顧明思義,就是在進(jìn)行returnObject對(duì)返回的connection進(jìn)行validateObject校驗(yàn),個(gè)人覺(jué)得對(duì)數(shù)據(jù)庫(kù)連接池的管理意義不大

             3. testWhileIdle : 關(guān)注的重點(diǎn),GenericObjectPool中針對(duì)pool管理,起了一個(gè)異步Evict的TimerTask定時(shí)線程進(jìn)行控制(可通過(guò)設(shè)置參數(shù) timeBetweenEvictionRunsMillis>0),定時(shí)對(duì)線程池中的鏈接進(jìn)行validateObject校驗(yàn),對(duì)無(wú)效的鏈接進(jìn)行關(guān)閉后,會(huì)調(diào)用ensureMinIdle,適當(dāng)建立鏈接保證最小的minIdle連接數(shù)。

             4. timeBetweenEvictionRunsMillis,設(shè)置的Evict線程的時(shí)間,單位ms,大于0才會(huì)開(kāi)啟evict檢查線程

             5. validateQuery, 代表檢查的sql

             6. validateQueryTimeout, 代表在執(zhí)行檢查時(shí),通過(guò)statement設(shè)置,statement.setQueryTimeout(validationQueryTimeout)

             7. numTestsPerEvictionRun,代表每次檢查鏈接的數(shù)量,建議設(shè)置和maxActive一樣大,這樣每次可以有效檢查所有的鏈接.

          Sql心跳檢查幾點(diǎn)思考:

          1.性能問(wèn)題。

          目前網(wǎng)站的應(yīng)用大部分的瓶頸還是在I/O這一塊,大部分的I/O還是在數(shù)據(jù)庫(kù)的這一層面上,每一個(gè)請(qǐng)求可能會(huì)調(diào)用10來(lái)次SQL查詢(xún),如果不走事務(wù),一個(gè)請(qǐng)求會(huì)重復(fù)獲取鏈接,如果每次獲取鏈接,比如在testOnBorrow都進(jìn)行validateObject,性能開(kāi)銷(xiāo)不是很能接受,可以假定一次SQL操作消毫0.5~1ms(一般走了網(wǎng)絡(luò)請(qǐng)求基本就這數(shù))

          2.成本和收益

          網(wǎng)站異常數(shù)據(jù)庫(kù)重啟,網(wǎng)絡(luò)異常斷開(kāi)的頻率是非常低的,一般也就在數(shù)據(jù)庫(kù)升級(jí),演習(xí)維護(hù)時(shí)才會(huì)進(jìn)行,而且一般也是選在晚上,訪問(wèn)量相對(duì)比較低的請(qǐng)求,而且一般會(huì)有人員值班關(guān)注,所以異步的validateObject是可以接受,但一個(gè)前提需要確保能保證在一個(gè)合理的時(shí)間段內(nèi),數(shù)據(jù)庫(kù)能完成自動(dòng)重聯(lián)。

           

          請(qǐng)求探雷

          相關(guān)配置

          dbcp自身默認(rèn)支持,不需要配置

          原理描述

          common-pools通過(guò)borrowObject , returnObject完成連接的獲取和釋放,正常的情況是一次請(qǐng)求中borrow和return是一對(duì)的,有借就有還。

          但在準(zhǔn)備returnObject時(shí),dbcp會(huì)做一件事,就是看看這個(gè)object是否已經(jīng)是壞了的,如果壞了就直接丟了,就直接給丟棄了。

           

          代碼層面:

          1. 在dbcp中PoolingDataSource(實(shí)現(xiàn)DataSource接口)調(diào)用 PoolableConnection(dbcp connnection相關(guān)的pool delegate操作)進(jìn)行相應(yīng)關(guān)閉時(shí),會(huì)檢查_conn.isClosed(),針對(duì)DataSource如果isClosed返回為 true的則不調(diào)用returnObject,直接丟棄了鏈接。

          2. _conn.isClosed()是否保險(xiǎn),從jdk的api描述中: A connection is closed if the method close has been called on it or if certain fatal errors have occurred. 里面提供兩種情況,一種就是被調(diào)用了closed方法,另一種就是出現(xiàn)一些異常,說(shuō)的比較含糊。

           

          空閑鏈接檢查

          相關(guān)配置

          <property name="minEvictableIdleTimeMillis"><value>18000000</value></property>

          <property name="removeAbandoned"><value>true</value></property> 

          <property name="removeAbandonedTimeout"><value>180</value></property>

          參數(shù)說(shuō)明

          1.minEvictableIdleTimeMillis dbcp默認(rèn)是30分,需要開(kāi)啟異步線程Evict,否則不生效。原理很簡(jiǎn)單,就是通過(guò)一個(gè)異步線程,每次檢查connnection上一次使用的時(shí)間戳,看看是否已經(jīng)超過(guò)這個(gè)timeout時(shí)間設(shè)置。

          2. removeAbandoned , removeAbandonedTimeout,主要是用于在出現(xiàn)鏈接緊張時(shí)候,會(huì)掃描一些鏈接未超過(guò)removeAbandonedTimeout時(shí)間還未被釋放,會(huì)主動(dòng)的關(guān)閉該鏈接。

          適用情況

          1. 我們使用的cobar后端會(huì)有定時(shí)關(guān)閉空閑鏈接的操作,默認(rèn)的空閑鏈接timeout時(shí)間為1小時(shí),和其他oracle , mysql各不相同,所以設(shè)置好這個(gè)空閑鏈接的timeout時(shí)間還是挺重要.

           

          2. 一般會(huì)是幾種情況出現(xiàn)需要removeAbandoned: 

          * 代碼未在finally釋放connection , 不過(guò)我們都用sqlmapClientTemplate,底層都有鏈接釋放的過(guò)程

          * 遇到數(shù)據(jù)庫(kù)死鎖。以前遇到過(guò)后端存儲(chǔ)過(guò)程做了鎖表操作,導(dǎo)致前臺(tái)集群中連接池全都被block住,后續(xù)的業(yè)務(wù)處理因?yàn)槟貌坏芥溄铀卸继幚硎×恕?/span>

           

           

          聊聊c3p0配置

          還有我們配置的c3p0所謂的自動(dòng)重連的3個(gè)參數(shù),

          <prop key="acquireRetryAttempts">30</prop>

              <prop key="acquireRetryDelay">1000</prop>

              <prop key="breakAfterAcquireFailure">false</prop>

           

          個(gè)人覺(jué)得就是一個(gè)誤導(dǎo),這幾個(gè)配置只是在從連接池獲取鏈接時(shí),獲取失敗多嘗試幾次,因?yàn)槲覀儚膒ool從獲取鏈接最多只會(huì)等待固定timeout時(shí)間。

          如果要達(dá)到自動(dòng)重連的效果,必須要c3p0支持請(qǐng)求探雷或者是sql心跳檢查功能,能自動(dòng)的剔除無(wú)效的鏈接?!?/span>

          可見(jiàn)c3p0官方文檔描述:http://www.mchange.com/projects/c3p0/index.html#configuring_recovery

           

          最后:

          Dbcp將是我們以后數(shù)據(jù)庫(kù)驅(qū)動(dòng)選擇的趨勢(shì),最后我們?nèi)绾芜x擇如何自動(dòng)重連,這個(gè)也得根據(jù)我們的應(yīng)用場(chǎng)景而定。比如只讀的web系統(tǒng),后臺(tái)業(yè)務(wù)系統(tǒng),任務(wù)系統(tǒng)可能處理方式就不同。

          只讀Web系統(tǒng):可采取請(qǐng)求探雷的策略,也就失敗連接池個(gè)數(shù)的請(qǐng)求,失敗了頁(yè)面刷新一次就好。

          后臺(tái)業(yè)務(wù)系統(tǒng):一般業(yè)務(wù)都涉及數(shù)據(jù)庫(kù)的寫(xiě)操作,很多數(shù)據(jù)不可重入,一次處理失敗后就只能靠手工干預(yù)處理。這時(shí)候得考慮是否需要使用sql心跳檢查,比如testOnBorrow或者testWhileIdle.

          posted @ 2010-10-23 01:01 agapple 閱讀(961) | 評(píng)論 (0)編輯 收藏

               摘要:   閱讀全文
          posted @ 2009-02-15 21:47 agapple 閱讀(6400) | 評(píng)論 (1)編輯 收藏

          1. 下載rsync  (http://rsync.samba.org/)

          安裝:
          ./configure
          make
          make install

          2. 開(kāi)啟rsync服務(wù),修改/etc/xinetd.d/rsync
          disable = no # replace <yes>
          重啟xinetd 服務(wù)
          service xinetd restart


          3. 配置server端,/etc/rsyncd.conf
          # touch rsyncd.conf
          # vi rsyncd.conf
          uid = ljh  #表示以什么用戶(hù)運(yùn)行,注意必須確保該用戶(hù)有對(duì)模塊的讀寫(xiě)權(quán)限
          gid = ljh
          use chroot = false
          max connectionts = 6
          read only = no
          pid file = /home/ljh/server/rsync/rsynnd.pid
          lock file = /home/ljh/server/rsync/rsyncd.lock
          log file = /home/ljh/server/rsync/rsyncd.log
          [test]
          comment = test
          path = /home/ljh/server/rsync/data/test
          ignore error
          list = true
          #auth users = ljh
          #secrets file = /home/ljh/server/rsync/passwd/rsyncd.passwd

           

          配置參數(shù)介紹
          comment
          給模塊指定一個(gè)描述,該描述連同模塊名在客戶(hù)連接得到模塊列表時(shí)顯示給客戶(hù)。默認(rèn)沒(méi)有描述定義。
          path
          指定該模塊的供備份的目錄樹(shù)路徑,該參數(shù)是必須指定的。
          use chroot
          如 果"use chroot"指定為true,那么rsync在傳輸文件以前首先chroot到path參數(shù)所指定的目錄下。這樣做的原因是實(shí)現(xiàn)額外的安全防護(hù),但是缺點(diǎn)是需要以roots權(quán)限,并且不能備份指向外部的符號(hào)連接所指向的目錄文件。默認(rèn)情況下chroot值為true。
          uid
          該選項(xiàng)指定當(dāng)該模塊傳輸文件時(shí)守護(hù)進(jìn)程應(yīng)該具有的uid,配合gid選項(xiàng)使用可以確定哪些可以訪問(wèn)怎么樣的文件權(quán)限,默認(rèn)值是"nobody"。
          gid
          該選項(xiàng)指定當(dāng)該模塊傳輸文件時(shí)守護(hù)進(jìn)程應(yīng)該具有的gid。默認(rèn)值為"nobody"。
          max connections
          指定該模塊的最大并發(fā)連接數(shù)量以保護(hù)服務(wù)器,超過(guò)限制的連接請(qǐng)求將被告知隨后再試。默認(rèn)值是0,也就是沒(méi)有限制。
          list
          該選項(xiàng)設(shè)定當(dāng)客戶(hù)請(qǐng)求可以使用的模塊列表時(shí),該模塊是否應(yīng)該被列出。如果設(shè)置該選項(xiàng)為false,可以創(chuàng)建隱藏的模塊。默認(rèn)值是true。
          read only
          該選項(xiàng)設(shè)定是否允許客戶(hù)上載文件。如果為true那么任何上載請(qǐng)求都會(huì)失敗,如果為false并且服務(wù)器目錄讀寫(xiě)權(quán)限允許那么上載是允許的。默認(rèn)值為true。
          exclude
          用 來(lái)指定多個(gè)由空格隔開(kāi)的多個(gè)文件或目錄(相對(duì)路徑),并將其添加到exclude列表中。這等同于在客戶(hù)端命令中使用--exclude來(lái)指定模式,一個(gè) 模塊只能指定一個(gè)exclude選項(xiàng)。但是需要注意的一點(diǎn)是該選項(xiàng)有一定的安全性問(wèn)題,客戶(hù)很有可能繞過(guò)exclude列表,如果希望確保特定的文件不能 被訪問(wèn),那就最好結(jié)合uid/gid選項(xiàng)一起使用。
          exclude from [file]
          指定一個(gè)包含exclude模式的定義的文件名,服務(wù)器從該文件中讀取exclude列表定義。
          include
          用來(lái)指定不排除符合要求的文件或目錄。這等同于在客戶(hù)端命令中使用--include來(lái)指定模式,結(jié)合include和exclude可以定義復(fù)雜的exclude/include規(guī)則。
          include from [file]
          指定一個(gè)包含include模式的定義的文件名,服務(wù)器從該文件中讀取include列表定義。
          auth users
          該選項(xiàng)指定由空格或逗號(hào)分隔的用戶(hù)名列表,只有這些用戶(hù)才允許連接該模塊。這里的用戶(hù)和系統(tǒng)用戶(hù)沒(méi)有任何關(guān)系。如果"auth users"被設(shè)置,那么客戶(hù)端發(fā)出對(duì)該模塊的連接請(qǐng)求以后會(huì)被rsync請(qǐng)求challenged進(jìn)行驗(yàn)證身份這里使用的 challenge/response認(rèn)證協(xié)議。用戶(hù)的名和密碼以明文方式存放在"secrets file"選項(xiàng)指定的文件中。默認(rèn)情況下無(wú)需密碼就可以連接模塊(也就是匿名方式)。
          secrets file
          該選項(xiàng)指定一個(gè)包含定義用戶(hù)名:密碼對(duì)的文件。只有在"auth users"被定義時(shí),該文件才有作用。文件每行包含一個(gè)username:passwd對(duì)。一般來(lái)說(shuō)密碼最好不要超過(guò)8個(gè)字符。沒(méi)有默認(rèn)的 secures file名,需要限式指定一個(gè)(例如:/etc/rsyncd.passwd)。注意:該文件的權(quán)限一定要是600,否則客戶(hù)端將不能連接服務(wù)器
          strict modes
          該選項(xiàng)指定是否監(jiān)測(cè)密碼文件的權(quán)限,如果該選項(xiàng)值為true那么密碼文件只能被rsync服務(wù)器運(yùn)行身份的用戶(hù)訪問(wèn),其他任何用戶(hù)不可以訪問(wèn)該文件。默認(rèn)值為true。
          hosts allow
          該選項(xiàng)指定哪些IP的客戶(hù)允許連接該模塊。客戶(hù)模式定義可以是以下形式:?jiǎn)蝹€(gè)IP地址,例如:192.167.0.1
          hosts deny
          指定不允許連接rsync服務(wù)器的機(jī)器,可以使用hosts allow的定義方式來(lái)進(jìn)行定義。默認(rèn)是沒(méi)有hosts deny定義。
          ignore errors
          指定rsyncd在判斷是否運(yùn)行傳輸時(shí)的刪除操作時(shí)忽略server上的IO錯(cuò)誤,一般來(lái)說(shuō)rsync在出現(xiàn)IO錯(cuò)誤時(shí)將將跳過(guò)--delete操作,以防止因?yàn)闀簳r(shí)的資源不足或其它IO錯(cuò)誤導(dǎo)致的嚴(yán)重問(wèn)題。
          lock file
          指定支持max connections參數(shù)的鎖文件,默認(rèn)值是/var/run/rsyncd.lock。
          timeout
          通過(guò)該選項(xiàng)可以覆蓋客戶(hù)指定的IP超時(shí)時(shí)間。通過(guò)該選項(xiàng)可以確保rsync服務(wù)器不會(huì)永遠(yuǎn)等待一個(gè)崩潰的客戶(hù)端。超時(shí)單位為秒鐘,0表示沒(méi)有超時(shí)定義,這也是默認(rèn)值。對(duì)于匿名rsync服務(wù)器來(lái)說(shuō),一個(gè)理想的數(shù)字是600。
          dont compress
          用來(lái)指定那些不進(jìn)行壓縮處理再傳輸?shù)奈募J(rèn)值是*.gz *.tgz *.zip *.z *.rpm *.deb *.iso *.bz2 *.tbz

           

          4. 客戶(hù)端配置
          訪問(wèn)remote rsync列表
          rsync rsync://10.0.64.162/test
          簡(jiǎn)單的執(zhí)行同步命令
          sync -auv --delete --password-file=/home/admin2/soft/rsync/passwd/rsyncd.passwd ~/rysnc/* ljh@10.0.64.162::test

          比較實(shí)際的例子:
          echo "hello" > /tmp/password.txt ;chmod 600 /tmp/password.txt
          cp /home/ewalletbops/fatrix/crm/* /home/ewalletbops/fatrix/putxml/search
          rsync -azv /home/ewalletbops/bops-daemon/bin/adxml/search/ /home/ewalletbops/fatrix/putxml/search
          rsync -auv --delete --password-file=/tmp/password.txt /home/ewalletbops/fatrix/putxml/search yangzhen@127.0.0.1::everest/adxml
          rm /tmp/password.txt


           

          選項(xiàng)說(shuō)明
          -v, --verbose 詳細(xì)模式輸出
          -q, --quiet 精簡(jiǎn)輸出模式
          -c, --checksum 打開(kāi)校驗(yàn)開(kāi)關(guān),強(qiáng)制對(duì)文件傳輸進(jìn)行校驗(yàn)
          -a, --archive 歸檔模式,表示以遞歸方式傳輸文件,并保持所有文件屬性,等于-rlptgoD
          -r, --recursive 對(duì)子目錄以遞歸模式處理
          -R, --relative 使用相對(duì)路徑信息
          -b, --backup 創(chuàng)建備份,也就是對(duì)于目的已經(jīng)存在有同樣的文件名時(shí),將老的文件重新命名為~filename??梢允褂?-suffix選項(xiàng)來(lái)指定不同的備份文件前綴。
          --backup-dir 將備份文件(如~filename)存放在在目錄下。
          -suffix=SUFFIX 定義備份文件前綴
          -u, --update 僅僅進(jìn)行更新,也就是跳過(guò)所有已經(jīng)存在于DST,并且文件時(shí)間晚于要備份的文件。(不覆蓋更新的文件)
          -l, --links 保留軟鏈結(jié)
          -L, --copy-links 想對(duì)待常規(guī)文件一樣處理軟鏈結(jié)
          --copy-unsafe-links 僅僅拷貝指向SRC路徑目錄樹(shù)以外的鏈結(jié)
          --safe-links 忽略指向SRC路徑目錄樹(shù)以外的鏈結(jié)
          -H, --hard-links 保留硬鏈結(jié)
          -p, --perms 保持文件權(quán)限
          -o, --owner 保持文件屬主信息
          -g, --group 保持文件屬組信息
          -D, --devices 保持設(shè)備文件信息
          -t, --times 保持文件時(shí)間信息
          -S, --sparse 對(duì)稀疏文件進(jìn)行特殊處理以節(jié)省DST的空間
          -n, --dry-run現(xiàn)實(shí)哪些文件將被傳輸
          -W, --whole-file 拷貝文件,不進(jìn)行增量檢測(cè)
          -x, --one-file-system 不要跨越文件系統(tǒng)邊界
          -B, --block-size=SIZE 檢驗(yàn)算法使用的塊尺寸,默認(rèn)是700字節(jié)
          -e, --rsh=COMMAND 指定替代rsh的shell程序
          --rsync-path=PATH 指定遠(yuǎn)程服務(wù)器上的rsync命令所在路徑信息
          -C, --cvs-exclude 使用和CVS一樣的方法自動(dòng)忽略文件,用來(lái)排除那些不希望傳輸?shù)奈募?br /> --existing 僅僅更新那些已經(jīng)存在于DST的文件,而不備份那些新創(chuàng)建的文件
          --delete 刪除那些DST中SRC沒(méi)有的文件
          --delete-excluded 同樣刪除接收端那些被該選項(xiàng)指定排除的文件
          --delete-after 傳輸結(jié)束以后再刪除
          --ignore-errors 及時(shí)出現(xiàn)IO錯(cuò)誤也進(jìn)行刪除
          --max-delete=NUM 最多刪除NUM個(gè)文件
          --partial 保留那些因故沒(méi)有完全傳輸?shù)奈募?,以是加快隨后的再次傳輸
          --force 強(qiáng)制刪除目錄,即使不為空
          --numeric-ids 不將數(shù)字的用戶(hù)和組ID匹配為用戶(hù)名和組名
          --timeout=TIME IP超時(shí)時(shí)間,單位為秒
          -I, --ignore-times 不跳過(guò)那些有同樣的時(shí)間和長(zhǎng)度的文件
          --size-only 當(dāng)決定是否要備份文件時(shí),僅僅察看文件大小而不考慮文件時(shí)間
          --modify-window=NUM 決定文件是否時(shí)間相同時(shí)使用的時(shí)間戳窗口,默認(rèn)為0
          -T --temp-dir=DIR 在DIR中創(chuàng)建臨時(shí)文件
          --compare-dest=DIR 同樣比較DIR中的文件來(lái)決定是否需要備份
          -P 等同于 --partial
          --progress 顯示備份過(guò)程
          -z, --compress 對(duì)備份的文件在傳輸時(shí)進(jìn)行壓縮處理
          --exclude=PATTERN 指定排除不需要傳輸?shù)奈募J?br /> --include=PATTERN 指定不排除而需要傳輸?shù)奈募J?br /> --exclude-from=FILE 排除FILE中指定模式的文件
          --include-from=FILE 不排除FILE指定模式匹配的文件
          --version 打印版本信息
          --address 綁定到特定的地址
          --config=FILE 指定其他的配置文件,不使用默認(rèn)的rsyncd.conf文件
          --port=PORT 指定其他的rsync服務(wù)端口
          --blocking-io 對(duì)遠(yuǎn)程shell使用阻塞IO
          --stats 給出某些文件的傳輸狀態(tài)
          --progress 在傳輸時(shí)現(xiàn)實(shí)傳輸過(guò)程
          --log-format=formAT 指定日志文件格式
          --password-file=FILE 從FILE中得到密碼
          --bwlimit=KBPS 限制I/O帶寬,KBytes per second
          -h, --help 顯示幫助信息

           

           

           

           

           

           

           

           

           

          posted @ 2009-01-14 14:12 agapple 閱讀(742) | 評(píng)論 (0)編輯 收藏

               摘要:   閱讀全文
          posted @ 2008-11-07 20:48 agapple 閱讀(2605) | 評(píng)論 (0)編輯 收藏

               摘要:   閱讀全文
          posted @ 2008-11-03 20:13 agapple 閱讀(428) | 評(píng)論 (0)編輯 收藏

          Tip1

          1.在 JAVA_HOME/jre/lib/fonts/ 下建立個(gè)目錄 fallback
          2.在 fallback 里弄個(gè)中文字體最簡(jiǎn)單ln一下就好了
          比如:

          ln -s /usr/share/fonts/truetype/arphic/uming.ttf  $JAVA_HOME/jre/lib/fonts/fallback/

          Tip2

          問(wèn)題描述:Java 應(yīng)用程序的中文無(wú)法顯示,呈現(xiàn)方塊狀。

            原因分析:Java 應(yīng)用程序無(wú)法找到可供顯示中文的字體。

            解決方案:首先,確保系統(tǒng)里安裝了 JDK 1.5.0_06,如果安裝的是 JRE 1.5.0_06,那么卸掉 JRE,再安裝 JDK。然后下載 fireflysung 1.3.0, 解壓后將其中的 ttf 文件丟到系統(tǒng)字體目錄/usr/share/fonts,再用 fc-cache -f -v 跑一遍,讓系統(tǒng)知道這個(gè)字體。最后,就是轉(zhuǎn)到 JDK 安裝目錄的jre/lib/fonts 中,使用下面的命令來(lái)完成。

            mkdir fallback
            cd fallback
            ln -s /usr/share/fonts/fireflysung.ttf
            mkfontdir
            mkfontscale
          posted @ 2008-10-31 16:31 agapple 閱讀(471) | 評(píng)論 (0)編輯 收藏

          由于用戶(hù)在UNIX下經(jīng)常會(huì)遇到SUID、SGID的概念,而且SUID和SGID涉及到系統(tǒng)安全,所以用戶(hù)也比較關(guān)心這個(gè)問(wèn)題。關(guān)于 SUID、SGID的問(wèn)題也經(jīng)常有人提問(wèn),但回答的人一般答得不夠詳細(xì),加上曾經(jīng)回答過(guò)兩個(gè)網(wǎng)友的問(wèn)題,還查了一些資料,決定整理成本文,以供大家參考。 限于本人的水平問(wèn)題,文章中如果有不當(dāng)之處,請(qǐng)廣大網(wǎng)友指正。

            一、UNIX下關(guān)于文件權(quán)限的表示方法和解析

            SUID 是 Set User ID, SGID 是 Set Group ID的意思。

            UNIX下可以用ls -l 命令來(lái)看到文件的權(quán)限。用ls命令所得到的表示法的格式是類(lèi)似這樣的:-rwxr-xr-x 。下面解析一下格式所表示的意思。這種表示方法一共有十位:

            9 8 7 6 5 4 3 2 1 0

            - r w x r - x r - x

            第9位表示文件類(lèi)型,可以為p、d、l、s、c、b和-:

            p表示命名管道文件

            d表示目錄文件

            l表示符號(hào)連接文件

            -表示普通文件

            s表示socket文件

            c表示字符設(shè)備文件

            b表示塊設(shè)備文件

            第8-6位、5-3位、2-0位分別表示文件所有者的權(quán)限,同組用戶(hù)的權(quán)限,其他用戶(hù)的權(quán)限,其形式為rwx:

            r表示可讀,可以讀出文件的內(nèi)容

            w表示可寫(xiě),可以修改文件的內(nèi)容

            x表示可執(zhí)行,可運(yùn)行這個(gè)程序

            沒(méi)有權(quán)限的位置用-表示

            例子:

            ls -l myfile顯示為:

            rwxr-x-- 1 foo staff 7734 Apr 05 17:07 myfile

            表示文件myfile是普通文件,文件的所有者是foo用戶(hù),而foo用戶(hù)屬于staff組,文件只有1個(gè)硬連接,長(zhǎng)度是7734個(gè)字節(jié),最后修改時(shí)間4月5日17:07。

            所有者foo對(duì)文件有讀寫(xiě)執(zhí)行權(quán)限,staff組的成員對(duì)文件有讀和執(zhí)行權(quán)限,其他的用戶(hù)對(duì)這個(gè)文件沒(méi)有權(quán)限。

            如果一個(gè)文件被設(shè)置了SUID或SGID位,會(huì)分別表現(xiàn)在所有者或同組用戶(hù)的權(quán)限的可執(zhí)行位上。例如:

            1、-rwsr-xr-x 表示SUID和所有者權(quán)限中可執(zhí)行位被設(shè)置

            2、rwSrr- 表示SUID被設(shè)置,但所有者權(quán)限中可執(zhí)行位沒(méi)有被設(shè)置

            3、-rwxr-sr-x 表示SGID和同組用戶(hù)權(quán)限中可執(zhí)行位被設(shè)置

            4、rw-r-Sr- 表示SGID被設(shè)置,但同組用戶(hù)權(quán)限中可執(zhí)行位沒(méi)有被社

            其實(shí)在UNIX的實(shí)現(xiàn)中,文件權(quán)限用12個(gè)二進(jìn)制位表示,如果該位置上的值是

            1,表示有相應(yīng)的權(quán)限:

            11 10 9 8 7 6 5 4 3 2 1 0

            S G T r w x r w x r w x

            第11位為SUID位,第10位為SGID位,第9位為sticky位,第8-0位對(duì)應(yīng)于上面的三組rwx位。

            11 10 9 8 7 6 5 4 3 2 1 0

            上面的-rwsr-xr-x的值為: 1 0 0 1 1 1 1 0 1 1 0 1

            rw-r-Sr-的值為: 0 1 0 1 1 0 1 0 0 1 0 0

            給文件加SUID和SUID的命令如下:

            chmod u+s filename 設(shè)置SUID位

            chmod u-s filename 去掉SUID設(shè)置

            chmod g+s filename 設(shè)置SGID位

            chmod g-s filename 去掉SGID設(shè)置

            另外一種方法是chmod命令用八進(jìn)制表示方法的設(shè)置。如果明白了前面的12位權(quán)限表示法也很簡(jiǎn)單。

            二、SUID和SGID的詳細(xì)解析

            由于SUID和SGID是在執(zhí)行程序(程序的可執(zhí)行位被設(shè)置)時(shí)起作用,而可執(zhí)行位只對(duì)普通文件和目錄文件有意義,所以設(shè)置其他種類(lèi)文件的SUID和SGID位是沒(méi)有多大意義的。

            首先講普通文件的SUID和SGID的作用。例子:

            如果普通文件myfile是屬于foo用戶(hù)的,是可執(zhí)行的,現(xiàn)在沒(méi)設(shè)SUID位,ls命令顯示如下:

            -rwxr-xr-x 1 foo staff 7734 Apr 05 17:07 myfile任何用戶(hù)都可以執(zhí)行這個(gè)程序。UNIX的內(nèi)核是根據(jù)什么來(lái)確定一個(gè)進(jìn)程對(duì)資源的訪問(wèn)權(quán)限的呢?是這個(gè)進(jìn)程的運(yùn)行用戶(hù)的(有效)ID,包括 user id和group id。用戶(hù)可以用id命令來(lái)查到自己的或其他用戶(hù)的user id和group id。

            除了一般的user id 和group id外,還有兩個(gè)稱(chēng)之為effective 的id,就是有效id,上面的四個(gè)id表示為:uid,gid,euid,egid。內(nèi)核主要是根據(jù)euid和egid來(lái)確定進(jìn)程對(duì)資源的訪問(wèn)權(quán)限。

            一個(gè)進(jìn)程如果沒(méi)有SUID或SGID位,則euid=uid egid=gid,分別是運(yùn)行這個(gè)程序的用戶(hù)的uid和gid。例如kevin用戶(hù)的uid和gid分別為204和202,foo用戶(hù)的uid和gid為 200,201,kevin運(yùn)行myfile程序形成的進(jìn)程的euid=uid=204,egid=gid=202,內(nèi)核根據(jù)這些值來(lái)判斷進(jìn)程對(duì)資源訪問(wèn) 的限制,其實(shí)就是kevin用戶(hù)對(duì)資源訪問(wèn)的權(quán)限,和foo沒(méi)關(guān)系。

            如果一個(gè)程序設(shè)置了SUID,則euid和egid變成被運(yùn)行的程序的所有者的uid和gid,例如kevin用戶(hù)運(yùn)行myfile,euid=200,egid=201,uid=204,gid=202,則這個(gè)進(jìn)程具有它的屬主foo的資源訪問(wèn)權(quán)限。

            SUID的作用就是這樣:讓本來(lái)沒(méi)有相應(yīng)權(quán)限的用戶(hù)運(yùn)行這個(gè)程序時(shí),可以訪問(wèn)他沒(méi)有權(quán)限訪問(wèn)的資源。passwd就是一個(gè)很鮮明的例子。

            SUID的優(yōu)先級(jí)比SGID高,當(dāng)一個(gè)可執(zhí)行程序設(shè)置了SUID,則SGID會(huì)自動(dòng)變成相應(yīng)的egid。

            下面討論一個(gè)例子:

            UNIX系統(tǒng)有一個(gè)/dev/kmem的設(shè)備文件,是一個(gè)字符設(shè)備文件,里面存儲(chǔ)了核心程序要訪問(wèn)的數(shù)據(jù),包括用戶(hù)的口令。所以這個(gè)文件不能給一般的用戶(hù)讀寫(xiě),權(quán)限設(shè)為:cr-r---- 1 root system 2, 1 May 25 1998 kmem

            但ps等程序要讀這個(gè)文件,而ps的權(quán)限設(shè)置如下:

            -r-xr-sr-x 1 bin system 59346 Apr 05 1998 ps

            這是一個(gè)設(shè)置了SGID的程序,而ps的用戶(hù)是bin,不是root,所以不能設(shè)置SUID來(lái)訪問(wèn)kmem,但大家注意了,bin和root 都屬于system組,而且ps設(shè)置了SGID,一般用戶(hù)執(zhí)行ps,就會(huì)獲得system組用戶(hù)的權(quán)限,而文件kmem的同組用戶(hù)的權(quán)限是可讀,所以一般 用戶(hù)執(zhí)行ps就沒(méi)問(wèn)題了。但有些人說(shuō),為什么不把ps程序設(shè)置為root用戶(hù)的程序,然后設(shè)置SUID位,不也行嗎?這的確可以解決問(wèn)題,但實(shí)際中為什么 不這樣做呢?因?yàn)镾GID的風(fēng)險(xiǎn)比SUID小得多,所以出于系統(tǒng)安全的考慮,應(yīng)該盡量用SGID代替SUID的程序,如果可能的話。下面來(lái)說(shuō)明一下 SGID對(duì)目錄的影響。SUID對(duì)目錄沒(méi)有影響。如果一個(gè)目錄設(shè)置了SGID位,那么如果任何一個(gè)用戶(hù)對(duì)這個(gè)目錄有寫(xiě)權(quán)限的話,他在這個(gè)目錄所建立的文件 的組都會(huì)自動(dòng)轉(zhuǎn)為這個(gè)目錄的屬主所在的組,而文件所有者不變,還是屬于建立這個(gè)文件的用戶(hù)。

            三、關(guān)于SUID和SGID的編程

            和SUID和SGID編程比較密切相關(guān)的有以下的頭文件和函數(shù):

            #include

            #include

            uid_t getuid(void);

            uid_t geteuid(void);

            gid_t getgid (void);

            gid_t getegid (void);

            int setuid (uid_t UID);

            int setruid (uid_t RUID);

            int seteuid (uid_t EUID);

            int setreuid (uid_t RUID,uid_t EUID);

            int setgid (gid_t GID);

            int setrgid (gid_t RGID);

            int setegid (git_t EGID);

            int setregid (gid_t RGID, gid_t EGID);

            具體這些函數(shù)的說(shuō)明在這里就不詳細(xì)列出來(lái)了,要用到的可以用man查。

            SUID/SGID :

            假如你有文件a.txt

            #ls -l a.txt

            -rwxrwxrwx

            #chmod 4777 a.txt

            -rwsrwxrwx ======>注意s位置

            #chmod 2777 a.txt

            -rwxrwsrwx ======>注意s位置

            #chmod 7777 a.txt

            -rwsrwxswt ======>出現(xiàn)了t,t的作用在內(nèi)存中盡量保存a.txt,節(jié)省系統(tǒng)再加載的時(shí)間.

            現(xiàn)在再看前面設(shè)置 SUID/SGID作用:

            #cd /sbin

            #./lsusb

            ...

            #su aaa(普通用戶(hù))

            $./lsusb

            ...

            是不是現(xiàn)在顯示出錯(cuò)?

            $su

            #chmod 4755 lsusb

            #su aaa

            $./lsusb

            ... 現(xiàn)在明白了嗎?本來(lái)是只有root用戶(hù)才能執(zhí)行的命令,加了SUID后,普通用戶(hù)就可以像root一樣的用,權(quán)限提升了。上面是對(duì)于文件來(lái)說(shuō)的,對(duì)于目錄也差不多!

            目錄的S屬性使得在該目錄下創(chuàng)建的任何文件及子目錄屬于該目錄所擁有的組,目錄的T屬性使得該目錄的所有者及root才能刪除該目錄。還有對(duì) 于s與S,設(shè)置SUID/SGID需要有運(yùn)行權(quán)限,否則用ls -l后就會(huì)看到S,證明你所設(shè)置的SUID/SGID沒(méi)有起作用。

            Why we need suid,how do we use suid?

            r -- 讀訪問(wèn)

            w -- 寫(xiě)訪問(wèn)

            x -- 執(zhí)行許可

            s -- SUID/SGID

            t -- sticky位

            那么 suid/sgid是做什么的? 為什么會(huì)有suid位呢?

            要想明白這個(gè),先讓我們看個(gè)問(wèn)題:如果讓每個(gè)用戶(hù)更改自己的密碼?

            用戶(hù)修改密碼,是通過(guò)運(yùn)行命令passwd來(lái)實(shí)現(xiàn)的。最終必須要修改/etc/passwd文件,而passwd的文件的屬性是:

            #ls -l /etc/passwd

            rw-rr- 1 root root 2520 Jul 12 18:25 passwd

            我們可以看到passwd文件只有對(duì)于root用戶(hù)是可寫(xiě)的,而對(duì)于所有的他用戶(hù)來(lái)說(shuō)都是沒(méi)有寫(xiě)權(quán)限的。 那么一個(gè)普通的用戶(hù)如何能夠通過(guò)運(yùn)行passwd命令修改這個(gè)passwd文件呢?

            為了解決這個(gè)問(wèn)題,SUID/SGID便應(yīng)運(yùn)而生。而且AT&T對(duì)它申請(qǐng)了專(zhuān)利。 呵呵。

            SUID和SGID是如何解決這個(gè)問(wèn)題呢?

            首先,我們要知道一點(diǎn):進(jìn)程在運(yùn)行的時(shí)候,有一些屬性,其中包括 實(shí)際用戶(hù)ID,實(shí)際組ID,有效用戶(hù)ID,有效組ID等。 實(shí)際用戶(hù)ID和實(shí)際組ID標(biāo)識(shí)我們是誰(shuí),誰(shuí)在運(yùn)行這個(gè)程序,一般這2個(gè)字段在登陸時(shí)決定,在一個(gè)登陸會(huì)話期間, 這些值基本上不改變。

            而有效用戶(hù)ID和有效組ID則決定了進(jìn)程在運(yùn)行時(shí)的權(quán)限。內(nèi)核在決定進(jìn)程是否有文件存取權(quán)限時(shí),是采用了進(jìn)程的有效用戶(hù)ID來(lái)進(jìn)行判斷的。

            知道了這點(diǎn),我們來(lái)看看SUID的解決途徑:

            當(dāng)一個(gè)程序設(shè)置了為SUID位時(shí),內(nèi)核就知道了運(yùn)行這個(gè)程序的時(shí)候,應(yīng)該認(rèn)為是文件的所有者在運(yùn)行這個(gè)程序。即該程序運(yùn)行的時(shí)候,有效用戶(hù)ID是該程序的所有者。舉個(gè)例子:

            [root@sgrid5 bin]# ls -l passwd

            -r-s-s-x 1 root root 16336 Feb 14 2003 passwd

            雖然你以test登陸系統(tǒng),但是當(dāng)你輸入passwd命令來(lái)更改密碼的時(shí)候,由于passwd設(shè)置了SUID位,因此雖然進(jìn)程的實(shí)際用戶(hù)ID 是test對(duì)應(yīng)的ID,但是進(jìn)程的有效用戶(hù)ID則是passwd文件的所有者root的ID,因此可以修改/etc/passwd文件。

            讓我們看另外一個(gè)例子。

            ping命令應(yīng)用廣泛,可以測(cè)試網(wǎng)絡(luò)是否連接正常。ping在運(yùn)行中是采用了ICMP協(xié)議,需要發(fā)送ICMP報(bào)文。但是只有root用戶(hù)才能建立ICMP報(bào)文,如何解決這個(gè)問(wèn)題呢?同樣,也是通過(guò)SUID位來(lái)解決。

            [root@sgrid5 bin]# ls -l /bin/ping

            -rwsr-sr-x 1 root root 28628 Jan 25 2003 /bin/ping

            我們可以測(cè)試一下,如果去掉ping的SUID位,再用普通用戶(hù)去運(yùn)行命令,看會(huì)怎么樣。

            [root@sgrid5 bin]#chmod u-s /bin/ping

            [root@sgrid5 bin]# ls -l ping

            -rwxr-xr-x 1 root root 28628 Jan 25 2003 ping

            [root@sgrid5 bin]#su test

            [test@sgrid5 bin]$ ping byhh.net

            ping: icmp open socket: Operation not permitted

            SUID雖然很好了解決了一些問(wèn)題,但是同時(shí)也會(huì)帶來(lái)一些安全隱患。

            因?yàn)樵O(shè)置了 SUID 位的程序如果被攻擊(通過(guò)緩沖區(qū)溢出等方面),那么hacker就可以拿到root權(quán)限。

            因此在安全方面特別要注意那些設(shè)置了SUID的程序。

            通過(guò)以下的命令可以找到系統(tǒng)上所有的設(shè)置了suid的文件:

            [root@sgrid5 /]# find / -perm -04000 -type f -ls

            對(duì)于這里為什么是4000,大家可以看一下前面的st_mode的各bit的意義就明白了。

            在這些設(shè)置了suid的程序里,如果用不上的,就最好取消該程序的suid位。


          總結(jié):
          1.Set UID:當(dāng)文件系統(tǒng)的"所有者權(quán)限組合"的可執(zhí)行位被s(即rws------)取代時(shí),構(gòu)成特殊權(quán)限規(guī)定Set UID,簡(jiǎn)稱(chēng)SUID。僅對(duì)系統(tǒng)中的二進(jìn)制可執(zhí)行文件設(shè)置有效,而且不可對(duì)Shell Script施加設(shè)置。
          2.Set GID:當(dāng)所有者所在的用戶(hù)組(group)的權(quán)限組合中可執(zhí)行位被s所取代時(shí)(例如--rws--),便構(gòu)成Set GID的權(quán)限設(shè)置。SGID可以針對(duì)二進(jìn)制文件或目錄進(jìn)行設(shè)置。
          3.Sticky Bit:當(dāng)文件系統(tǒng)"其他(others)"的權(quán)限組合中可執(zhí)行位被t所取代時(shí)(例如------rwt),便構(gòu)成Sticky Bit的權(quán)限設(shè)置。它只對(duì)目錄有效。

          SUID和SGID,主要作用是用于當(dāng)非某個(gè)文件的所有者(或組)執(zhí)行(或操作目錄)文件時(shí),可以暫時(shí)獲得該文件所有者的權(quán)限。
          SBIT的作用在于訪問(wèn)控制,當(dāng)它對(duì)某個(gè)目錄設(shè)置此屬性后,該目錄下的所有文件,即使其它人有w屬性,都不得對(duì)其更名、移動(dòng)、刪除。

          設(shè)置方法:
          如果你已經(jīng)掌握了用(八進(jìn)制)數(shù)字來(lái)表示權(quán)限的規(guī)則,再結(jié)合chmod命令進(jìn)行設(shè)置就很簡(jiǎn)單了。以下是SUID/SGID/Sticky Bit約定對(duì)應(yīng)的八進(jìn)制數(shù)值:
          SUID = 4
          SGID = 2
          SBIT = 1
          設(shè)置時(shí)我們把表示特殊權(quán)限的數(shù)字放在其他三位數(shù)字權(quán)限的前面。

          posted @ 2008-10-31 16:22 agapple 閱讀(317) | 評(píng)論 (0)編輯 收藏

          官方描述:http://java.sun.com/j2se/1.3/docs/guide/jar/jar.html

          The META-INF directory

          The following files/directories in the META-INF directory are recognized and interpreted by the Java 2 Platform to configure applications, extensions, class loaders and services:
          • MANIFEST.MF
          The manifest file that is used to define extension and package related data.
          • INDEX.LIST
          This file is generated by the new "-i" option of the jar tool, which contains location information for packages defined in an application or extension.  It is part of the JarIndex implementation and used by class loaders to speed up their class loading process.
          • x.SF
          The signature file for the JAR file.  'x' stands for the base file name.
          • x.DSA
          The signature block file associated with the signature file with the same base file name. This file stores the digital signature of the corresponding signature file.
          • services/
          This directory stores all the service provider configuration files.

          這里指出了jar包的典型的目錄結(jié)構(gòu)。簡(jiǎn)單翻譯:

          META-INF目錄中的下列文件和目錄獲得Java 2平臺(tái)的認(rèn)可與解釋?zhuān)脕?lái)配置應(yīng)用程序、擴(kuò)展程序、類(lèi)加載器和服務(wù):
          • MANIFEST.MF:清單文件,用來(lái)定義與擴(kuò)展和數(shù)據(jù)包相關(guān)的數(shù)據(jù)。
          • INDEX.LIST:這個(gè)文件由JAR工具的新“-i”選項(xiàng)生成,其中包含在一個(gè)應(yīng)用程序或擴(kuò)展中定義的數(shù)據(jù)包的地址信息。它是JarIndex的一部分,被類(lèi)加載器用來(lái)加速類(lèi)加載過(guò)程。
          • x.SF:JAR文件的簽名文件。x代表基礎(chǔ)文件名。
          • x.DSA:這個(gè)簽名塊文件與同名基礎(chǔ)簽名文件有關(guān)。此文件存儲(chǔ)對(duì)應(yīng)簽名文件的數(shù)字簽名。
          • services/:這個(gè)目錄存儲(chǔ)所有服務(wù)提供程序配置文件。

          Service Provider

          Overview

          Files in the META-INF/services directory are service provider configuration files. A service is a well-known set of interfaces and (usually abstract) classes. A service provider is a specific implementation of a service. The classes in a provider typically implement the interfaces and subclass the classes defined in the service itself. Service providers may be installed in an implementation of the Java platform in the form of extensions, that is, jar files placed into any of the usual extension directories. Providers may also be made available by adding them to the applet or application class path or by some other platform-specific means.

          A service is represented by an abstract class. A provider of a given service contains one or more concrete classes that extend this service class with data and code specific to the provider. This provider class will typically not be the entire provider itself but rather a proxy that contains enough information to decide whether the provider is able to satisfy a particular request together with code that can create the actual provider on demand. The details of provider classes tend to be highly service-specific; no single class or interface could possibly unify them, so no such class has been defined. The only requirement enforced here is that provider classes must have a zero-argument constructor so that they may be instantiated during lookup.
           

          Provider-Configuration File

          A service provider identifies itself by placing a provider-configuration file in the resource directory META-INF/services. The file's name should consist of the fully-qualified name of the abstract service class. The file should contain a newline-separated list of unique concrete provider-class names. Space and tab characters, as well as blank lines, are ignored. The comment character is '#' (0x23); on each line all characters following the first comment character are ignored. The file must be encoded in UTF-8.
           

          Example

          Suppose we have a service class named java.io.spi.CharCodec. It has two abstract methods:

              public abstract CharEncoder getEncoder(String encodingName);
            public abstract CharDecoder getDecoder(String encodingName);

          Each method returns an appropriate object or null if it cannot translate the given encoding. Typical CharCodec providers will support more than one encoding.

          If sun.io.StandardCodec is a provider of the CharCodec service then its jar file would contain the file META-INF/services/java.io.spi.CharCodec. This file would contain the single line:

             sun.io.StandardCodec    # Standard codecs for the platform

          To locate an encoder for a given encoding name, the internal I/O code would do something like this:

             CharEncoder getEncoder(String encodingName) {
                 Iterator ps = Service.providers(CharCodec.class);
                 while (ps.hasNext()) {
                     CharCodec cc = (CharCodec)ps.next();
                     CharEncoder ce = cc.getEncoder(encodingName);
                     if (ce != null)
                         return ce;
                 }
                 return null;
             }
           

          The provider-lookup mechanism always executes in the security context of the caller. Trusted system code should typically invoke the methods in this class from within a privileged security context.


          介紹:

          在META-INF/services目錄下保存的是service provider的配置文件。 服務(wù)在應(yīng)用中會(huì)是一個(gè)接口(更多的是抽象類(lèi))。
          一個(gè)類(lèi)服務(wù)器提供者實(shí)現(xiàn)了一個(gè)服務(wù)類(lèi)。這類(lèi)的服務(wù)提供類(lèi)可以以擴(kuò)展的形式發(fā)布到平臺(tái)上。所以,jar文件引入了擴(kuò)展目錄,同樣你也可以將服務(wù)提供者加入classpath提供訪問(wèn)。

          服務(wù)都是表現(xiàn)為一個(gè)積累,而一個(gè)服務(wù)提供者通常是集成或?qū)崿F(xiàn)了服務(wù)定義類(lèi)。服務(wù)提供類(lèi)通常不會(huì)像代理類(lèi)一樣為了正常提供服務(wù)而包含了請(qǐng)求者的許多信息。服務(wù)提供類(lèi)一般傾向于高集成。
          對(duì)這類(lèi)服務(wù)提供類(lèi)的唯一強(qiáng)制性要求就是必須有一個(gè)無(wú)參的構(gòu)造函數(shù)。

          provider 配置文件
          META-INF/services目錄作為provider配置文件的存放路徑。provider配置文件中必須是全類(lèi)名(包含package)。配置文件可以存在space tab 換行等字符,#作為注釋。
          注意:provider配置文件必須是以UTF-8編碼。

           


          總結(jié):
                service provider機(jī)制為程序的動(dòng)態(tài)擴(kuò)展提供了契機(jī),在應(yīng)用中你可以針對(duì)接口編程,通過(guò)RTTI技術(shù)可以比較完美的解決程序之間的耦合性。相比于spring DIP機(jī)制,這也是一個(gè)不錯(cuò)的嘗試,至少它不需要耦合spring包。
          posted @ 2008-10-31 11:32 agapple 閱讀(773) | 評(píng)論 (0)編輯 收藏

          TitleLABEL=/                 /                       ext3    defaults        1 1
          LABEL=/boot             /boot                   ext3    defaults        1 2
          none                    /dev/pts                devpts  gid=5,mode=620  0 0
          LABEL=/home             /home                   ext3    defaults        1 2
          none                    /proc                   proc    defaults        0 0
          none                    /dev/shm                tmpfs   defaults        0 0
          LABEL=/tmp              /tmp                    ext3    defaults        1 2
          LABEL=/usr              /usr                    ext3    defaults        1 2
          LABEL=/var              /var                    ext3    defaults        1 2
          /dev/sda6               swap                    swap    defaults        0 0
          /dev/cdrom              /mnt/cdrom              udf,iso9660 noauto,owner,kudzu,ro 0 0
          /dev/fd0                /mnt/floppy             auto    noauto,owner,kudzu 0 0

          fstab中存放了與分區(qū)有關(guān)的重要信息,其中每一行為一個(gè)分區(qū)記錄,每一行又可分為六個(gè)部份:
          1. 第一項(xiàng)是您想要mount的儲(chǔ)存裝置的實(shí)體位置,如/dev/sda6分區(qū) (分區(qū)或卷標(biāo)名)
          2. 第二項(xiàng)就是您想要將其加入至哪個(gè)目錄位置,如/home或/, (掛載點(diǎn) )
          3. 第三項(xiàng)就是所謂的local filesystem,其包含了以下格式:如ext、ext2、msdos、iso9660、nfs、swap等,或如ext2  (文件系統(tǒng))
          4. 第四項(xiàng)就是您mount時(shí),所要設(shè)定的狀態(tài),如ro(只讀)或defaults(包括了其它參數(shù)如rw、suid、exec、auto、nouser、async),可以參見(jiàn)「mount nfs」。 (讀寫(xiě)狀態(tài))
          5. 第五項(xiàng)是提供DUMP功能,在系統(tǒng)DUMP時(shí)是否需要BACKUP的標(biāo)志位,其內(nèi)定值是0。  (0為不備份,1為要備份,一般根分區(qū)要備份)               
          6. 第六項(xiàng)是設(shè)定是否要在開(kāi)機(jī)時(shí)做check的動(dòng)作,除了其必要的check為1之外,其它皆可視需要設(shè)定,內(nèi)定值是0。 (0為不自檢,1或者2為要自檢,如果是根分區(qū)要設(shè)為1,其他分區(qū)只能是2)
          posted @ 2008-10-30 11:23 agapple 閱讀(285) | 評(píng)論 (0)編輯 收藏

          僅列出標(biāo)題
          共2頁(yè): 1 2 下一頁(yè) 
          主站蜘蛛池模板: 滕州市| 呼和浩特市| 贡嘎县| 伊吾县| 房产| 福清市| 南城县| 天门市| 邮箱| 凤山市| 呈贡县| 慈利县| 德惠市| 库尔勒市| 吉水县| 阜平县| 余干县| 瓦房店市| 新平| 蓝山县| 拉孜县| 泽州县| 荆门市| 汉沽区| 泰州市| 渝北区| 惠东县| 靖远县| 涿鹿县| 和林格尔县| 克拉玛依市| 建瓯市| 宿州市| 巨野县| 定陶县| 藁城市| 平昌县| 黄石市| 扎赉特旗| 承德县| 田林县|