2017-03-09 1 views
0

활성 MQ 5.10 버전을 사용 중이므로 메시지 처리를 위해 wso2esb를 사용하여 구성했습니다.활성 MQ TCP 연결 실패

약 7-10 일 후 ESB가 TCP에 성공적으로 연결되지 않아 활성 MQ가 tcp 연결 실패 예외를 발생시킵니다. 대기열에서 메시지를 전송하지 못했습니다.

이 경우 서버를 다시 시작한 후 7-10 일 동안 다시 실행하면 동일한 작업이 반복됩니다.

내 질문은 무엇을 할 수있다 활성 MQ에 대한 정확한 이유는 성공적인 TCP 연결을 제공 중지

입니다 ..?

왜 서버를 다시 시작한 후 정상 상태로 돌아갑니다 ..?

는 최상의 솔루션을 통해 activemq.xml 파일 여기

<systemUsage> 
    <systemUsage sendFailIfNoSpace="true"> 
     <memoryUsage> 
       <memoryUsage limit="1430 mb"/> 
      </memoryUsage> 
      <storeUsage> 
       <storeUsage limit="300 gb"/> 
      </storeUsage> 
      <tempUsage> 
       <tempUsage limit="100 gb"/> 
      </tempUsage> 
    </systemUsage> 
</systemUsage> 

큐에 메시지를 배치하는 프록시 서비스가이 문제 ..

메모리 구성이 올 것입니다. 진정한 사용자가 큐에 메시지를 배치 할 수있는 경우 프록시 서비스에서 그것은 내가 그것을 활성 MQ에 연결하고 메시지를

<proxy xmlns="http://ws.apache.org/ns/synapse" 
     name="JmsStore2.0" 
     transports="https http" 
     startOnLoad="true" 
     trace="disable" 
     statistics="enable"> 
    <description/> 
    <target> 
     <inSequence onError="fault"> 
     <property name="messageType" value="application/json" scope="axis2"/> 
     <property name="FORCE_ERROR_ON_SOAP_FAULT" value="true"/> 
     <property name="jmsuri" value="tcp://0.0.0.0:61616"/> 
     <property name="jmsqueue" expression="get-property('transport', 'jmsqueue')"/> 
     <property name="readingspayload" expression="$body" type="OM"/> 
     <property name="username" expression="get-property('transport', 'username')"/> 
     <property name="password" expression="get-property('transport', 'password')"/> 
     <property name="PartyBranchID" 
        expression="//FieldValue/text()" 
        scope="default" 
        type="STRING"/> 
     <property name="Body" expression="$body" scope="default" type="STRING"/> 
     <property name="usercode" 
        expression="fn:substring-before(get-property('username'),'|')" 
        scope="default" 
        type="STRING"/> 
     <property name="clientid" 
        expression="fn:substring-after(get-property('username'),'|')" 
        scope="default" 
        type="STRING"/> 
     <property name="requestMsgId" 
        expression="get-property('MessageID')" 
        scope="default" 
        type="STRING"/> 
     <property name="client_ip_address" 
        expression="get-property('axis2','REMOTE_ADDR')" 
        scope="default" 
        type="STRING"/> 

     <payloadFactory media-type="xml"> 
      <format> 
       <send xmlns=""> 
        <username>$1</username> 
        <password>$2</password> 
       </send> 
      </format> 
      <args> 
       <arg evaluator="xml" expression="get-property('username')"/> 
       <arg evaluator="xml" expression="get-property('password')"/> 
      </args> 
     </payloadFactory> 
     <send receive="JmsStore_Seq"> 
      <endpoint> 
       <address uri="http://localhost:8282/services/Login2.0" format="soap11"> 
        <suspendOnFailure> 
        <errorCodes>101500,101501,101506,101507,101508,101503,50000</errorCodes> 
        <initialDuration>30</initialDuration> 
        <progressionFactor>1.0</progressionFactor> 
        <maximumDuration>300</maximumDuration> 
        </suspendOnFailure> 
       </address> 
      </endpoint> 
     </send> 
     </inSequence> 
     <outSequence onError="fault"> 
     <send/> 
     </outSequence> 
    </target> 
</proxy> 

순서를 배치하는 것을 클래스 중재자를 사용하여 여기에, 사용자 인증을 확인합니다 :

<sequence xmlns="http://ws.apache.org/ns/synapse" 
      name="JmsStore_Seq" 
      trace="disable"> 
    <property name="FORCE_ERROR_ON_SOAP_FAULT" value="true"/> 
    <property xmlns:ns="http://org.apache.synapse/xsd" 
      name="Authentication" 
      expression="//Authentication/text()"/> 
    <property xmlns:ns="http://org.apache.synapse/xsd" 
      name="UserId" 
      expression="//UserId/text()" 
      scope="default" 
      type="STRING"/> 
    <property xmlns:ns="http://org.apache.synapse/xsd" 
      name="WorkOUid" 
      expression="//WorkOUid/text()"/> 
    <property xmlns:ns="http://org.apache.synapse/xsd" 
      name="WorkPartyBranchId" 
      expression="//WorkPartyBranchId/text()"/> 

    <filter xmlns:ns="http://org.apache.synapse/xsd" 
      xpath="get-property('Authentication')=''"> 
     <then> 
     <payloadFactory media-type="xml"> 
      <format> 
       <ResponseJSON xmlns=""> 
        <Exception>Service trying to connect inactive service</Exception> 
        <Status>101503</Status> 
       </ResponseJSON> 
      </format> 
      <args/> 
     </payloadFactory> 
     <property name="messageType" value="application/json" scope="axis2"/> 
     <property name="HTTP_METHOD" value="POST" scope="axis2" type="STRING"/> 
     <property name="RESPONSE" value="true" scope="default" type="STRING"/> 
     <property name="NO_ENTITY_BODY" scope="axis2" action="remove"/> 
     <send/> 
     </then> 
     <else> 
     <filter xpath="get-property('Authentication')='false'"> 
      <then> 
       <payloadFactory media-type="xml"> 
        <format> 
        <ResponseJSON xmlns=""> 
         <Exception>Authentication Failed</Exception> 
         <Status>401</Status> 
        </ResponseJSON> 
        </format> 
        <args/> 
       </payloadFactory> 
       <property name="messageType" value="application/json" scope="axis2"/> 
       <property name="HTTP_METHOD" value="POST" scope="axis2" type="STRING"/> 
       <property name="RESPONSE" value="true" scope="default" type="STRING"/> 
       <property name="NO_ENTITY_BODY" scope="axis2" action="remove"/> 
       <send/> 
      </then> 
      <else> 
       <property name="jmspayload" 
         expression="get-property('readingspayload')" 
         type="OM"/> 
       <property name="ResponseJSON" expression="$body/ResponseJSON" type="OM"/> 
       <property name="jmsuri" expression="get-property('jmsuri')"/> 
       <property name="jmsqueue" expression="get-property('jmsqueue')"/> 
       <payloadFactory media-type="xml"> 
        <format> 
        <PLData> 
         <JMpayload>$1</JMpayload> 
         <AuthData>$2</AuthData> 
         <LogData> 
          <usercode>$3</usercode> 
          <clientid>$4</clientid> 
          <requestMsgId>$5</requestMsgId> 
         </LogData> 
        </PLData> 
        </format> 
        <args> 
        <arg evaluator="xml" expression="get-property('jmspayload')"/> 
        <arg evaluator="xml" expression="get-property('ResponseJSON')"/> 
        <arg evaluator="xml" expression="get-property('usercode')"/> 
        <arg evaluator="xml" expression="get-property('clientid')"/> 
        <arg evaluator="xml" expression="get-property('requestMsgId')"/> 
        </args> 
       </payloadFactory> 
       <class name="in.youtility.esb.custommediators.JMSStoreMediator"/> 
       <payloadFactory media-type="xml"> 
        <format> 
        <ResponseJSON xmlns=""> 
         <Body> 
          <Datalist> 
           <Data>Successfully stored</Data> 
          </Datalist> 
         </Body> 
         <Status>200</Status> 
        </ResponseJSON> 
        </format> 
        <args/> 
       </payloadFactory> 
       <property name="messageType" value="application/json" scope="axis2"/> 
       <header name="To" action="remove"/> 
       <property name="NO_ENTITY_BODY" scope="axis2" action="remove"/> 
       <property name="RESPONSE" value="true"/> 
       <send/> 
      </else> 
     </filter> 
     </else> 
    </filter> 
    <description/> 
</sequence> 

클래스 중재자 :

public class JMSStoreMediator extends AbstractMediator implements 

ManagedLifecycle {

Connection connection; 

public boolean mediate(MessageContext msgCtx) { 


    try { 
     boolean topic=false; 
     String jmsuri=""+msgCtx.getProperty("jmsuri"); 
     String t=""+msgCtx.getProperty("topic"); 

     if(t.isEmpty()){ 

      topic=false; 
     } 
     else { 

      topic=Boolean.valueOf(t); 
     } 

     ConnectionFactory factory= new ActiveMQConnectionFactory(jmsuri); 
     connection = factory.createConnection(); 
     connection.start(); 
     Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE); 
     Destination destination=null; 
     if(!topic)destination= session.createQueue(""+msgCtx.getProperty("jmsqueue")); 
     else destination= session.createTopic(""+msgCtx.getProperty("jmsqueue")); 
     MessageProducer producer = session.createProducer(destination); 
     producer.setDeliveryMode(DeliveryMode.PERSISTENT); 

     String xml = ""+msgCtx.getEnvelope().getBody().toStringWithConsume(); 

     if(topic){ 

      JSONObject obj=XML.toJSONObject(xml); 
      JSONObject ar=obj.getJSONObject("soapenv:Body"); 
      ar.remove("xmlns:soapenv"); 
      xml=ar.toString(); 
     } 
     TextMessage message = session.createTextMessage(xml); 
     producer.send(message); 

    } catch (Exception e) { 

     log.info("LogLocation = "+getClass().getName()+",Error in storing message in JMS stacktrace is :"+e.toString()); 
     ((Axis2MessageContext) msgCtx).setProperty(NhttpConstants.HTTP_SC, 500); 
     handleException("Error while storing in the message store", msgCtx); 

    } 
    finally { 
     try { 
      connection.close(); 

     } catch (JMSException e) { 
      log.info("LogLocation = "+getClass().getName()+",Error in closing JMS connection stacktrace is :"+e.toString()); 
     } 
    } 
     log.info("LogLocation = "+getClass().getName()+",ProxyName = "+msgCtx.getProperty("proxy.name")+ 
      ",Usercode = "+msgCtx.getProperty("usercode")+",Clientid = "+msgCtx.getProperty("clientid")+ 
      ",requestMsgId = "+msgCtx.getProperty("requestMsgId")+",Position = END"); 

    return true; 
} 
+0

매일 ActiveMQ에서 증가하는 메일 수가 있습니까? JMS 프록시 서비스, MessageStore를 사용하여 AMQ를 어떻게 사용합니까? –

+0

안녕하세요 @ Jean-Michel이 답장을 보내 주셔서 감사합니다. 대기열에있는 메시지와이 대기열을 수신 대기하고 처리하는 다른 JMS 프록시 서비스를 삭제하는 ESB 프록시 서비스를 사용하고 있습니다. 액티브 MQ가 ESB에 성공적으로 tcp 연결을 제공 할 때까지 메시지가 대기열로 이동하여 문제없이 처리됩니다. – user4045063

+0

첫 번째 응답을 게시하지만 begean이 실패 할 경우 (대기열에서 수천 개의 메시지 대기 중) 메시지 수가 ActiveMQ에서 증가하는지 알려주십시오. –

답변

0

당신은 당신의 proxys의 conf를 공유해야하지만 당신은 항상 확인할 수 있습니다

  • 당신은 스캔마다 새로운 연결을 피할 수있는 경우 CacheLevel 설정 한 : <parameter name="transport.jms.CacheLevel">consumer</parameter>
  • 당신은 모든 메시지를 소비하도록 요청했습니다를 각 스캔 : <parameter name="transport.jms.MaxMessagesPerTask">-1</parameter>
+0

내가 본 프록시 코드를 공유했습니다. – user4045063