2009-11-14 9 views
1

현재 Glassfish v2.1을 사용하고 있으며 Sesion Bean과 MDB에서 각각 메시지를주고받는 대기열을 설정했습니다. 그러나 큐에 최대 1000 개의 메시지 만 보낼 수 있다는 것을 알았습니다. 큐에 1000 개가 넘는 메시지를 보낼 수없는 이유가 있습니까? glassfish 도메인에 대한 "개발자"프로필 설정이 있습니다. 이유가 될 수 있을까요? 또는 수정해야 할 리소스 구성 설정이 있습니까?OpenMQ에서 대기열로 보낸 최대 메시지 수는 얼마입니까?

다음과 같이 내가 설정을 태양-resources.xml에 구성 특성을 가지고는 :

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

그래서 내가 무엇을 할 것입니다 :

<?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 로그에 다음 밝혀 한 번에 5000 개 이상의 메시지를 보내야한다면?

내가하려는 것은 테이블의 모든 레코드를 읽고 기존 읽기 전용 테이블에있는 해당 레코드의 해당 값을 기반으로 각 레코드의 특정 필드를 업데이트하는 것입니다. 이 테이블에는 10k 개 이상의 레코드가 있습니다. 지금부터는 for 루프의 각 레코드를 순차적으로 살펴보고 레거시 테이블에서 해당 레코드를 가져 와서 필드 값을 비교하고 필요한 경우 레코드를 업데이트하고 다른 테이블에 해당하는 새 레코드를 추가합니다.

그러나 모든 레코드를 비동기 적으로 처리하여 성능을 향상시키고 싶습니다. 그렇게하기 위해 각 레코드 정보를 별도의 메시지로 보내고 그렇게 많은 메시지가 필요하다고 생각했습니다.

답변

2

OpenMQ를 구성하고 다른 브로커 등록 정보를 설정하려면 blog post을보십시오.

그러나 실제로는, 나는 적어도하지 documentation에서 권장하는 값 이상의 imq.transaction.producer.maxNumMsgs 속성을 증가시키기 위해 조언을하지 않을 :

프로듀서가 단일 트랜잭션에서 처리 할 수있는 메시지의 최대 수입니다. 자원 소모를 막으려면이 값을 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

관련 문제