2013-05-17 3 views
1

Я использую Mule Community Edition 3.4.0, и у меня есть проблема во время установки/получения переменной сеанса между потоками. У меня есть поток, в котором есть компонент UntilSuccessful; когда возникает исключение, я использую перехватчик для сохранения имени исключения в переменной сеанса, чтобы прочитать его в другом потоке. Проблема в том, что когда я пытаюсь повторить переменную сеанса, я получаю нулевое значение. Я действительно не знаю, почему. Здесь ниже вы можете увидеть мула конфигурационный файл:Невозможно передать SessionVariable в другой поток Mule

<spring:beans> 
     <spring:bean id="OS_Bean_id" name="OS_Bean" class="org.mule.util.store.QueuePersistenceObjectStore"/> 

     <spring:bean id="myExceptionHandler_id" class="it.aizoon.prova.ManageException" name="myExceptionHandler"/> 

     <spring:bean id="handleException_id" name="handleException" class="it.aizoon.prova.exception.CustomSoapFaultInInterceptor"/> 

     <spring:bean id="handleSysError_id" name="handleSysError" class="it.aizoon.prova.exception.CustomInInterceptor"/> 
     <spring:bean id="BeanCheckProperty_id" name="BeanCheckProperty" class="it.aizoon.prova.utilities.CheckProperty"/> 
    </spring:beans> 
    <http:endpoint exchange-pattern="request-response" host="localhost" port="8081" path="service/prova" method="POST" name="HTTP" doc:name="HTTP"/> 
    <vm:endpoint exchange-pattern="one-way" path="myQueue" name="myQueue" doc:name="VM"/> 
    <queued-asynchronous-processing-strategy name="Queued_Asynchronous_Processing_Strategy" doc:name="Queued Asynchronous Processing Strategy"> 
     <file-queue-store/> 
    </queued-asynchronous-processing-strategy> 

<flow name="myFlow" doc:name="myFlow" processingStrategy="Queued_Asynchronous_Processing_Strategy"> 
     <vm:inbound-endpoint exchange-pattern="one-way" doc:name="VM" ref="myQueue"/> 
     <logger level="INFO" doc:name="Logger" message="EEEEE: #[exception]"/> 
     <processor ref="BeanCheckProperty"/> 
     <set-payload value="The request cannot be processed, the error is #[payload]" doc:name="Set Payload"/> 
     <set-property propertyName="http.status" value="500" doc:name="Property"/> 
     <logger message="PAYLOAD_VM: #[payload]" level="INFO" doc:name="Logger"/> 
</flow> 

<flow name="ProvaRepeatFlow1" doc:name="ProvaRepeatFlow1" processingStrategy="Queued_Asynchronous_Processing_Strategy"> 
     <quartz:inbound-endpoint jobName="TalendJob" repeatInterval="5000" repeatCount="0" responseTimeout="10000" doc:name="Quartz"> 
      <quartz:event-generator-job> 
       <quartz:payload>error</quartz:payload> 
      </quartz:event-generator-job> 
     </quartz:inbound-endpoint> 
     <object-to-string-transformer doc:name="Object to String"/> 
     <until-successful objectStore-ref="OS_Bean" maxRetries="2" secondsBetweenRetries="2" doc:name="Until Successful" > 
      <flow-ref name="CallWebService" doc:name="Flow Reference"/> 
     </until-successful> 
     <catch-exception-strategy doc:name="Catch Exception Strategy"> 
      <processor-chain doc:name="Processor Chain"> 
       <logger level="INFO" doc:name="Logger"/> 
        <vm:outbound-endpoint exchange-pattern="one-way" path="myQueue" doc:name="VM"/> 
      </processor-chain> 
     </catch-exception-strategy> 
</flow> 

<sub-flow name="CallWebService" doc:name="CallWebService"> 
     <processor-chain doc:name="Processor Chain"> 
      <cxf:jaxws-client operation="getCode" clientClass="it.aizoon.prova.client.ProvaService" port="ProvaPort" enableMuleSoapHeaders="true" doc:name="SOAP"> 
       <cxf:inInterceptors> 
        <!-- <spring:ref bean="handleSysError"/> --> 
       </cxf:inInterceptors> 

       <cxf:inFaultInterceptors> 
        <spring:ref bean="handleException"/> 
       </cxf:inFaultInterceptors> 

       <cxf:outInterceptors/> 

       <cxf:outFaultInterceptors/> 
      </cxf:jaxws-client> 
      <http:outbound-endpoint exchange-pattern="request-response" host="localhost" port="8088" path="mockProvaServiceSoapBinding" method="POST" doc:name="HTTP"/> 
     </processor-chain> 
</sub-flow> 

Как вы можете видеть, у меня есть компонент SOAP. Если есть ошибка SOAP, я могу перехватить ее и сохранить ее имя в переменной сеанса, называемой EXCEPTION. Здесь есть код перехватчика:

public class CustomSoapFaultInInterceptor extends AbstractPhaseInterceptor{ 

     public CustomSoapFaultInInterceptor() { 
      // TODO Auto-generated constructor stub 
      super(Phase.INVOKE); 
     //getAfter().add(Soap11FaultInInterceptor.class.getName()); 
     } 

     @Override 
     public void handleMessage(Message message) throws Fault { 
      // TODO Auto-generated method stub 
      System.out.println("InFaultInterceptor_CONTENUTO ECCEZIONE: " + message.getContent(Exception.class)); 
      System.out.println("InFaultInterceptor_CONTENUTO EVENTO MULE: " + message.getExchange().get(CxfConstants.MULE_EVENT)); 

      MuleEvent muleEvent = (MuleEvent) message.getExchange().get(CxfConstants.MULE_EVENT); 
      MuleMessage muleMessage = muleEvent.getMessage(); 

      if((message.getContent(Exception.class)) instanceof ParideExec_Exception){ 
        ParideExec_Exception parideExec = (ParideExec_Exception) message.getContent(Exception.class); 

        String exceptionName = message.getContent(Exception.class).getClass().getName(); 
        //context.getRegistry().registerObject("Eccezione", exceptionName); 
        muleEvent.setSessionVariable("CustomExec", exceptionName); 
        System.out.println("ID SESSIONE: " + muleEvent.getSession().getId()); 
      } 
     } 
} 

И здесь Ther это Java-код, который прочитал переменный сеанс в другом потоке.

public class CheckProperty implements MessageProcessor{ 

     @Override 
     public MuleEvent process(MuleEvent event) throws MuleException { 
      // TODO Auto-generated method stub 
      System.out.println("PPPP: " + event.getSessionVariable("CustomExec")); 
      System.out.println("ID SESSIONE: " + event.getSession().getId()); 

      if(event.getSessionVariable("CustomExec") != null){ 
        System.out.println("EXCEPTION: " + event.getSessionVariable("CustomExec")); 
        String exceptionName = event.getSessionVariable("CustomExec").toString(); 
        event.getMessage().setPayload(exceptionName); 
      } 
      return event; 
} 

Но эта переменная id null. Пожалуйста, помогите мне. Я не знаю, почему у Мула такое поведение.

ответ

2

я узнал, что единственная возможность, вы должны передавать переменные между потоками, когда вы используете до успешного компонента не использовать MuleContext и, в частности, установить переменную общего числа каждого потока каждого мула приложений в контексте мула (event.getMuleContext.getRegistry.registerObject (ключ, значение)). Единственным недостатком является обмен этой переменной, но с правильным видом инкапсуляции вы могли бы решить эту проблему.

2

Из информации о потоке, которую вы предоставили, я мог видеть, что вы используете успешный маршрутизатор Until-success для обработки вызова, и когда возникает исключение, вы устанавливаете исключение в session varialbe, а затем обратно в стратегию исключения основного потока, которую вы передаете к потоку vm, в котором вы извлекаете переменную сеанса.

Пункт 1: До успешного маршрутизатора используется асинхронный процессор. Таким образом, основной поток будет продолжаться после вызова до успешного маршрутизатора. Таким образом, переменная сеанса, прошедшая с момента успешного завершения (подпоток), никогда не достигнет основного потока.

<catch-exception-strategy doc:name="Catch Exception Strategy"> 
     <processor-chain doc:name="Processor Chain"> 
      <logger level="INFO" doc:name="Logger"/> 

Вы можете видеть это из регистратора, который у вас есть в вашей стратегии исключения исключений в основном потоке. Он выводит все свойства из всех областей в журнале. Там вы не найдете свою переменную сеанса. Таким образом, он не передается от до успешной до вашей основной стратегии исключения.

Подробнее о Until-Successful по приведенной ниже ссылке.

Mule Routing Message Processors

+0

Благодарим за сообщение. Но как я могу получить эту переменную сеанса извне до успешного компонента? Это должно быть способ ... –

+1

Если вы используете до тех пор, пока не будете успешны, то я не думаю, что это так, асинхронно. – user1760178

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