2014-12-21 2 views
0

У меня есть приложение на Tomcat 7.05, которое подключается к удаленному диспетчеру MQ, все работает нормально, просто для создания соединения требуется безумное количество времени ~ 13 секунд (если я поместил как java-код, так и MQ-сервер на одну машину, она занимает меньше секунды). Как улучшить время создания соединения?Как улучшить клиент MQ, создать время подключения?

Мой Java-код:

import javax.jms.DeliveryMode; 
import javax.jms.JMSException; 
import javax.jms.Message; 
import javax.jms.Queue; 
import javax.jms.QueueConnection; 
import javax.jms.QueueConnectionFactory; 
import javax.jms.QueueReceiver; 
import javax.jms.QueueSender; 
import javax.jms.QueueSession; 
import javax.jms.Session; 
import javax.jms.TextMessage; 
import javax.naming.Context; 
import javax.naming.InitialContext; 
import com.ibm.mq.constants.MQConstants; 

     private MQldpResponse requestReply() { 

      String messageReceive = null; 
      MQldpResponse status = new MQldpResponse(); 

      status.setErrorCode(0); 
      status.setErrorDesc("Success"); 

      if (message == null) { 
        LDPLogger.warning("Message is null for request service " + service); 
      }  
      setMQVars();// Setting mq vars 
      QueueConnection queueConnection = null; 
      QueueSender queueSender = null; 
      QueueReceiver queueReceiver = null; 
      try { 
        Context context = (Context) new InitialContext().lookup("java:comp/env"); 
        QueueConnectionFactory queueConnectionFactory = (QueueConnectionFactory) context.lookup(qcf); 
        queueConnection = queueConnectionFactory.createQueueConnection();//This takes 13~ seconds!! 
        queueConnection.start(); 
        QueueSession session = queueConnection.createQueueSession(false, QueueSession.AUTO_ACKNOWLEDGE); 

        Queue requestQueue = session.createQueue(requestQueueName); 
        queueSender = session.createSender(requestQueue); 
        TextMessage requestTextMessage = session.createTextMessage(message); 
        Queue replyQueue = session.createQueue(replyQueueName); 
        requestTextMessage.setJMSReplyTo(replyQueue); 
        requestTextMessage.setIntProperty("JMS_IBM_MsgType", MQConstants.MQMT_REQUEST); 
        queueSender.send(requestTextMessage, deliveryMode, Message.DEFAULT_PRIORITY, expiration); 
        String messageID = requestTextMessage.getJMSMessageID(); 
        if (Utils.isEmpty(messageID)) { 
         throw new Exception("invalid messageid"); 
        } 
        String selector = "JMSCorrelationID = '" + messageID + "'"; 
        queueReceiver = session.createReceiver(replyQueue, selector); 
        Message replyTextMessage = queueReceiver.receive(timeout); 
        if (replyTextMessage != null && replyTextMessage instanceof TextMessage) { 
         messageReceive = ((TextMessage) replyTextMessage).getText(); 
         status.setResponseXML(messageReceive); 
        } else { 
         throw new Exception("No Response for service " + service + "."); 
         } 
      } catch (Exception e) { 
        status.setErrorCode(MQldpResponse.ERROR_CODE_SYS_ERROR); 
        status.setErrorDesc(e.getMessage()); 
        LDPLogger.error(e.getMessage(), e); 
        if (e instanceof JMSException) { 
         Exception linkedException = ((JMSException) e).getLinkedException(); 
         if (linkedException != null) { 
           LDPLogger.error(linkedException.getMessage(), linkedException); 
           status.setErrorDesc(linkedException.getMessage()); 
         } 
        } 
      } 
      finally { 
        closeJMS(queueConnection, queueSender, queueReceiver); 
      } 
      return status; 
     } 

     private void closeJMS(QueueConnection queueConnection, 
        QueueSender queueSender, QueueReceiver queueReceiver) { 
      try { 
        if (queueSender != null) { 
         queueSender.close(); 
         queueSender = null; 
        } 
      } catch (JMSException e) { 
        queueSender = null; 
      } 

      try { 
        if (queueReceiver != null) { 
         queueReceiver.close(); 
         queueReceiver = null; 
        } 
      } catch (JMSException e) { 
        queueReceiver = null; 
      } 

      try { 
        if (queueConnection != null) { 
         queueConnection.close(); 
         queueConnection = null; 
        } 
      } catch (JMSException exception) { 
        queueConnection = null; 
      } 
     } 
} 

Мой context.xml ресурс:

<Resource 
    name="jms/QCF" 
    auth="Container" 
    type="com.ibm.mq.jms.MQQueueConnectionFactory" 
    factory="com.ibm.mq.jms.MQQueueConnectionFactoryFactory" 
    description="JMS Queue Connection Factory for sending messages" 
    HOST="1.1.1.1" 
    PORT="1414" 
    CHAN="CHANNEL" 
    TRAN="1" 
    QMGR="QMGR"/> 

ответ

0

Сетевая проблема ... отключение NetBios через tcp \ ip при сетевом подключении на стороне сервера сделало трюк

0

Ясно 13 секунд слишком много для установления соединения в очереди менеджера. Я думаю, что проблема действительно в вашей сети. Поговорите со своим сетевым администратором и исправьте проблемы и снова проверьте свое приложение.

+0

Да. посмотри на мой ответ. – Alaychem

Смежные вопросы