2017-08-27 143 views
0

我正在嘗試這個用例: 在隊列中輪詢消息 - >轉換消息 - >使用轉換後的消息調用方法。服務激活器未被調用

這裏是我的代碼

<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> 

我的變壓器的代碼如下:

@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(); 
      } 
     } 

===================== ================================================== = 我的服務活化劑方法的代碼如下:

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(); 
     } 

} 

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

我的服務激活方法沒有被調用。但是我的轉換正在被調用,我可以在日誌中看到相同的結果。 請幫我知道我哪裏出錯了。 在此先感謝。

回答

0

<channel id="consoleOut"/>DirectChannel;您有2個消費者訂閱了該頻道(日誌記錄適配器和服務激活器)。

默認的調度程序將以循環方式將消息分發給這些競爭的消費者;所以每個人都會得到其他消息。

如果您希望兩個消費者都獲取所有消息,則需要將consoleOut更改爲<publish-subscribe-channel />

You can read about channel types here

+0

謝謝加里。我刪除了SI xml中的日誌記錄適配器,並且調用了服務激活器。非常感謝。 –