2011年4月7日 #
摘要: 概念:觀察者模式定義了一對多依賴,這樣一來,當一個對象改變狀態時,它的所有依賴者都會收到通知并自動更新。
舉個網上商城的例子,比如很多顧客對某個商品感興趣,把商品收藏,當該商品降價、促銷、有貨了等事件發生時,就會發Email通知顧客。
UML圖... 閱讀全文
2011年4月6日 #
從今天開始,把常用的設計模式都簡單的整理一遍,希望每個星期能至少整理2個模式吧,先從簡單的策略模式開始。
概念:它定義了一系列的算法,并將每一個算法封裝起來,而且使它們還可以相互替換。策略模式讓算法的變化不會影響到使用算法的客戶。 策略模式很簡單,實際上就是OO中的多態,舉個例子,某商場要進行促銷,對于普通顧客打88折,對于銀卡客戶在88折基礎上再滿400減160,對于金卡客戶在88折基礎上再滿400減200。 UML圖如下所示: 接口DiscountStrategy代碼如下: ![]() ![]() ![]() 類GeneralDiscountStrategy類代碼如下: ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() 類SilverDiscountStrategy類代碼如下: ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() 類GoldenDiscountStrategy代碼如下: ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() 類Cashier代碼如下: ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() 2011年4月5日 #
摘要: 這篇寫一個簡單的HelloWorld例子。
首先準備環境,我使用的JDK1.6,1.5應該也可以。還需要去oracle下載JMX RI包,地址為:http://www.oracle.com/technetwork/java/javase/tech/download-jsp-141676.html,下載... 閱讀全文
2011年4月3日 #
這是我讀了JMX In Action以后的總結,這篇文章是這個系列的第一篇,主要介紹一下什么是JMX,為什么要使用JMX?以及簡單闡述一下JMX的架構。
什么是JMX? 首先看一下維基百科的定義:JMX(Java Management Extensions,即Java管理擴展)是Java平臺上為應用程序、設備、系統等植入管理功能的框架。 JMX可以跨越一系列異構操作系統平臺、系統體系結構和網絡傳輸協議,靈活的開發無縫集成的系統、網絡和服務管理應用。 隨著企業 IT 規模的不斷增長,IT 資源(IT resource)數量不斷增加,IT 資源的分布也越來越分散。IT資源主要包括網絡和應用等。管理網絡(硬件)的主要工具是 簡單網絡管理協議(SNMP),硬件廠商一般都會在設備中提供SNMP hooks,但SNMP開發不是件容易的事情,而且需要掌握特定的語言,對JAVA開發者絕非易事。 有些企業開發的應用的時候,是不會考慮運行時配置和管理問題。有些企業直接在產品中開發管理工具和界面。也有一些企業直接使用應用服務器或web服務器的管理工具。 現實世界的IT資源管理需求主要有以下一些: 1、監控平臺和硬件的健康。硬件可以通過SNMP,WEB服務器和應用服務器可以通過他們自己的管理工具。數據庫也是一樣等。 2、配置應用層面的資源。比如配置應用在查詢結果中每頁顯示的數量,配置數據庫連接池,或者外部請求數等。 3、收集應用程序的統計信息。如多少成功訂單,多少失敗訂單等。 4、日志級別,改變日志級別。出問題的時候,可以通過改變日志級別來打印調試信息,快速定位問題。 5、監視服務器的性能、負載,通過email、sms等通知關鍵性事件,比如服務器負載超過預設的界限。 要滿足這些需求往往是非常昂貴和困難的,管理員通常需要通過不同的工具來管理不同的服務和硬件。 如果使用JMX,創建一個滿足上面需求的管理系統將是廉價、更加靈活、所需時間更短。 使用JMX的好處 1、非常容易使用。特別是對一個JAVA程序員,要理解SNMP是困難的。而JMX對他來說非常容易。 2、利用現有的技術:現有的管理工具可以插入JMX,JMX提供了很多協議(SNMP、HTTP)和傳輸方式(如RMI),如果原有的應用和設備沒有提供管理能力,則可以創建JMX代理提供管理能力。 3、模塊化。以模塊化的方式創建你的管理環境。 4、警告、事件和統計信息。 JMX提供了一套通知系統,充分利用了面向對象優勢,通知提供了不僅僅是數據,而是一個有分布式JAVA對象,封裝了數據和行為。例如,你發送了一個服務器負載的通知,里面還包含了一個顯示負載重要性的級別的機制,說白了就是對象里面有個方法,可以判定負載的嚴重程度。 5、快速的監控解決方案。不同的開發人員只需要自己開發MBean,而不需要花很多的時間在相互的協作上面,這些MBean分布在不同的主機上,但可以通過一個管理工具就可以管理所有的這些應用。 JMX的一些術語 1、可管理資源(Manageable resource) 可以是任何的應用、設備、或者其他存在的實體,能夠被java訪問和包裝。是被JMX MBean管理的資源。 2、MBean(Managed Bean) 是滿足某些命名規則和繼承JMX 規范的java類,為可管理資源的管理和訪問暴露接口。通過屬性和行為來暴露接口。有這3類:Standard, Dynamic, and Model MBeans。 3、MBean Server 管理一組MBean的JAVA類。是JMX 管理環境核心。是MBean的注冊器。 4、JMX Agent JMX代理是為管理一組MBean提供一系列服務的java進程。是一個MBean Server的容器,它還提供了一些有用的服務:創建MBean之間的關系,動態加載類,簡單的監控服務,定時器服務。Agent有一個協議適配器和連接器集合能使外部程序連接到他們。 5、Protocol adapters and connectors 協議適配器和連接器是位于JMX Agent內部的對象。把Agent暴露給管理程序和協議。一個Agent可以有很多適配器和連接器。 6、Management application 連接到JMX Agent的用戶應用程序。 7、Notification 通知是Mbean或者Mbean server發送的java對象,他們封裝了事件、警告、或者其他的一般信息。其他的Mbean或者java對象可以注冊成為監聽器來接受通知。 8、Instrumentation(設備化) 用MBean暴露一個可管理資源的過程。 JMX架構 JMX架構主要分為三層:Distributed layer,Agent layer,Instrumentation layer,如下圖所示: ![]() 1、Distributed layer(分布式層) 屬于JMX架構的最外層,這層主要負責使JMX Agent能對外部程序可用。 又分為兩種:一種通過不同的協議(如SNMP,HTTP)來為MBean提供可見性。 另一種是把Agent API暴露給其他的分布式技術如RMI。 2、The agent layer(代理層) 它包含的最主要的組件是MBean Server,它還包括4個代理服務使管理MBean更加容易,它們分別是: 定時器(timer)、監控服務、動態MBean加載、和MBean關系服務。Agent可以和被管理的資源在同一個主機上,也可以是遠程的。 3、The instrumentation layer 這是最靠近資源的一層,它包含了注冊在Agent里面的MBean。 4、Notifications 除了架構中的三層以外,JMX提供了一個通知機制,類似于JAVA事件模型。通知機制是管理系統的最后必須的組件。Agent和MBean可以使用通知機制來發送警告或信息給管理應用。 以上就是JMX架構的主要內容,下一篇構建一個HelloWorld的JMX程序。 2011年3月30日 # 這本書的前面三章主要講了一下基本概念,客戶端程序,和Amazon的S3,這篇博客總結一下第四章,個人感覺有很多重要的概念。 2010年2月28日 # 雙親委派模型 1、啟動類裝載器 2010年2月22日 #
其實網上已經有很多java Class文件的解析實例的文章,寫這篇博客,只是為了自己仔仔細細的按照jvm spec看一邊,別無其他。
先上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個字節的無符號整數。u4代表4個字節的無符號整數,其他如 cp_info 、field_info 是一些結構數據,接下去會講。這次要解析的是一個非常簡單的類:TJ.java,代碼如下: public class TJ
{ private final int f1 = 2; public int m1(int i){ return i+1; } private void m2(){ } } 使用jdk1.6編譯,產生的二進制類文件如下:
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 下面對照上面的格式結構一點點的解析。
0A 00 04 00 12:【1】,第一個字節為10,所以是CONSTANT_Methodref,它的結構如下: 到此,常量池結束。 attribute_name_index:7,即ConstantValue,結構如下 00 03:3個方法。 2010年1月18日 #
搞了那么多年的程序,一直也沒去搞明白URI和URL的區別,總感覺這兩個東東差不多。看了《OReilly HTTP The Definitive Guide》,總結一下:
從字面上理解,URI強調的是“資源”,而URL強調的是“定位”.URI更為注重資源而不太注重位置,URI對于定位Internet上的資源是更為通用的架構。 URI有兩種形式:一種是URL,另一種是URN。 URL表示的是某臺特定主機上的一個資源的具體路徑,是一個精確的、固定的位置。 URN(uniform resource name)指的是某一塊特定內容的唯一的名字,和資源所在的位置無關,是location-independent的,允許資源從一個地方移到另一個地方。 URN仍然是實驗性的,還沒有被廣泛的采用。URN需要一個基礎架構來支持解決資源定位問題。 所以說,現在URI基本上都是URL。 |