熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Java編程 >> Java開源技術 >> 正文

JBoss 4.0.2集群指南 建立JMS集群服務(圖)

2013-11-23 20:40:18  來源: Java開源技術 

  Jms集群的意義在於提升系統在處理消息時的並發能力建立這樣的集群有三個步驟
  
    配置jms消息持久化所使用的數據庫
  
    配置分布式的jndi環境
  
    配置分布式jms
  
  在jboss 系統采用hibernate的方式來保存消息所以能夠兼容hibernate支持的所有數據庫Jboss默認采用hsql在我們的例子中將使用oracle 首先需要配置連接到數據庫的jndi數據源方法是把doc\examples\jca下的oracledsxml文件拷貝到server\all\farm下並且修改其中的參數保證數據庫能夠正確連接Cluster啟動後該文件能夠通過jboss的farm服務自動拷貝到其他集群節點並且自動部署假設jndi數據源的名稱為GlobalDS
  
  將doc\examples\jms下的oraclejdbcservicexml文件拷貝到server\all\deployhasingleton\jms目錄下並且刪除該目錄下的hsqldbjdbcservicexml修改oraclejdbcservicexml行左右指定name的值為數據源的名字GlobalDS這樣系統會使用該數據源來保存jms消息使用如下命令啟動boss:  run ?c all
  
  啟動完成後正常情況下會發現oracle數據庫中多出了三張表
  
  Jms_message_log    該表用於保存所有未處理的點對點消息表結構是
  
  Messageid     消息id
  
  Destination    目的地
  
  Txid      事務id
  
  Txop      消息操作類型(a為新增d為刪除)
  
  Messageblob    消息內容
  
  JMS_REFERENCE_LOG  用於保存所有未處理的topic消息表結構是
  
  Messageid
  
  Destination
  
  Txid
  
  Txop
  
  Messageblob
  
  Redelivered    消息是否被重發
  
  JMS_TRANSACTION_LOG  用於保存處理消息過程中的一些重要的事務
  
  需要注意的是jboss 之後就不在支持以文件形式保存消息雖然這樣最會比數據庫操作快一倍以上Jboss官方的解釋是使用文件會讓系統不可靠
  
  客戶端在發送jms消息的時候首先需要向app server查詢jndi在jboss cluster中jndi是作為一個分布式的singleton出現的每個節點除了有自己的jndi環境以外整個cluster還具有一些全局的jndi客戶端在進行jndi查詢的時候只需要向這個全局的jndi進行查詢cluster如果在全局jndi中找不到對應的jndi對象就會按次序向每個節點詢問看他們的本地jndi中是否有匹配的對象如果有則返回給客戶如果所有的節點都沒有則拋出異常所有以all方式啟動的jboss都會打開端口這個端口是全局jndi的入口所有節點都是如此
  
  分布式的jndi有的節點有主次的區別第一個啟動的jboss是主服務器它會保存所有的全局jndi其他的節點如果收到客戶查詢jndi的請求後都會向主服務器請求數據如果主服務器不幸down掉那麼次節點會發現這個變化然後啟動自己的jndi環境取代主服務器提供服務
  
  下面是配置jms的jndi打開server\all\deployhasingleton\jms下的jbossmqdestinationsservicexml文件增加一個名為test的destination如下
  
  <mbean code=orgjbossmqserverjmxQueue
  
  name=jbossmqdestination:service=Queuename=test>
  
  <depends optionalattributename=DestinationManager>jbossmq:service=DestinationManager</depends>
  
  </mbean>
  
  為了預防主服務器down了之後丟失該jndi所以最好在每個節點都進行這個配置
  
  在jboss 的默認配置下是不支持消息bean的集群的要達到這個目的必須下載一個jar包才能實現可以從這裡獲得:
  
  得到這個jar文件後將它命名為cdotjbossxjar
  
  文件放到server\all\deploy\jms下下面編寫消息bean它的功能很簡單接收到來自test隊列的消息後打印消息id
  
  public class TestJmsBean
  
  implements MessageDrivenBean MessageListener {
  
  MessageDrivenContext messageDrivenContext;
  
  public void ejbCreate() {
  
  Systemoutprintln(消息bean創建);
  
  }
  
  public void ejbRemove() {
  
  }
  public void onMessage(Message msg) {
  
  try
  
  {
  
  Systemoutprintln(msggetJMSMessageID());
  
  }catch(Exception e)
  
  {
  
  eprintStackTrace();
  
  }
  
  }
  public void setMessageDrivenContext(MessageDrivenContext messageDrivenContext) {
  
  ssageDrivenContext = messageDrivenContext;
  
  }
  
  }
  
  把這個消息bean部署到server\all\farm目錄下它會被自動拷貝到cluster的其它節點並且被自動部署你會看到如下部署信息
  
educitycn/img_///jpg >

  上面顯示通過farm的方式部署了一個名為GlobalDS的連接池以及一個名為TestJms的消息bean
  
  下面寫個客戶端來測試一下
  
  SimpleDateFormat sdf = new SimpleDateFormat(yyyyMMdd HH:mm:ss);
  
  Properties p = new Properties();
  
  pput(ContextINITIAL_CONTEXT_FACTORY
  
  orgjnpinterfacesNamingContextFactory);
  pput(ContextURL_PKG_PREFIXES jbossnaming:orgjnpinterfaces);
  
  pput(ContextPROVIDER_URL :); // 全局jndi入口
  
  InitialContext ctx = new InitialContext(p);
  
  QueueConnectionFactory qcf = (QueueConnectionFactory) ctxlookup(
  
  ConnectionFactory);
  
  QueueConnection conn = qcfcreateQueueConnection();
  
  Queue q = (Queue) ctxlookup(queue/test);//查詢名為test的destination
  
  QueueSession session = conncreateQueueSession(false
  
  QueueSessionAUTO_ACKNOWLEDGE);
  
  connstart();
  
  QueueSender sender = sessioncreateSender(q);
  
  for (int i = ; i < ; i++) {
  
  TextMessage tm = sessioncreateTextMessage(sdfformat(new Date()));
  
  sendersend(tm DeliveryModePERSISTENT );//發送持久化消息
  
  Systemoutprint( + i);
  
  }
  
  connstop();
  
  sessionclose();
  
  connclose();
  
  執行一下可以看到每個節點都創建了若干個消息bean同時在處理消息任意關閉一個次服務器系統會自動fail over查看Jms_message_log數據表裡面沒有任何數據表示所有的消息都已經被處理
  
  Jboss的jms cluster功能與websphere mq比較起來是非常簡陋的可以配置的地方也很少畢竟是免費的東西Jboss的論壇上透露在jboss 中將會有全新的jboss messaging服務不知要等到何年何月針對這個cluster我做過簡單的測試萬左右的消息數量無一丟失應該說還算比較可靠響應時間也還過的去在簡單的網絡環境下能夠應付比較高的並發
From:http://tw.wingwit.com/Article/program/Java/ky/201311/28870.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.