在OpenMQ中发送到队列的邮件最大数量? [英] Maximum number of messages sent to a Queue in OpenMQ?

查看:227
本文介绍了在OpenMQ中发送到队列的邮件最大数量?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我目前使用的是Glassfish v2.1,我已经设置了一个队列来分别从Sesion beans和MDB发送和接收消息。但是,我注意到我只能发送最多1000条消息到队列。有没有什么理由为什么我不能发送超过1000个消息到队列?我有一个开发人员配置文件设置为glassfish域。可能是原因吗?还有一些资源配置设置需要修改?



我已经设置了sun-resources.xml配置属性,如下所示:

 <?xml version =1.0encoding =UTF-8?> 
< DOCTYPE资源PUBLIC - // Sun Microsystems,Inc.//DTD Application Server 9.0资源定义// ENhttp://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 =Namevalue =UpdatePhysicalQueue/>
< / admin-object-resource>
< connector-resource
enabled =truejndi-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-秒=0
fail-all-connections =false
idle-timeout-in-seconds =300
is-connection-validation-required =false
lazy-connection-association =false
lazy-connection-queistment =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
stable-pool-size =8
validate-atmost-once-period-in-seconds =0/ >
< / resources>

嗯..进一步的调查揭示了imq日志中的以下内容:

  [17 / Nov / 2009:10:27:57 CST]错误sendMessage:发送消息失败。连接ID:427038234214377984:$​​ b $ b com.sun.messaging.jmq.jmsserver.util.BrokerException:事务失败:[B4303]:生产者可以在单个事务中处理的最大消息数[1,000](TID = 427038234364096768)。请限制每个事务的消息数量或增加imq.transaction.producer.maxNumMsgs属性。 

那么如果我一次发送超过5000条消息,该怎么办?



我想要做的是读取表中的所有记录,并根据该表中的该记录的相应值更新每个记录的特定字段只有只读访问。该表中有超过10k条记录。到目前为止,我依次通过一个for循环中的每个记录,从旧表中获取相应的记录,比较字段值,如果需要更新记录,并在其他表中添加相应的新记录。



但是,我希望通过异步处理所有记录来提高性能。为了做到这一点,我正在考虑将每个记录信息作为单独的消息发送,因此需要这么多消息。

解决方案

要配置OpenMQ并设置艺术经纪人的财产,看看这个博客文章



但实际上,我不建议增加 imq.transaction.producer.maxNumMsgs 属性,至少不高于文档中推荐的值:


生产者可以在单个事务中处理的最大消息数。建议该值小于5000以防止资源耗尽。


如果您需要发送更多邮件,请考虑在多个交易中进行。


I am currently using Glassfish v2.1 and I have set up a queue to send and receive messages from with Sesion beans and MDBs respectively. However, I have noticed that I can send only a maximum of 1000 messages to the queue. Is there any reason why I cannot send more than 1000 messages to the queue? I do have a "developer" profile setup for the glassfish domain. Could that be the reason? Or is there some resource configuration setting that I need to modify?

I have setup the sun-resources.xml configuration properties as follows:

<?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>

Hmm .. further investigation revealed the following in the imq logs:

   [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.

So what would I do if I needed to send more than 5000 messages at a time?

What I am trying to do is to read all the records in a table and update a particular field of each record based on the corresponding value of that record in a legacy table to which I have only read only access. This table has more than 10k records in it. As of now, I am sequentially going through each record in a for loop, getting the corresponding record from the legacy table, comparing the field values, updating the record if necessary and adding corresponding new records in other tables.

However, I was hoping to improve performance by processing all the records asynchronously. To do that I was thinking of sending each record info as a separate message and hence requiring so many messages.

解决方案

To configure OpenMQ and set artitrary broker properties, have a look at this blog post.

But actually, I wouldn't advice to increase the imq.transaction.producer.maxNumMsgs property, at least not above the value recommended in the documentation:

The maximum number of messages that a producer can process in a single transaction. It is recommended that the value be less than 5000 to prevent the exhausting of resources.

If you need to send more messages, consider doing it in several transactions.

这篇关于在OpenMQ中发送到队列的邮件最大数量?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆