2010年2月22日 #
摘要: 概念:觀察者模式定義了一對(duì)多依賴,這樣一來(lái),當(dāng)一個(gè)對(duì)象改變狀態(tài)時(shí),它的所有依賴者都會(huì)收到通知并自動(dòng)更新。
舉個(gè)網(wǎng)上商城的例子,比如很多顧客對(duì)某個(gè)商品感興趣,把商品收藏,當(dāng)該商品降價(jià)、促銷、有貨了等事件發(fā)生時(shí),就會(huì)發(fā)Email通知顧客。
UML圖... 閱讀全文
從今天開始,把常用的設(shè)計(jì)模式都簡(jiǎn)單的整理一遍,希望每個(gè)星期能至少整理2個(gè)模式吧,先從簡(jiǎn)單的策略模式開始。
概念:它定義了一系列的算法,并將每一個(gè)算法封裝起來(lái),而且使它們還可以相互替換。策略模式讓算法的變化不會(huì)影響到使用算法的客戶。 策略模式很簡(jiǎn)單,實(shí)際上就是OO中的多態(tài),舉個(gè)例子,某商場(chǎng)要進(jìn)行促銷,對(duì)于普通顧客打88折,對(duì)于銀卡客戶在88折基礎(chǔ)上再滿400減160,對(duì)于金卡客戶在88折基礎(chǔ)上再滿400減200。 UML圖如下所示: 接口DiscountStrategy代碼如下: ![]() ![]() ![]() 類GeneralDiscountStrategy類代碼如下: ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() 類SilverDiscountStrategy類代碼如下: ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() 類GoldenDiscountStrategy代碼如下: ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() 類Cashier代碼如下: ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]()
摘要: 這篇寫一個(gè)簡(jiǎn)單的HelloWorld例子。
首先準(zhǔn)備環(huán)境,我使用的JDK1.6,1.5應(yīng)該也可以。還需要去oracle下載JMX RI包,地址為:http://www.oracle.com/technetwork/java/javase/tech/download-jsp-141676.html,下載... 閱讀全文
這是我讀了JMX In Action以后的總結(jié),這篇文章是這個(gè)系列的第一篇,主要介紹一下什么是JMX,為什么要使用JMX?以及簡(jiǎn)單闡述一下JMX的架構(gòu)。
什么是JMX? 首先看一下維基百科的定義:JMX(Java Management Extensions,即Java管理擴(kuò)展)是Java平臺(tái)上為應(yīng)用程序、設(shè)備、系統(tǒng)等植入管理功能的框架。 JMX可以跨越一系列異構(gòu)操作系統(tǒng)平臺(tái)、系統(tǒng)體系結(jié)構(gòu)和網(wǎng)絡(luò)傳輸協(xié)議,靈活的開發(fā)無(wú)縫集成的系統(tǒng)、網(wǎng)絡(luò)和服務(wù)管理應(yīng)用。 隨著企業(yè) IT 規(guī)模的不斷增長(zhǎng),IT 資源(IT resource)數(shù)量不斷增加,IT 資源的分布也越來(lái)越分散。IT資源主要包括網(wǎng)絡(luò)和應(yīng)用等。管理網(wǎng)絡(luò)(硬件)的主要工具是 簡(jiǎn)單網(wǎng)絡(luò)管理協(xié)議(SNMP),硬件廠商一般都會(huì)在設(shè)備中提供SNMP hooks,但SNMP開發(fā)不是件容易的事情,而且需要掌握特定的語(yǔ)言,對(duì)JAVA開發(fā)者絕非易事。 有些企業(yè)開發(fā)的應(yīng)用的時(shí)候,是不會(huì)考慮運(yùn)行時(shí)配置和管理問(wèn)題。有些企業(yè)直接在產(chǎn)品中開發(fā)管理工具和界面。也有一些企業(yè)直接使用應(yīng)用服務(wù)器或web服務(wù)器的管理工具。 現(xiàn)實(shí)世界的IT資源管理需求主要有以下一些: 1、監(jiān)控平臺(tái)和硬件的健康。硬件可以通過(guò)SNMP,WEB服務(wù)器和應(yīng)用服務(wù)器可以通過(guò)他們自己的管理工具。數(shù)據(jù)庫(kù)也是一樣等。 2、配置應(yīng)用層面的資源。比如配置應(yīng)用在查詢結(jié)果中每頁(yè)顯示的數(shù)量,配置數(shù)據(jù)庫(kù)連接池,或者外部請(qǐng)求數(shù)等。 3、收集應(yīng)用程序的統(tǒng)計(jì)信息。如多少成功訂單,多少失敗訂單等。 4、日志級(jí)別,改變?nèi)罩炯?jí)別。出問(wèn)題的時(shí)候,可以通過(guò)改變?nèi)罩炯?jí)別來(lái)打印調(diào)試信息,快速定位問(wèn)題。 5、監(jiān)視服務(wù)器的性能、負(fù)載,通過(guò)email、sms等通知關(guān)鍵性事件,比如服務(wù)器負(fù)載超過(guò)預(yù)設(shè)的界限。 要滿足這些需求往往是非常昂貴和困難的,管理員通常需要通過(guò)不同的工具來(lái)管理不同的服務(wù)和硬件。 如果使用JMX,創(chuàng)建一個(gè)滿足上面需求的管理系統(tǒng)將是廉價(jià)、更加靈活、所需時(shí)間更短。 使用JMX的好處 1、非常容易使用。特別是對(duì)一個(gè)JAVA程序員,要理解SNMP是困難的。而JMX對(duì)他來(lái)說(shuō)非常容易。 2、利用現(xiàn)有的技術(shù):現(xiàn)有的管理工具可以插入JMX,JMX提供了很多協(xié)議(SNMP、HTTP)和傳輸方式(如RMI),如果原有的應(yīng)用和設(shè)備沒有提供管理能力,則可以創(chuàng)建JMX代理提供管理能力。 3、模塊化。以模塊化的方式創(chuàng)建你的管理環(huán)境。 4、警告、事件和統(tǒng)計(jì)信息。 JMX提供了一套通知系統(tǒng),充分利用了面向?qū)ο髢?yōu)勢(shì),通知提供了不僅僅是數(shù)據(jù),而是一個(gè)有分布式JAVA對(duì)象,封裝了數(shù)據(jù)和行為。例如,你發(fā)送了一個(gè)服務(wù)器負(fù)載的通知,里面還包含了一個(gè)顯示負(fù)載重要性的級(jí)別的機(jī)制,說(shuō)白了就是對(duì)象里面有個(gè)方法,可以判定負(fù)載的嚴(yán)重程度。 5、快速的監(jiān)控解決方案。不同的開發(fā)人員只需要自己開發(fā)MBean,而不需要花很多的時(shí)間在相互的協(xié)作上面,這些MBean分布在不同的主機(jī)上,但可以通過(guò)一個(gè)管理工具就可以管理所有的這些應(yīng)用。 JMX的一些術(shù)語(yǔ) 1、可管理資源(Manageable resource) 可以是任何的應(yīng)用、設(shè)備、或者其他存在的實(shí)體,能夠被java訪問(wèn)和包裝。是被JMX MBean管理的資源。 2、MBean(Managed Bean) 是滿足某些命名規(guī)則和繼承JMX 規(guī)范的java類,為可管理資源的管理和訪問(wèn)暴露接口。通過(guò)屬性和行為來(lái)暴露接口。有這3類:Standard, Dynamic, and Model MBeans。 3、MBean Server 管理一組MBean的JAVA類。是JMX 管理環(huán)境核心。是MBean的注冊(cè)器。 4、JMX Agent JMX代理是為管理一組MBean提供一系列服務(wù)的java進(jìn)程。是一個(gè)MBean Server的容器,它還提供了一些有用的服務(wù):創(chuàng)建MBean之間的關(guān)系,動(dòng)態(tài)加載類,簡(jiǎn)單的監(jiān)控服務(wù),定時(shí)器服務(wù)。Agent有一個(gè)協(xié)議適配器和連接器集合能使外部程序連接到他們。 5、Protocol adapters and connectors 協(xié)議適配器和連接器是位于JMX Agent內(nèi)部的對(duì)象。把Agent暴露給管理程序和協(xié)議。一個(gè)Agent可以有很多適配器和連接器。 6、Management application 連接到JMX Agent的用戶應(yīng)用程序。 7、Notification 通知是Mbean或者M(jìn)bean server發(fā)送的java對(duì)象,他們封裝了事件、警告、或者其他的一般信息。其他的Mbean或者java對(duì)象可以注冊(cè)成為監(jiān)聽器來(lái)接受通知。 8、Instrumentation(設(shè)備化) 用MBean暴露一個(gè)可管理資源的過(guò)程。 JMX架構(gòu) JMX架構(gòu)主要分為三層:Distributed layer,Agent layer,Instrumentation layer,如下圖所示: ![]() 1、Distributed layer(分布式層) 屬于JMX架構(gòu)的最外層,這層主要負(fù)責(zé)使JMX Agent能對(duì)外部程序可用。 又分為兩種:一種通過(guò)不同的協(xié)議(如SNMP,HTTP)來(lái)為MBean提供可見性。 另一種是把Agent API暴露給其他的分布式技術(shù)如RMI。 2、The agent layer(代理層) 它包含的最主要的組件是MBean Server,它還包括4個(gè)代理服務(wù)使管理MBean更加容易,它們分別是: 定時(shí)器(timer)、監(jiān)控服務(wù)、動(dòng)態(tài)MBean加載、和MBean關(guān)系服務(wù)。Agent可以和被管理的資源在同一個(gè)主機(jī)上,也可以是遠(yuǎn)程的。 3、The instrumentation layer 這是最靠近資源的一層,它包含了注冊(cè)在Agent里面的MBean。 4、Notifications 除了架構(gòu)中的三層以外,JMX提供了一個(gè)通知機(jī)制,類似于JAVA事件模型。通知機(jī)制是管理系統(tǒng)的最后必須的組件。Agent和MBean可以使用通知機(jī)制來(lái)發(fā)送警告或信息給管理應(yīng)用。 以上就是JMX架構(gòu)的主要內(nèi)容,下一篇構(gòu)建一個(gè)HelloWorld的JMX程序。 這本書的前面三章主要講了一下基本概念,客戶端程序,和Amazon的S3,這篇博客總結(jié)一下第四章,個(gè)人感覺有很多重要的概念。 雙親委派模型 1、啟動(dòng)類裝載器
其實(shí)網(wǎng)上已經(jīng)有很多java Class文件的解析實(shí)例的文章,寫這篇博客,只是為了自己仔仔細(xì)細(xì)的按照jvm spec看一邊,別無(wú)其他。
先上class文件的格式。
ClassFile {
u4 magic; u2 minor_version; u2 major_version; u2 constant_pool_count; cp_info constant_pool[constant_pool_count-1]; u2 access_flags; u2 this_class; u2 super_class; u2 interfaces_count; u2 interfaces[interfaces_count]; u2 fields_count; field_info fields[fields_count]; u2 methods_count; method_info methods[methods_count]; u2 attributes_count; attribute_info attributes[attributes_count]; } 其中,u2代表2個(gè)字節(jié)的無(wú)符號(hào)整數(shù)。u4代表4個(gè)字節(jié)的無(wú)符號(hào)整數(shù),其他如 cp_info 、field_info 是一些結(jié)構(gòu)數(shù)據(jù),接下去會(huì)講。這次要解析的是一個(gè)非常簡(jiǎn)單的類:TJ.java,代碼如下: public class TJ
{ private final int f1 = 2; public int m1(int i){ return i+1; } private void m2(){ } } 使用jdk1.6編譯,產(chǎn)生的二進(jìn)制類文件如下:
CA FE BA BE 00 00 00 32 00 16 0A 00 04 00 12 09
00 03 00 13 07 00 14 07 00 15 01 00 02 66 31 01 00 01 49 01 00 0D 43 6F 6E 73 74 61 6E 74 56 61 6C 75 65 03 00 00 00 02 01 00 06 3C 69 6E 69 74 3E 01 00 03 28 29 56 01 00 04 43 6F 64 65 01 00 0F 4C 69 6E 65 4E 75 6D 62 65 72 54 61 62 6C 65 01 00 02 6D 31 01 00 04 28 49 29 49 01 00 02 6D 32 01 00 0A 53 6F 75 72 63 65 46 69 6C 65 01 00 07 54 4A 2E 6A 61 76 61 0C 00 09 00 0A 0C 00 05 00 06 01 00 02 54 4A 01 00 10 6A 61 76 61 2F 6C 61 6E 67 2F 4F 62 6A 65 63 74 00 21 00 03 00 04 00 00 00 01 00 12 00 05 00 06 00 01 00 07 00 00 00 02 00 08 00 03 00 01 00 09 00 0A 00 01 00 0B 00 00 00 26 00 02 00 01 00 00 00 0A 2A B7 00 01 2A 05 B5 00 02 B1 00 00 00 01 00 0C 00 00 00 0A 00 02 00 00 00 01 00 04 00 03 00 01 00 0D 00 0E 00 01 00 0B 00 00 00 1C 00 02 00 02 00 00 00 04 1B 04 60 AC 00 00 00 01 00 0C 00 00 00 06 00 01 00 00 00 06 00 02 00 0F 00 0A 00 01 00 0B 00 00 00 19 00 00 00 01 00 00 00 01 B1 00 00 00 01 00 0C 00 00 00 06 00 01 00 00 00 0B 00 01 00 10 00 00 00 02 00 11 下面對(duì)照上面的格式結(jié)構(gòu)一點(diǎn)點(diǎn)的解析。
0A 00 04 00 12:【1】,第一個(gè)字節(jié)為10,所以是CONSTANT_Methodref,它的結(jié)構(gòu)如下: 到此,常量池結(jié)束。 attribute_name_index:7,即ConstantValue,結(jié)構(gòu)如下 00 03:3個(gè)方法。 |