<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    rednight

    0x2B|~0x2B,That's not a question,Just do it.
    posts - 32, comments - 14, trackbacks - 0, articles - 0

    2007年3月6日

    當前,CORBA、DCOM、RMI等RPC中間件技術已廣泛應用于各個領域。但是面對規模和復雜度都越來越高的分布式系統,這些技術也顯示出其局限性:(1)同步通信:客戶發出調用后,必須等待服務對象完成處理并返回結果后才能繼續執行;(2)客戶和服務對象的生命周期緊密耦合:客戶進程和服務對象進程都必須正常運行;如果由于服務對象崩潰或者網絡故障導致客戶的請求不可達,客戶會接收到異常;(3)點對點通信:客戶的一次調用只發送給某個單獨的目標對象。
       面向消息的中間件(Message Oriented Middleware,MOM)較好的解決了以上問題。發送者將消息發送給消息服務器,消息服務器將消息存放在若干隊列中,在合適的時候再將消息轉發給接收者。這種模式下,發送和接收是異步的,發送者無需等待;二者的生命周期未必相同:發送消息的時候接收者不一定運行,接收消息的時候發送者也不一定運行;一對多通信:對于一個消息可以有多個接收者。
       已有的MOM系統包括IBM的MQSeries、Microsoft的MSMQ和BEA的MessageQ等。由于沒有一個通用的標準,這些系統很難實現互操作和無縫連接。Java Message Service(JMS)是SUN提出的旨在統一各種MOM系統接口的規范,它包含點對點(Point to Point,PTP)和發布/訂閱(Publish/Subscribe,pub/sub)兩種消息模型,提供可靠消息傳輸、事務和消息過濾等機制。

    1.JMS
       JAVA 消息服務(JMS)定義了Java 中訪問消息中間件的接口。JMS 只是接口,并沒有給予實現,實現JMS 接口的消息中間件稱為JMS Provider,iLink實現了JMS接口,用戶可以通過使用JMS接口,在iLink中進行JMS編程。 iLink支持JMS1.0.2版本。

    2.JMS接口描述
       JMS 支持兩種消息類型PTP 和Pub/Sub,分別稱作:PTP Domain 和Pub/Sub Domain,這兩種接口都繼承統一的JMS父接口,JMS 主要接口如下所示:

    MS父接口

    PTP

    Pub/Sub

    ConnectionFactory

    QueueConnectionFactory

    TopicConnectionFactory

    Connection

    QueueConnection

    TopicConnection

    Destination

    Queue

    Topic

    Session

    QueueSession

    TopicSession

    MessageProducer

    QueueSender

    TopicPublisher

    MessageConsumer

    QueueReceiver,QueueBrowse r

    TopicSubscriber

     

     

     

                      
       ConnectionFactory :連接工廠,JMS 用它創建連接
       Connection :JMS 客戶端到JMS Provider 的連接
       Destination :消息的目的地
       Session: 一個發送或接收消息的線程
       MessageProducer: 由Session 對象創建的用來發送消息的對象
       MessageConsumer: 由Session 對象創建的用來接收消息的對象

    3.JMS消息模型
    JMS 消息由以下幾部分組成:消息頭,屬性,消息體。
      
    3.1 消息頭(Header) - 消息頭包含消息的識別信息和路由信息,消息頭包含一些標準的屬性如:JMSDestination,JMSMessageID 等。

     消息頭

     由誰設置

    JMSDestination

    send 或 publish 方法

    JMSDeliveryMode

    send 或 publish 方法

    JMSExpiration

    send 或 publish 方法

    JMSPriority

    send 或 publish 方法

    JMSMessageID

    send 或 publish 方法

    JMSTimestamp

    send 或 publish 方法

    JMSCorrelationID

    客戶

    JMSReplyTo

    客戶

    JMSType

    客戶

    JMSRedelivered

    JMS Provider

     

     

            
     

     

     

          


    3.2 屬性(Properties)
    - 除了消息頭中定義好的標準屬性外,JMS 提供一種機制增加新屬性到消息頭 中,這種新屬性包含以下幾種:
       1. 應用需要用到的屬性;
       2. 消息頭中原有的一些可選屬性;
       3. JMS Provider 需要用到的屬性。
       標準的JMS 消息頭包含以下屬性:

    JMSDestination

    消息發送的目的地

    JMSDeliveryMode

    傳遞模式, 有兩種模式: PERSISTENT 和NON_PERSISTENT,PERSISTENT 表示該消息一定要被送到目的地,否則會導致應用錯誤。NON_PERSISTENT 表示偶然丟失該消息是被允許的,這兩種模式使開發者可以在消息傳遞的可靠性和吞吐量之間找到平衡點。

    JMSMessageID

    唯一識別每個消息的標識,由JMS Provider 產生。

    JMSTimestamp

    一個消息被提交給JMS Provider 到消息被發出的時間。

    JMSCorrelationID

    用來連接到另外一個消息,典型的應用是在回復消息中連接到原消息。

    JMSReplyTo

    提供本消息回復消息的目的地址

    JMSRedelivered

    如果一個客戶端收到一個設置了JMSRedelivered 屬性的消息,則表示可能該客戶端曾經在早些時候收到過該消息,但并沒有簽收(acknowledged)。

    JMSType

    消息類型的識別符。

    JMSExpiration

    消息過期時間,等于QueueSender 的send 方法中的timeToLive 值或TopicPublisher 的publish 方法中的timeToLive 值加上發送時刻的GMT 時間值。如果timeToLive值等于零,則JMSExpiration 被設為零,表示該消息永不過期。如果發送后,在消息過期時間之后消息還沒有被發送到目的地,則該消息被清除。

    JMSPriority

    消息優先級,從0-9 十個級別,0-4 是普通消息,5-9 是加急消息。JMS 不要求JMS Provider 嚴格按照這十個優先級發送消息,但必須保證加急消息要先于普通消息到達。

     

     

     

     

     

     

     

     

     

     



    3.3 消息體(Body) - JMS API 定義了5種消息體格式,也叫消息類型,你可以使用不同形式發送接收 數據并可以兼容現有的消息格式,下面描述這5種類型:

    消息類型

    消息體

    TextMessage

    java.lang.String對象,如xml文件內容

    MapMessage

    名/值對的集合,名是String對象,值類型可以是Java任何基本類型

    BytesMessage

    字節流

    StreamMessage

    Java中的輸入輸出流

    ObjectMessage

    Java中的可序列化對象

    Message

    沒有消息體,只有消息頭和屬性













    下例演示創建并發送一個TextMessage到一個隊列:
    TextMessage message = queueSession.createTextMessage();
    message.setText(msg_text); // msg_text is a String
    queueSender.send(message);

    下例演示接收消息并轉換為合適的消息類型:
    Message m = queueReceiver.receive();
    if (m instanceof TextMessage) {
     TextMessage message = (TextMessage) m;
     System.out.println("Reading message: " + message.getText());
    } else {
     // Handle error
    }

    4. 消息的同步異步接收
       消息的同步接收是指客戶端主動去接收消息,JMS 客戶端可以采用MessageConsumer 的receive方法去接收下一個消息。
       消息的異步接收是指當消息到達時,主動通知客戶端。JMS 客戶端可以通過注冊一個實 現MessageListener 接口的對象到MessageConsumer,這樣,每當消息到達時,JMS Provider 會調用MessageListener中的onMessage 方法。

    5. PTP模型
    PTP(Point-to-Point)模型是基于隊列的,發送方發消息到隊列,接收方從隊列接收消息,隊列的存在使得消息的異步傳輸成為可能。和郵件系統中的郵箱一樣,隊列可以包含各種消息,JMS Provider 提 供工具管理隊列的創建、刪除。JMS PTP 模型定義了客戶端如何向隊列發送消息,從隊列接收消息,瀏覽隊列中的消息。
       下面描述JMS PTP 模型中的主要概念和對象:

    名稱

    描述

    Queue

    由JMS Provider 管理,隊列由隊列名識別,客戶端可以通過JNDI 接口用隊列名得到一個隊列對象。

    TemporaryQueue

    由QueueConnection 創建,而且只能由創建它的QueueConnection 使用。

    QueueConnectionFactory

    客戶端用QueueConnectionFactory 創建QueueConnection 對象。

    QueueConnection

    一個到JMS PTP provider 的連接,客戶端可以用QueueConnection 創建QueueSession 來發送和接收消息。

    QueueSession

    提供一些方法創建QueueReceiver 、QueueSender、QueueBrowser 和TemporaryQueue。如果在QueueSession 關閉時,有一些消息已經被收到,但還沒有被簽收(acknowledged),那么,當接收者下次連接到相同的隊列時,這些消息還會被再次接收。

    QueueReceiver

    客戶端用QueueReceiver 接收隊列中的消息,如果用戶在QueueReceiver 中設定了消息選擇條件,那么不符合條件的消息會留在隊列中,不會被接收到。

    QueueSender

    客戶端用QueueSender 發送消息到隊列。

    QueueBrowser

    客戶端可以QueueBrowser 瀏覽隊列中的消息,但不會收走消息。

    QueueRequestor

    JMS 提供QueueRequestor 類簡化消息的收發過程。QueueRequestor 的構造函數有兩個參數:QueueSession 和queue,QueueRequestor 通過創建一個臨時隊列來完成最終的收發消息請求。

    可靠性(Reliability)

    隊列可以長久地保存消息直到接收者收到消息。接收者不需要因為擔心消息會丟失而時刻和隊列保持激活的連接狀態,充分體現了異步傳輸模式的優勢。



                  
              
      
     

     

     

     

     

     

     

     

     


    6. PUB/SUB模型
    JMS Pub/Sub 模型定義了如何向一個內容節點發布和訂閱消息,這些節點被稱作主題(topic)。
       主題可以被認為是消息的傳輸中介,發布者(publisher)發布消息到主題,訂閱者(subscribe)從主題訂閱消息。主題使得消息訂閱者和消息發布者保持互相獨立,不需要接觸即可保證消息的傳送。
       下面描述JMS Pub/Sub 模型中的主要概念和對象:

    名稱

    描述

    訂閱(subscription)

    消息訂閱分為非持久訂閱(non-durable subscription)和持久訂閱(durable subscrip-tion),非持久訂閱只有當客戶端處于激活狀態,也就是和JMS Provider 保持連接狀態才能收到發送到某個主題的消息,而當客戶端處于離線狀態,這個時間段發到主題的消息將會丟失,永遠不會收到。持久訂閱時,客戶端向JMS 注冊一個識別自己身份的ID,當這個客戶端處于離線時,JMS Provider 會為這個ID 保存所有發送到主題的消息,當客戶再次連接到JMS Provider時,會根據自己的ID 得到所有當自己處于離線時發送到主題的消息。

    Topic

    主題由JMS Provider 管理,主題由主題名識別,客戶端可以通過JNDI 接口用主題名得到一個主題對象。JMS 沒有給出主題的組織和層次結構的定義,由JMS Provider 自己定義。

    TemporaryTopic

    臨時主題由TopicConnection 創建,而且只能由創建它的TopicConnection 使用。臨時主題不能提供持久訂閱功能。

    TopicConnectionFactory

    客戶端用TopicConnectionFactory 創建TopicConnection 對象。

    TopicConnection

    TopicConnection 是一個到JMS Pub/Sub provider 的連接,客戶端可以用TopicConnection創建TopicSession 來發布和訂閱消息。

    TopicSession

    TopicSession 提供一些方法創建TopicPublisher、TopicSubscriber、TemporaryTopic 。它還提供unsubscribe 方法取消消息的持久訂閱。

    TopicPublisher

    客戶端用TopicPublisher 發布消息到主題。

    TopicSubscriber

    客戶端用TopicSubscriber 接收發布到主題上的消息??梢栽赥opicSubscriber 中設置消息過濾功能,這樣,不符合要求的消息不會被接收。

    Durable TopicSubscriber

    如果一個客戶端需要持久訂閱消息,可以使用Durable TopicSubscriber,TopSession 提供一個方法createDurableSubscriber創建Durable TopicSubscriber 對象。

    恢復和重新派送(Recovery and Redelivery)

    非持久訂閱狀態下,不能恢復或重新派送一個未簽收的消息。只有持久訂閱才能恢復或重新派送一個未簽收的消息。

    TopicRequestor

    JMS 提供TopicRequestor 類簡化消息的收發過程。TopicRequestor 的構造函數有兩個參數:TopicSession 和topic。TopicRequestor 通過創建一個臨時主題來完成最終的發布和接收消息請求。

    可靠性(Reliability)

    當所有的消息必須被接收,則用持久訂閱模式。當丟失消息能夠被容忍,則用非持久訂閱模式。

     

     

     

     

     

     

     


     

     


     
     
     
     
     
     
     
     
     




    7. 開發JMS的步驟
       廣義上說,一個JMS 應用是幾個JMS 客戶端交換消息,開發JMS 客戶端應用由以下幾步構成:
    用JNDI 得到ConnectionFactory 對象;
    用JNDI 得到目標隊列或主題對象,即Destination 對象;
    用ConnectionFactory 創建Connection 對象;
    用Connection 對象創建一個或多個JMS Session;
    用Session 和Destination 創建MessageProducer 和MessageConsumer;
    通知Connection 開始傳遞消息。

    posted @ 2007-04-11 16:41 rednight 閱讀(342) | 評論 (0)編輯 收藏

    Some XA JDBC drivers do not support local transaction operations, which can cause an error similar to the following when optimistic concurrency is used with such a driver:

    SQL operations are not allowed with no global transaction by default for XA drivers.

    In other words, the error will occur when SupportsLocalTransactions="true" is specified for the JDBCConnectionPool.

    This problem occurs because optimistic concurrency suspends a global transaction and does reads in a local transaction when the database is not Oracle. (When using Oracle, you can avoid this problem by explicitly setting <database-type>Oracle</database-type> in your CMP deployment descriptor.)

    Workaround : Use the "RollbackLocalTxUponConnClose" on the JDBCConnection.

    posted @ 2007-03-06 12:49 rednight 閱讀(233) | 評論 (0)編輯 收藏

    在談到 XA 規范之前,必須首先了解分布式事務處理( Distributed Transaction Processing , DTP )的概念。 Transaction ,即事務,又稱之為交易,指一個程序或程序段,在一個或多個資源如 數據庫 或文件上為完成某些功能的執行過程的集合。 LU 人的博客 )vqfhOBA
      分布式事務處理是指一個事務可能涉及多個數據庫操作,分布式事務處理的關鍵是必須有一種方法可以知道事務在任何地方所做的所有動作,提交或回滾事務的決定必須產生統一的結果(全部提交或全部回滾)。
      X/Open 組織(即現在的 Open Group )定義了分布式事務處理模型。 X/Open DTP 模型( 1994 )包括應用程序( AP )、事務管理器( TM )、資源管理器( RM )、通信資源管理器( CRM )四部分。一般,常見的事務管理器( TM )是交易中間件,常見的資源管理器( RM )是數據庫,常見的通信資源管理器( CRM )是消息中間件。
      通常把一個數據庫內部的事務處理,如對多個表的操作,作為本地事務看待。數據庫的事務處理對象是本地事務,而分布式事務處理的對象是全局事務。

    所謂全局事務,是指分布式事務處理環境中,多個數據庫可能需要共同完成一個工作,這個工作即是一個全局事務,例如,一個事務中可能更新幾個不同的數據庫。對數據庫的操作發生在系統的各處但必須全部被提交或回滾。此時一個數據庫對自己內部所做操作的提交不僅依賴本身操作是否成功,還要依賴與全局事務相關的其它數據庫的操作是否成功,如果任一數據庫的任一操作失敗,則參與此事務的所有數據庫所做的所有操作都必須回滾。 LU 人的博客 8v:d?(~;~$A-Q9V D
      一般情況下,某一數據庫無法知道其它數據庫在做什么,因此,在一個 DTP 環境中,交易中間件是必需的,由它通知和協調相關數據庫的提交或回滾。而一個數據庫只將其自己所做的操作(可恢復)影射到全局事務中。

       XA 就是 X/Open DTP 定義的交易中間件與數據庫之間的接口規范(即接口函數),交易中間件用它來通知數據庫事務的開始、結束以及提交、回滾等。 XA 接口函數由數據庫廠商提供。

    XA
    與兩階段提交協議

      通常情況下,交易中間件與數據庫通過 XA 接口規范,使用兩階段提交來完成一個全局事務, XA 規范的基礎是兩階段提交協議。
      在第一階段,交易中間件請求所有相關數據庫準備提交(預提交)各自的事務分支,以確認是否所有相關數據庫都可以提交各自的事務分支。當某一數據庫收到預提交后,如果可以提交屬于自己的事務分支,則將自己在該事務分支中所做的操作固定記錄下來,并給交易中間件一個同意提交的應答,此時數據庫將不能再在該事務分支中加入任何操作,但此時數據庫并沒有真正提交該事務,數據庫對共享資源的操作還未釋放(處于上鎖狀態)。如果由于某種原因數據庫無法提交屬于自己的事務分支,它將回滾自己的所有操作,釋放對共享資源上的鎖,并返回給交易中間件失敗應答。 在第二階段,交易中間件審查所有數據庫返回的預提交結果,如所有數據庫都可以提交,交易中間件將要求所有數據庫做正式提交,這樣該全局事務被提交。而如果有任一數據庫預提交返回失敗,交易中間件將要求所有其它數據庫回滾其操作,這樣該全局事務被回滾。
      以一個全局事務為例, AP 首先通知交易中間件開始一個全局事務,交易中間件通過 XA 接口函數通知數據庫開始事務,然后 AP 可以對數據庫管理的資源進行操作,數據庫系統記錄事務對本地資源的所有操作。操作完成后交易中間件通過 XA 接口函數通知數據庫操作完成。交易中間件負責記錄 AP 操作過哪些數據庫(事務分支)。 AP 根據情況通知交易中間件提交該全局事務,交易中間件會通過 XA 接口函數要求各個數據庫做預提交,所有數據庫返回成功后要求各個數據庫做正式提交,此時一筆全局事務結束。

       XA 規范對應用來說,最大好處在于事務的完整性由交易中間件和數據庫通過 XA 接口控制, AP 只需要關注與數據庫的應用邏輯的處理,而無需過多關心事務的完整性,應用設計開發會簡化很多。
      具體來說,如果沒有交易中間件,應用系統需要在程序內部直接通知數據庫開始、結束和提交事務,當出現異常情況時必須由專門的程序對數據庫進行反向操作才能完成回滾。如果是有很多事務分支的全局事務,回滾時情況將變得異常復雜。而使用 XA 接口,則全局事務的提交是由交易中間件控制,應用程序只需通知交易中間件提交或回滾事務,就可以控制整個事務(可能涉及多個異地的數據庫)的全部提交或回滾,應用程序完全不用考慮沖正邏輯。
      在一個涉及多個數據庫的全局事務中,為保證全局事務的完整性,由交易中間件控制數據庫做兩階段提交是必要的。但典型的兩階段提交,對數據庫來說事務從開始到結束(提交或回滾)時間相對較長,在事務處理期間數據庫使用的資源(如邏輯日志、各種鎖),直到事務結束時才會釋放。因此,使用典型的兩階段提交相對來說會占用更多的資源,在網絡條件不是很好,如低速網、網絡顛簸頻繁,情況會更為嚴重。
      當一個全局事務只涉及一個數據庫時,有一種優化方式,即一階段提交。當 AP 通知交易中間件提交事務時,交易中間件直接要求數據庫提交事務,省去兩階段提交中的第一階段,可以縮短處理一個事務的時間,以提高事務處理的效率。作為兩階段提交的一種特例,與兩階段一樣,一階段提交也是標準的。

    posted @ 2007-03-06 10:11 rednight 閱讀(11408) | 評論 (6)編輯 收藏

    If you encountered “ Cannot call Connection.commit in distributed transaction ” error, should check the weblogic connection pool and the datasource

    ?

    If the connection pool is XA,

    you should make sure that when you create the datasource to make it XA by select the check from "Honor Global Transaction" from the weblogic console.(default is selected)

    If the connection pool is non-XA

    you should make sure that when you create the datasource to make it non-XA by remove the check from "Honor Global Transaction" from the weblogic console.

    posted @ 2007-03-06 09:58 rednight 閱讀(2492) | 評論 (2)編輯 收藏

    主站蜘蛛池模板: 美女扒开尿口给男人爽免费视频| 特a级免费高清黄色片 | 在线观看免费视频资源| 亚洲日本VA午夜在线电影| 亚洲精品高清在线| 8x8×在线永久免费视频| 综合一区自拍亚洲综合图区| 亚洲熟妇中文字幕五十中出| 四虎免费影院ww4164h| 污网站免费在线观看| 亚洲视频一区在线播放| 免费国产小视频在线观看| 99re在线免费视频| 黄色免费在线网址| 亚洲w码欧洲s码免费| 久久久青草青青国产亚洲免观 | 国产成人免费福利网站| 国产偷伦视频免费观看| 亚洲成熟丰满熟妇高潮XXXXX| 国产成人精品日本亚洲网站 | 亚洲精品日韩专区silk| 免费一看一级毛片全播放| 最近中文字幕mv免费高清在线| 狼人大香伊蕉国产WWW亚洲| 亚洲视频在线免费播放| 在线观看亚洲成人| 国产青草视频免费观看97| 性色午夜视频免费男人的天堂| 麻豆91免费视频| 亚洲国产精品一区二区三区在线观看| 亚洲日韩激情无码一区| 国产一区二区三区免费视频| 国内精品免费麻豆网站91麻豆| 曰批全过程免费视频在线观看无码 | 亚洲AV无一区二区三区久久| 波多野结衣视频在线免费观看| 91精品免费国产高清在线| 高清一区二区三区免费视频| 一级毛片完整版免费播放一区| 亚洲综合精品第一页| 亚洲五月综合缴情婷婷|