2017-08-27 1 views
0

Je suis en train d'essayer ce cas d'utilisation: Interroger un message dans une file d'attente-> transformer le message-> Appeler une méthode avec le message transformé.L'activateur de service n'est pas appelé

Voici mon code

<jms:message-driven-channel-adapter id="jmsIn" 
      destination-name="test" 
      channel="jmsInChannel"/> 
    <channel id="jmsInChannel"/> 
    <channel id="consoleOut"/> 
    <int:transformer input-channel="jmsInChannel" ref="xmlMsgToVORPojoTransformer" output-channel="consoleOut"> 
    </int:transformer> 

    <beans:bean id="xmlMsgToVORPojoTransformer" class="com.order.jmspublisher.ValidateOrderMessageTransformer"> 
     <beans:property name="unmarshaller" ref="marshaller" /> 
    </beans:bean> 

    <beans:bean id="marshaller" class="org.springframework.oxm.jaxb.Jaxb2Marshaller"> 
     <beans:property name="classesToBeBound"> 
      <beans:list> 
       <beans:value>com.order.jmspublisher.ValidateOrderResponseType</beans:value> 
      </beans:list> 
     </beans:property> 
    </beans:bean> 

    <logging-channel-adapter id="consoleOutloggerChannel" channel="consoleOut" log-full-message="true" level="DEBUG"/> 
    <int:service-activator id="sa" input-channel="consoleOut" output-channel="someChannel" method="handleVOR"> 
     <beans:bean id="vorActivator" class="com.order.jmspublisher.VORServiceActivator"/> 
    </int:service-activator> 

Mon code de transformateur est la suivante:

@SuppressWarnings("rawtypes") 
     public Message transform(String message) 
     { 
      try { 
       XMLInputFactory xif = XMLInputFactory.newFactory(); 
       XMLStreamReader xsr = xif.createXMLStreamReader(new StreamSource(new StringReader(message))); 
       xsr.nextTag(); // Advance to Envelope tag 

       while(xsr.hasNext()) { 
        int next = xsr.next(); 
        if(next == XMLStreamReader.START_ELEMENT) 

         if(xsr.getLocalName().equals("ValidateOrderResponse")) 
         { 
          break; 
         } 

       } 
      ValidateOrderResponseType vor = (ValidateOrderResponseType)marshaller.unmarshal(new StAXSource(xsr)); 
      return MessageBuilder.withPayload(vor).build(); 
      } catch (XmlMappingException e) { 
       return MessageBuilder.withPayload(e).build(); 
      } catch(Exception e){ 
      return MessageBuilder.withPayload(e).build(); 
      } 
     } 

===================== ============================================= = Mon code de la méthode d'activation du service est la suivante:

public class VORServiceActivator { 

    private static final Logger logger = LoggerFactory.getLogger(VORServiceActivator.class); 
    @ServiceActivator 
     public String handleVOR(ValidateOrderResponseType vor) 
     { 
      logger.info("vor information received and invoke some services here....\r\n"+vor); 
      return vor.toString(); 
     } 

} 

================================ ===== =========================================

Mon méthode d'activation de service n'est pas appelée. Mais ma transformation est appelée et je peux voir la même chose dans les journaux. S'il vous plaît aidez-moi à savoir où je vais mal. Merci d'avance.

Répondre

0

<channel id="consoleOut"/> est un DirectChannel; vous avez 2 consommateurs abonnés au canal (adaptateur de journalisation et activateur de service).

Le répartiteur par défaut distribuera des messages à ces consommateurs concurrents de manière circulaire; donc chacun aura des messages alternatifs.

Vous devez remplacer consoleOut par <publish-subscribe-channel /> si vous souhaitez que les deux consommateurs reçoivent tous les messages.

You can read about channel types here.

+0

Merci Gary. J'ai supprimé l'adaptateur de journalisation dans SI xml et l'activateur de service a été appelé. Merci beaucoup. –