Максимальное количество сообщений, отправляемых в очередь в OpenMQ? - PullRequest
1 голос
/ 15 ноября 2009

В настоящее время я использую Glassfish v2.1, и я настроил очередь для отправки и получения сообщений с бобами Sesion и MDB соответственно. Тем не менее, я заметил, что я могу отправить только 1000 сообщений в очередь. Есть ли причина, по которой я не могу отправить более 1000 сообщений в очередь? У меня есть настройка профиля "developer" для домена glassfish. Может ли это быть причиной? Или есть какой-то параметр конфигурации ресурса, который мне нужно изменить?

Я настроил свойства конфигурации sun-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, получая соответствующую запись из прежней таблицы, сравнивая значения полей, обновляя запись при необходимости и добавляя соответствующие новые записи в другие таблицы.

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

1 Ответ

2 голосов
/ 17 ноября 2009

Чтобы настроить OpenMQ и установить свойства посредника, ознакомьтесь с этой публикацией в блоге .

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

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

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

...