国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

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

2019-11-18 13:02:33
字體:
來源:轉載
供稿:網友

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

  上面顯示通過farm的方式,部署了一個名為GlobalDS的連接池,以及一個名為TestJms的消息bean。
  
  下面寫個客戶端來測試一下:
  
  SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
  
  Properties p = new Properties();
  
  p.put(Context.INITIAL_CONTEXT_FACTORY,
  
  "org.jnp.interfaces.NamingContextFactory");
  p.put(Context.URL_PKG_PREFIXES, "jboss.naming:org.jnp.interfaces");
  
  p.put(Context.PROVIDER_URL, "172.16.0.116:1100"); // 全局jndi入口
  
  InitialContext ctx = new InitialContext(p);
  
  QueueConnectionFactory qcf = (QueueConnectionFactory) ctx.lookup(
  
  "ConnectionFactory");
  
  QueueConnection conn = qcf.createQueueConnection();
  
  Queue q = (Queue) ctx.lookup("queue/test");//查詢名為test的destination
  
  Queue
session session = conn.createQueueSession(false,
  
  QueueSession.AUTO_ACKNOWLEDGE);
  
  conn.start();
  
  QueueSender sender = session.createSender(q);
  
  for (int i = 0; i < 10000; i++) {
  
  TextMessage tm = session.createTextMessage(sdf.format(new Date()));
  
  sender.send(tm, DeliveryMode.PERSISTENT, 4, 0);//發送持久化消息
  
  System.out.print("第" + i);
  
  }
  
  conn.stop();
  
  session.close();
  
  conn.close();
  
  執行一下,可以看到每個節點都創建了若干個消息bean,同時在處理消息,任意關閉一個次服務器,系統會自動fail over。查看Jms_message_log數據表,里面沒有任何數據,表示所有的消息都已經被處理。
  
  Jboss的jms cluster功能與websphere mq比較起來,是非常簡陋的,可以配置的地方也很少,究竟是免費的東西。Jboss的論壇上透露,在jboss 6.0中將會有全新的jboss messaging服務,不知要等到何年何月。針對這個cluster,我做過簡單的測試,800萬左右的消息數量,無一丟失,應該說還算比較可靠。響應時間也還過的去,在簡單的網絡環境下,能夠應付比較高的并發。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 隆子县| 长白| 读书| 明光市| 黄大仙区| 舞钢市| 玉林市| 牡丹江市| 新绛县| 枣阳市| 根河市| 佛山市| 亚东县| 西乡县| 奉节县| 楚雄市| 广南县| 长宁区| 探索| 城固县| 泰来县| 江津市| 石柱| 汝城县| 永宁县| 沭阳县| 卓尼县| 牡丹江市| 泰宁县| 昭平县| 博爱县| 台州市| 平远县| 东平县| 万州区| 静安区| 黔东| 安泽县| 台北县| 万载县| 临西县|