2009-11-14 115 views
1

我目前使用的是Glassfish v2.1,並且我已經建立了一個隊列來分別發送和接收來自Sesion beans和MDB的消息。但是,我注意到我只能發送最多1000條消息到隊列中。我有什麼理由不能發送超過1000條消息到隊列中?我確實爲glassfish域設置了「開發人員」配置文件。這可能是原因嗎?還是有一些資源配置設置需要修改?在OpenMQ中發送到隊列的消息的最大數量?

我已經安裝了太陽resources.xml中配置屬性如下:

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE resources PUBLIC "-//Sun Microsystems, Inc.//DTD Application Server 9.0 Resource Definitions //EN" "http://www.sun.com/software/appserver/dtds/sun-resources_1_3.dtd"> 
<resources> 
    <admin-object-resource 
     enabled="true" 
     jndi-name="jms/UpdateQueue" 
     object-type="user" 
     res-adapter="jmsra" 
     res-type="javax.jms.Queue"> 
    <description/> 
    <property name="Name" value="UpdatePhysicalQueue"/> 
    </admin-object-resource> 
    <connector-resource 
     enabled="true" jndi-name="jms/UpdateQueueFactory" 
     object-type="user" 
     pool-name="jms/UpdateQueueFactoryPool"> 
    <description/> 
    </connector-resource> 
    <connector-connection-pool 
     associate-with-thread="false" 
     connection-creation-retry-attempts="0" 
     connection-creation-retry-interval-in-seconds="10" 
     connection-definition-name="javax.jms.QueueConnectionFactory" 
     connection-leak-reclaim="false" 
     connection-leak-timeout-in-seconds="0" 
     fail-all-connections="false" 
     idle-timeout-in-seconds="300" 
     is-connection-validation-required="false" 
     lazy-connection-association="false" 
     lazy-connection-enlistment="false" 
     match-connections="true" 
     max-connection-usage-count="0" 
     max-pool-size="32" 
     max-wait-time-in-millis="60000" 
     name="jms/UpdateFactoryPool" 
     pool-resize-quantity="2" 
     resource-adapter-name="jmsra" 
     steady-pool-size="8" 
     validate-atmost-once-period-in-seconds="0"/> 
</resources> 

嗯..進一步的調查顯示,在IMQ日誌如下:

[17/Nov/2009:10:27:57 CST] ERROR sendMessage: Sending message failed. Connection ID: 427038234214377984: 
    com.sun.messaging.jmq.jmsserver.util.BrokerException: transaction failed: [B4303]: The maximum number of messages [1,000] that the producer can process in a single transaction (TID=427038234364096768) has been exceeded. Please either limit the # of messages per transaction or increase the imq.transaction.producer.maxNumMsgs property. 

那麼該怎麼辦如果我一次需要發送超過5000條消息?

我所試圖做的是讀取表中的所有記錄和更新基於在傳統表記錄的對應值的每個記錄的特定字段,而我只只讀訪問。此表中有超過10k條記錄。到目前爲止,我依次遍歷for循環中的每條記錄,從舊錶獲取相應的記錄,比較字段值,如有必要更新記錄並在其他表中添加相應的新記錄。

不過,我希望通過異步處理的所有記錄,以提高性能。爲此,我正在考慮將每條記錄信息作爲單獨的消息發送,因此需要這麼多的消息。

回答

2

配置OpenMQ並設置artitrary代理屬性,看看這個blog post

但實際上,我不會建議,以增加imq.transaction.producer.maxNumMsgs財產,至少不高於在documentation推薦值:

,一個生產者可以在單個事務處理消息的最大數量。建議值低於5000以防止資源耗盡。

如果您需要發送更多消息,請考慮在多個事務中執行此操作。

+0

我寫了一個簡單的JMS連接的包裝來提交消息是塊。 https://gist.github.com/837393 – OleTraveler 2011-02-21 17:38:37

+0

@OleTraveler我看着你的代碼。它真的以這種方式工作嗎?關閉並重新打開JMS連接不會啓動新的事務。因此,你的代碼不應該適用於容器管理的事務。 – Theo 2011-06-03 16:41:47

+0

我發佈了一個相關的問題,你最終可以回答:http://stackoverflow.com/questions/6233854/how-to-send-multiple-jms-messages-in-blocks-each-in-a-new-交易。這是關於如何拆分與容器管理的事務在多個事務中發送JMS消息。 – Theo 2011-06-04 11:15:45

相關問題