2014-06-10 2 views
0

봄이 JmsTemplate은 JNDI 연결 팩토리는 메시지가JMS 템플릿 나쁜 성능 224ms은

이다 게시

<?xml version="1.0" encoding="UTF-8"?> 
<beans:beans xmlns="http://www.springframework.org/schema/mvc" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:beans="http://www.springframework.org/schema/beans" 
    xmlns:context="http://www.springframework.org/schema/context" 
    xmlns:jms="http://www.springframework.org/schema/jms" xmlns:tx="http://www.springframework.org/schema/tx" 
    xmlns:oxm="http://www.springframework.org/schema/oxm" xmlns:util="http://www.springframework.org/schema/util" 
    xmlns:p="http://www.springframework.org/schema/p" 
    xsi:schemaLocation="http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd 
     http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd 
     http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd 
     http://www.springframework.org/schema/jms http://www.springframework.org/schema/jms/spring-jms-3.0.xsd 
     http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd 
     http://www.springframework.org/schema/oxm http://www.springframework.org/schema/oxm/spring-oxm-3.0.xsd 
     http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-3.0.xsd"> 




    <beans:bean id="jmsConnectionFactory" 
      class="org.springframework.jndi.JndiObjectFactoryBean"> 
     <beans:property name="jndiName" value="jms/TesService"/> 
     <beans:property name="resourceRef" value="false"/> 
     <beans:property name="lookupOnStartup" value="false"/> 
     <beans:property name="cache" value="true"/> 
     <beans:property name="proxyInterface" value="javax.jms.ConnectionFactory"/> 
    </beans:bean> 

    <jms:listener-container acknowledge="transacted" cache="session" connection-factory="jmsConnectionFactory" 
     concurrency="1" container-type="default" 
     container-class="org.kp.oppr.ancillary.jms.container.TesMessageListenerContainer"> 
     <jms:listener id="QL.TEST.84" destination="QL.TEST.OUTPUT.84" ref="ancillaryMessageListener" method="onMessage" /> 
     <jms:listener id="QL.TEST.85" destination="QL.TEST.OUTPUT.85" ref="ancillaryMessageListener" method="onMessage" /> 
    </jms:listener-container> 


    <beans:bean id="jmsTemplate" class="org.springframework.jms.core.JmsTemplate"> 
     <beans:property name="sessionTransacted" value="true" /> 
     <beans:property name="pubSubDomain" value="false" /> 
     <beans:property name="connectionFactory" ref="jmsConnectionFactory"></beans:property> 
    </beans:bean> 

    <!-- JMS Beans --> 
    <beans:bean id="jmsMessageProducer" class="org.kp.oppr.test.helpers.JmsMessageProducer"> 
    <beans:property name="jmsTemplate" ref="jmsTemplate"></beans:property> 
    </beans:bean> 

    <beans:bean id="testMessageListener" class="org.kp.oppr.test.jms.listener.TestMessageListener" scope="prototype"> 
    <beans:property name="retryDelay" value="${retry.delay}"></beans:property> 
    <beans:property name="maxRetry" value="${retry.allowed}"></beans:property> 


    </beans:bean> 

및 클래스를 used.` 경우에도 메시지를 게시 할 약 200 ~ 240 밀리 초 소요 메시지를 게시하기

`

package org.test.helpers; 

import javax.jms.JMSException; 
import javax.jms.Message; 
import javax.jms.Session; 
import javax.jms.TextMessage; 

import org.slf4j.Logger; 
import org.slf4j.LoggerFactory; 
import org.springframework.beans.factory.annotation.Autowired; 
import org.springframework.jms.core.JmsTemplate; 
import org.springframework.jms.core.MessageCreator; 

import com.ibm.mq.jms.MQQueue; 

public class JmsMessageProducer { 

    private static final Logger LOGGER = LoggerFactory.getLogger(JmsMessageProducer.class); 
    private JmsTemplate jmsTemplate; 
    private MQQueue queue; 


    public MQQueue getQueue() { 
     return queue; 
    } 

    public void setQueue(MQQueue queue) { 
     this.queue = queue; 
    } 



    /** 
    * 
    */ 
    public void sendMessage(final String message, final String queueName) throws JMSException { 

     MQQueue queue = new MQQueue(queueName); 
     queue.setTargetClient(1);  


     long queueStartTime = System.currentTimeMillis(); 

     jmsTemplate.send(queue, new MessageCreator() { 
      public Message createMessage(Session session) throws JMSException { 
       TextMessage textMessage = session.createTextMessage(message); 
       //message.setIntProperty(MESSAGE_COUNT, index); 

       return textMessage; 
      } 
     }); 

     if(LOGGER.isInfoEnabled()) { 
      LOGGER.info("Queue put time: " + (System.currentTimeMillis() - queueStartTime) + " queue: " + queue.getQueueName()); 
      LOGGER.info("Sent message to queue: " + queue.getQueueName() + " message: " + message); 
     } 

    } 

    public JmsTemplate getJmsTemplate() { 
     return jmsTemplate; 
    } 

    public void setJmsTemplate(JmsTemplate jmsTemplate) { 
     this.jmsTemplate = jmsTemplate; 
    } 
} 



</beans:beans> 
시간이 220ms로오고 넣어. 의 JNDI 연결 팩토리는

내가 각각

답변

0

사용 캐싱 현재 내 설정 파일에 뭔가를 놓친 경우 나 작업을 보내 알려주나요 .. 이상적으로는 30ms의 이하이어야한다 ... 웹 스피어 8.5에 이 검색되고 Producer을 만드는 데 사용되는 Session을 만드는 데 사용됩니다. 이것은 모든 오버 헤드 및 아마 대부분의 시간을 만드는 낭비 (지연되는 Session.

당신은 CachingConnectionFactory 또는 당신은 단지 하나의 연결이이 SingleConnectionFactory. 자세한 내용은 the reference guide 살펴보고 사용합니다.

<beans:bean id="cachingConnectionFactory" class="org.springframework.jms.connection.CachingConnectionFactory"> 
    <beans:property name="targetConnectionFactory" ref="jmsConnectionFactory" /> 
</beans:bean> 

<beans:bean id="jmsTemplate" class="org.springframework.jms.core.JmsTemplate"> 
    <beans:property name="sessionTransacted" value="true" /> 
    <beans:property name="pubSubDomain" value="false" /> 
    <beans:property name="connectionFactory" ref="cachingConnectionFactory"></beans:property> 
</beans:bean> 
을 구성 할 수 있습니다

당신의 JNDI 룩업

<beans:bean id="jmsConnectionFactory" 
     class="org.springframework.jndi.JndiObjectFactoryBean"> 
    <beans:property name="jndiName" value="jms/TesService"/> 
    <beans:property name="resourceRef" value="false"/> 
    <beans:property name="lookupOnStartup" value="false"/> 
    <beans:property name="cache" value="true"/> 
    <beans:property name="proxyInterface" value="javax.jms.ConnectionFactory"/> 
</beans:bean> 

우선 사용에게 조회를 할 수있는 JEE 네임 스페이스를 제안 살펴보면과 lookupOnStartup에 설정하지 마십시오. 후자는 전체 JNDI 검색이 여전히 발생해야하므로 메시지의 첫 번째 수신/송신을 지연시킵니다.

<jee:jndi-lookup id="jmsConnectionFactory" jndi-name="jms/TesService" proxy-interface="javax.jms.ConnectionFactory" /> 

또한 코드에서 당신은 String 페이로드에 대한 TextMessage를 생성합니다 기본적으로 MessageCreator JmsTemplate은 필요하지 않습니다. 당신이 MessagePostProcessor 대신 javax.jms.Message 사용에 추가 헤더 또는 속성을 추가하려면

public void sendMessage(final String message, final String queueName) throws JMSException { 
     MQQueue queue = new MQQueue(queueName); 
     queue.setTargetClient(1);  

     long queueStartTime = System.currentTimeMillis(); 

     jmsTemplate.convertAndSend(queue, message); 

     if(LOGGER.isInfoEnabled()) { 
      LOGGER.info("Queue put time: " + (System.currentTimeMillis() - queueStartTime) + " queue: " + queue.getQueueName()); 
      LOGGER.info("Sent message to queue: " + queue.getQueueName() + " message: " + message); 
     } 
} 

.

+0

cachingConnectionFactory 구성에서 다음 오류가 발생합니다. {set setExceptionListener not permitted allowed; 중첩 예외는 javax.jms.IllegalStateException : 메서드 setExceptionListener가 허용되지 않음 org.springframework.jms.IllegalStateException : 메서드 setExceptionListener가 허용되지 않습니다. 중첩 예외가 javax.jms.IllegalStateException : 메서드 setExceptionListener 허용되지 않습니다 \t at org.springframework.jms.support.JmsUtils.convertJmsAccessException (JmsUtils.java:279) ~ [spring-jms-4.0.3.RELEASE.jar : 4.0. 3.RELEASE]} – Guest

+0

또한 jmsTemplate.send (queue, message)에 대해 JMSTemplate에 메소드가 없습니다. – Guest

+0

제 잘못,'convertAndSend' 했어야합니다. 수정 된 답변. 전체 스택 추적을 포함하도록 질문을 업데이트하십시오. 리스너 컨테이너가 아닌'JmsTemplate'에 대해서만'cachingConnectionFactory'를 사용해야합니다. –

관련 문제