1

現在Glassfishv2.1を使用しており、SesionBeanとMDBでそれぞれメッセージを送受信するためのキューを設定しました。ただし、キューに送信できるメッセージは最大1000個にすぎないことに気付きました。1000を超えるメッセージをキューに送信できない理由はありますか?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,000を超えるレコードが含まれています。今のところ、forループで各レコードを順番に調べ、レガシーテーブルから対応するレコードを取得し、フィールド値を比較し、必要に応じてレコードを更新し、対応する新しいレコードを他のテーブルに追加しています。

ただし、すべてのレコードを非同期で処理することでパフォーマンスを向上させたいと考えていました。そのために、各レコード情報を個別のメッセージとして送信することを考えていたため、非常に多くのメッセージが必要になりました。

4

1 に答える 1

2

OpenMQ を構成し、独自のブローカー プロパティを設定するには、このブログ投稿をご覧ください。

imq.transaction.producer.maxNumMsgsしかし実際には、少なくともドキュメントで推奨されている値を超えないように、プロパティを増やすことはお勧めしません。

プロデューサが 1 回のトランザクションで処理できるメッセージの最大数。リソースの枯渇を防ぐために、値を 5000 未満にすることをお勧めします。

さらにメッセージを送信する必要がある場合は、複数のトランザクションで送信することを検討してください。

于 2009-11-17T17:12:22.193 に答える