2009-11-14 4 views
1

В настоящее время я использую Glassfish v2.1, и я создал очередь для отправки и получения сообщений с помощью Sesion beans и MDB соответственно. Однако я заметил, что могу отправить только 1000 сообщений в очередь. Есть ли причина, по которой я не могу отправить более 1000 сообщений в очередь? У меня есть настройка профиля «разработчика» для домена стеклянной рыбы. Может быть, это и есть причина? Или есть какой-то параметр конфигурации ресурсов, который мне нужно изменить?Максимальное количество сообщений, отправленных в очередь в 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 сообщений за раз?

То, что я пытаюсь сделать, это прочитать все записи в таблице и обновить конкретное поле каждой записи на основе соответствующего значения этой записи в старой таблице, к которой у меня есть доступ только для чтения. В этой таблице содержится более 10 тыс. Записей. На данный момент я последовательно просматриваю каждую запись в цикле for, получая соответствующую запись из старой таблицы, сравнивая значения полей, при необходимости обновляя запись и добавляя соответствующие новые записи в другие таблицы.

Однако я надеялся улучшить производительность, обработав все записи асинхронно. Для этого я думал о отправке каждой информации о записи как отдельном сообщении и, следовательно, требовал так много сообщений.

ответ

2

Чтобы настроить OpenMQ и установить свойства брокерского искусства, ознакомьтесь с этим blog post.

Но на самом деле, я бы не посоветовал увеличить imq.transaction.producer.maxNumMsgs недвижимость, по крайней мере, не выше значения, рекомендованного в documentation:

Максимальное количество сообщений, которое производитель может обрабатывать в одной транзакции. Рекомендуется, чтобы значение было меньше 5000, чтобы предотвратить исчерпание ресурсов.

Если вам нужно отправить больше сообщений, подумайте об этом в нескольких транзакциях.

+0

Я написал простую оболочку вокруг JMS-соединения для фиксации сообщений - это блоки. https://gist.github.com/837393 – OleTraveler

+0

@OleTraveler Я посмотрел ваш код. Неужели это так работает? Закрытие и повторное открытие JMS-соединения не запускает новую транзакцию. Поэтому ваш код не должен работать с транзакциями, управляемыми контейнерами. – Theo

+0

Я опубликовал связанный с вами вопрос, который вы в конечном итоге можете ответить: http://stackoverflow.com/questions/6233854/how-to-send-multiple-jms-messages-in-blocks-each-in-a-new- сделка. Речь идет о том, как разделить JMS-сообщения в нескольких транзакциях с транзакциями, управляемыми контейнерами. – Theo