2013-01-17 105 views
1

客戶使用此模式:Spring MDP:輪詢間隔?

  • Apache的駱駝和CXF JMS接收器
  • 這些內部使用Spring的MDP(消息驅動的POJO)來實現他們的信息接收器
  • 他們被部署在IBM WebSphere Application Server上7
  • 隊列管理器是IBM Websphere MQ 6
  • Spring MDP使用JNDI隊列連接工廠綁定到隊列管理器 - 支持連接池和會話池

這裏是,這個人是使用駱駝這樣的消息接收器的一個示例:

<bean id="ibmmq" class="org.apache.camel.component.jms.JmsComponent"> 
    <property name="configuration" ref="jmsConfig"/> 
</bean> 

<!-- JNDI reference to the queue manager --> 
<jee:jndi-lookup id="myTargetConnectionFactory" jndi-name="${mq.queueconnectionfactory}"/> 

<bean id="jmsDestResolver" class="org.springframework.jms.support.destination.JndiDestinationResolver"/> 

<bean id="myConnectionFactory" class="org.springframework.jms.connection.UserCredentialsConnectionFactoryAdapter"> 
    <property name="targetConnectionFactory" ref="myTargetConnectionFactory"/> 
    <property name="username" value="SOME_USER"/> 
    <property name="password" value=""/> 
</bean> 

<bean id="jmsConfig" class="org.apache.camel.component.jms.JmsConfiguration"> 

    <property name="connectionFactory" ref="${mq.connectionfactorybean}" />   
    <property name="destinationResolver" ref="jmsDestResolver" />   
    <property name="concurrentConsumers" value="1" /> 
    <property name="maxConcurrentConsumers" value="1" /> 

    <!-- 
     NOTE: If we try to use a cache without a transactionManager we get "Connection closed" errors 
    --> 
    <property name="cacheLevelName" value="CACHE_NONE" /> 
</bean> 

問題:在WebSphere MQ管理員報告MGET的啤酒數()對隊列管理器的請求。目前的假設是,那些接收者不斷地輪詢新頻道。

它們似乎沒有MDB(消息驅動bean)的這個問題。 MDP異步實現是否真的是輪詢機制?如果是這樣,是否有辦法限制隊列管理器的訪問?也許增加輪詢間隔?任何見解,將不勝感激。

+0

你的JMS配置似乎罰款。那裏沒有任何東西會妨礙聽衆作爲聽衆。你可以發佈你的駱駝路線/配置嗎? –

+0

在這條路線上會發現什麼問題?重新:「沒有任何東西會阻止聽衆作爲聽衆。」 - 會知道我在哪裏可以找到有關MDP「偵聽器」內部的文檔。我擔心,因爲(可能是錯誤的)在線程中的答案:http://stackoverflow.com/questions/7390286/whats-the-difference-between-activationspec-and-connectionfactory。這表明MDP監聽器在QCF上的行爲是輪詢的 - 與MDB相比,可能不是真正的異步監聽器。我希望輪詢應用不斷地請求MGET。 –

+0

稍後的一些研究,閱讀我的答案。不是100%肯定的,但它至少可以開始尋找。 –

回答

2

我不知道CXF,但駱駝聽衆:

好像在JmsConfiguration默認JMS消費的類型是「違約」。 這意味着,它將實現Spring的DefaultMessageListenerContainer。

Javadoc

使用純JMS客戶端API消息監聽器容器的變體,特別是MessageConsumer.receive的環()調用

接收調用將映射到MQ GET呼叫。

還有一個選項可以指定一個Simple類型的消費者,我猜是你想要的。

使用普通JMS客戶端API的MessageConsumer.setMessageListener()

消息偵聽我不知道這裏,但春節文檔表明,簡單的消息偵聽器不支持XA事務。這可能是需要考慮的事情,因爲您正在應用程序服務器中運行。

0

我們也有類似的問題,我們的大型機問:IBM大型機問:

注意,應用程序ID作爲默認的用戶身份 要傳遞給隊列管理器。如果應用程序是在客戶端傳輸模式下運行的 ,則該進程ID必須與 存在於服務器計算機上的相關授權一起存在。如果需要不同的身份,則應用程序應使用 createConnection(用戶名,密碼)方法。

或者換句話說,IBM使用JVM進程ID登錄到MQ,除非我們在適當的憑據發送。我們在使用Spring,所以每次我們的DefaultMessageListenerContainer輪詢Q時,都必須使用它發送憑證。我迷上了這些寶寶之一和巴姆,像一個魅力工作:

public class CustomConnectionFactory extends CachingConnectionFactory { 

    private String username; 
    private String password; 

    ... 

    /** 
    * This is the secret sauce. Each time when we make a connection, we send 
    * the username/password. 
    */ 
    protected Connection doCreateConnection() throws JMSException { 
     return getTargetConnectionFactory().createConnection(this.username, this.password); 
    } 

我們的主機更快樂。我們後來轉而使用分佈式MQ,並且一切都好多了!

這是我們最後的安裝:

<!-- This hooks us up to the jndi --> 
<jee:jndi-lookup id="telematicsJNDIConnectionFactory" jndi-name="${mq.jndi}" cache="true" lookup-on-startup="true" /> 
<!-- The outer wrapper must be TransactionAware, the inner custom one will cache the connection --> 
<bean id="telematicsConnectionFactory" class="org.springframework.jms.connection.TransactionAwareConnectionFactoryProxy"> 
    <property name="targetConnectionFactory"> 
     <bean class="cat.dds.tmatic.utils.CustomConnectionFactory"> 
      <property name="targetConnectionFactory"> 
       <ref bean="telematicsJNDIConnectionFactory" /> 
      </property> 
      <property name="username"> 
       <value>${mq.user}</value> 
      </property> 
      <property name="password"> 
       <value>${mq.pass}</value> 
      </property> 
      <property name="sessionCacheSize"> 
       <value>10</value> 
      </property> 
     </bean> 
    </property> 
    <property name="synchedLocalTransactionAllowed" value="true" /> 
</bean> 
+0

這很有道理。我們也在反對大型機MQ。但是我們正在使用WebSphere JNDI隊列連接工廠,而不是緩存連接工廠。我們還使用UserCredentialsConnectionFactoryAdapter傳遞憑證(請參閱上面的配置)。你有沒有類似的特徵,或者你是否直接將MQ連接到隊列管理器? –

+0

我們使用的是Tomcat,所以我們在圖片中沒有Websphere。但是,我們仍在使用IBM MQQueueConnectionFactoryFactory來連接JNDI。很多jar問題,但他們解決了...... – markthegrea

+0

好的 - 你像我們一樣使用UserCredentialsConnectionFactoryAdapter嗎?我期望這個適配器與您的代碼相似(創建連接時傳遞憑據)。另外,您的JNDI連接工廠是否支持應用服務器管理的連接池?我假設你沒有在Spring應用程序中使用緩存連接工廠。 –