2017-08-27 56 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中的日志记录适配器,并且调用了服务激活器。非常感谢。 –

相关问题