JMS(Jboss Messaging)的一點使用心得(十三)拔網線後的重連----JMS Connection原理淺析及應用

    在前面的文章裏,我們介紹了可以自動重連的JmsMessageListenerContainer,自動重連的原理就是利用了JMS Connction的ExceptionListen機制。現在我們討論一下Jms Connection的簡單原理及應用。
    Jboss Messaging管理了兩組Connection,Server端的和Client端的;其實他們都是一個東西,因爲連接都是相互的嘛。
    Server端的Connection管理是利用[org.jboss.jms.server.connectionfactory.ConnectionFactory]實現的,大家可以在[/jboss-4.2.2.GA/server/messaging1.4SP3/deploy/jboss-messaging.sar/connection-factories-service.xml]裏配置它,大家也可以通過源碼來研究。不管是Serber端還是Client端都從這個Factory裏面拿Jms Connection。
    另外,對Client的Jms Connction還有一個設置,就是[org.jboss.remoting.transport.Connector]的設置,它配置在[/jboss-4.2.2.GA/server/messaging1.4SP3/deploy/jboss-messaging.sar/remoting-bisocket-service.xml]裏。
    根據Jboss Messaging的默認配置,Server端Jms Connection的每隔30秒會去Check一下所有的JMS 連接,如果發現連接錯誤,則該連接就會被回收,以提供給其他的Client端使用。這樣做是爲了避免出現大量無用連接而耗費系統資源。而Client端的連接自動Check間隔爲5分鐘,就是說如果直到Client端和Server端的連接斷掉5分鐘後,纔會觸發Client端Jms Connection的onException。
    這樣就會出現一種可能,假如Client端和Server端的網線中斷時間在30秒~5分鐘之間,Server端已經回收了該連接,而Client卻認爲這個連接仍然OK,那Client端就永遠收不到Jms消息了...
     我們可以通過修改設置來解決這個問題。首先看看Server端,考慮到Server端的性能和穩定性,我們決定不做修改。只有改Client端了。如果我們讓Client的連接Check時間小於或者等於30秒,比如說29秒,就可以解決這個問題。於是我們可以做以下修改:
1. connection-factories-service.xml
<?xml version="1.0" encoding="UTF-8"?>

<!--
     Messaging Connection Factories deployment descriptor.

     $Id: connection-factories-service.xml 3201 2007-10-19 10:39:50Z timfox $
 
-->

<server>

   
<!-- The default connection factory does not support automatic failover or load balancing-
        this is so we can maintain compatiblity with applications written for JBoss MQ which use this
        connection factory.
   
-->     
   
<mbean code="org.jboss.jms.server.connectionfactory.ConnectionFactory"
      name
="jboss.messaging.connectionfactory:service=ConnectionFactory"
      xmbean-dd
="xmdesc/ConnectionFactory-xmbean.xml">
      
<depends optional-attribute-name="ServerPeer">jboss.messaging:service=ServerPeer</depends>
      
<depends optional-attribute-name="Connector">jboss.messaging:service=Connector,transport=bisocket</depends>
      
<depends>jboss.messaging:service=PostOffice</depends>

      
<attribute name="SupportsFailover">true</attribute>
      
<!--不需要系統接管RemotingCheck-->
      
<attribute name="DisableRemotingChecks">true</attribute>
      
      
<attribute name="JNDIBindings">
         
<bindings>
            
<binding>/ConnectionFactory</binding>
            
<binding>/XAConnectionFactory</binding>
            
<binding>java:/ConnectionFactory</binding>
            
<binding>java:/XAConnectionFactory</binding>
         
</bindings>
      
</attribute>
   
</mbean>

   
<!-- A clustered connection factory that supports automatic failover and load balancing of created
        connections.
        This factory is not suitable to be used by MDBs.
   
-->
   
<mbean code="org.jboss.jms.server.connectionfactory.ConnectionFactory"
      name
="jboss.messaging.connectionfactory:service=ClusteredConnectionFactory"
      xmbean-dd
="xmdesc/ConnectionFactory-xmbean.xml">
      
<depends optional-attribute-name="ServerPeer">jboss.messaging:service=ServerPeer</depends>
      
<depends optional-attribute-name="Connector">jboss.messaging:service=Connector,transport=bisocket</depends>
      
<depends>jboss.messaging:service=PostOffice</depends>
      
<attribute name="DisableRemotingChecks">true</attribute>

      
<attribute name="JNDIBindings">
         
<bindings>
            
<binding>/ClusteredConnectionFactory</binding>
            
<binding>/ClusteredXAConnectionFactory</binding>
            
<binding>java:/ClusteredConnectionFactory</binding>
            
<binding>java:/ClusteredXAConnectionFactory</binding>
         
</bindings>
      
</attribute>

      
<attribute name="SupportsFailover">true</attribute>
      
<attribute name="SupportsLoadBalancing">true</attribute>      
   
</mbean>
   
   
<!-- A connection factory with no JNDI bindings that is used in clustering to create the connections that
        pull messages from one node to another
   
-->
   
<mbean code="org.jboss.jms.server.connectionfactory.ConnectionFactory"
      name
="jboss.messaging.connectionfactory:service=ClusterPullConnectionFactory"
      xmbean-dd
="xmdesc/ConnectionFactory-xmbean.xml">
      
<depends optional-attribute-name="ServerPeer">jboss.messaging:service=ServerPeer</depends>
      
<depends optional-attribute-name="Connector">jboss.messaging:service=Connector,transport=bisocket</depends>
      
<depends>jboss.messaging:service=PostOffice</depends>
      
<attribute name="SupportsFailover">false</attribute>
      
<attribute name="SupportsLoadBalancing">false</attribute>
      
<attribute name="DisableRemotingChecks">true</attribute>
   
</mbean>
   
   
<!-- An example connection factory with all attributes shown 
   
   <mbean code="org.jboss.jms.server.connectionfactory.ConnectionFactory"
      name="jboss.messaging.connectionfactory:service=MyExampleConnectionFactory"
      xmbean-dd="xmdesc/ConnectionFactory-xmbean.xml">
      
      <constructor>
      
         <!- - You can specify the default Client ID to use for connections created using this factory - -> 
         
         <arg type="java.lang.String" value="MyClientID"/>
         
      </constructor>
      
      <depends optional-attribute-name="ServerPeer">jboss.messaging:service=ServerPeer</depends>
      
      <!- - The transport to use - can be bisocket, sslbisocket or http - ->
      
      <depends optional-attribute-name="Connector">jboss.messaging:service=Connector,transport=http</depends>
      
      <depends>jboss.messaging:service=PostOffice</depends>
      
      <!- - PrefetchSize determines the approximate maximum number of messages the client consumer will buffer locally - ->
      
      <attribute name="PrefetchSize">150</attribute>
      
      <!- - Paging params to be used for temporary queues - ->
      
      <attribute name="DefaultTempQueueFullSize">200000</attribute>
      
      <attribute name="DefaultTempQueuePageSizeSize">2000</attribute>
      
      <attribute name="DefaultTempQueueDownCacheSize">2000</attribute>
      
      <!- - The batch size to use when using the DUPS_OK_ACKNOWLEDGE acknowledgement mode - ->
      
      <attribute name="DupsOKBatchSize">5000</attribute>
      
      <!- - Does this connection factory support automatic failover? - ->
      
      <attribute name="SupportsFailover">false</attribute>
      
      <!- - Does this connection factory support automatic client side load balancing? - ->
      
      <attribute name="SupportsLoadBalancing">false</attribute>  
            
      <!- - The class name of the factory used to create the load balancing policy to use on the client side - ->
      
      <attribute name="LoadBalancingFactory">org.jboss.jms.client.plugin.RoundRobinLoadBalancingFactory</attribute>  

      <!- - Whether we should be strict TCK compliant, i.e. how we deal with foreign messages, defaults to false- ->

      <attribute name="StrictTck">true</attribute>
      
      <!- - Disable JBoss Remoting Connector sanity checks - There is rarely a good reason to set this to true - ->
      
      <attribute name="DisableRemotingChecks">false</attribute>

      <!- - The connection factory will be bound in the following places in JNDI - ->

      <attribute name="JNDIBindings">
      
         <bindings>
         
            <binding>/acme/MyExampleConnectionFactory</binding>
            
            <binding>/acme/MyExampleConnectionFactoryDupe</binding>
            
            <binding>java:/xyz/CF1</binding>
            
            <binding>java:/connectionfactories/acme/connection_factory</binding>
            
         </bindings>
         
      </attribute>   
       
   </mbean>
   
   
-->

</server>

2. remoting-bisocket-service.xml
<?xml version="1.0" encoding="UTF-8"?>

<!--
     Standard bisocket-based Remoting service deployment descriptor.

     $Id: remoting-bisocket-service.xml 3409 2007-12-04 21:32:54Z timfox $
 
-->

<server>

   
<!-- Standard bisocket connector - the bisocket transport only opens connection from client->server
        so can be used with firewalls where only outgoing connections are allowed.
        For examples of HTTP and SSL transports see docs/examples 
-->
   
<mbean code="org.jboss.remoting.transport.Connector"
          name
="jboss.messaging:service=Connector,transport=bisocket"
          display-name
="Bisocket Transport Connector">
      
<attribute name="Configuration">
         
<config>
            
<invoker transport="bisocket">
            
               
<!-- There should be no reason to change these parameters - warning!
                    Changing them may stop JBoss Messaging working correctly 
-->            
               
<attribute name="marshaller" isParam="true">org.jboss.jms.wireformat.JMSWireFormat</attribute>
               
<attribute name="unmarshaller" isParam="true">org.jboss.jms.wireformat.JMSWireFormat</attribute>
               
<attribute name="dataType" isParam="true">jms</attribute>
               
<attribute name="socket.check_connection" isParam="true">false</attribute>
               
<!--把Timeout時間修改爲29秒,小於30秒-->
               
<attribute name="timeout" isParam="true">29000</attribute>
               
<attribute name="serverBindAddress">${jboss.bind.address}</attribute>
               
<attribute name="serverBindPort">4457</attribute>
               
<attribute name="clientSocketClass" isParam="true">org.jboss.jms.client.remoting.ClientSocketWrapper</attribute>
               
<attribute name="serverSocketClass">org.jboss.jms.server.remoting.ServerSocketWrapper</attribute>
               
<attribute name="numberOfCallRetries" isParam="true">1</attribute>
               
<attribute name="pingFrequency" isParam="true">214748364</attribute>
               
<attribute name="pingWindowFactor" isParam="true">10</attribute>
               
<attribute name="onewayThreadPool">org.jboss.jms.server.remoting.DirectThreadPool</attribute>
               
<!-- End immutable parameters -->
               
               
<!-- Periodicity of client pings. Server window by default is twice this figure -->                               
               
<attribute name="clientLeasePeriod" isParam="true">10000</attribute>

               
<!-- Number of seconds to wait for a connection in the client pool to become free -->
               
<attribute name="numberOfRetries" isParam="true">10</attribute>

               
<!-- Max Number of connections in client pool. This should be significantly higher than
                    the max number of sessions/consumers you expect 
-->
               
<attribute name="JBM_clientMaxPoolSize" isParam="true">200</attribute>
               
               
<!-- Use these parameters to specify values for binding and connecting control connections to 
                    work with your firewall/NAT configuration
               <attribute name="secondaryBindPort">xyz</attribute>                           
               <attribute name="secondaryConnectPort">abc</attribute>               
               
-->
                          
            
</invoker>
            
<handlers>
               
<handler subsystem="JMS">org.jboss.jms.server.remoting.JMSServerInvocationHandler</handler>
            
</handlers>
         
</config>
      
</attribute>
   
</mbean>

</server>

問題解決。OK!
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章