首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >未调用Service Activator

未调用Service Activator
EN

Stack Overflow用户
提问于 2017-08-27 08:42:07
回答 1查看 514关注 0票数 1

我正在尝试这个用例:轮询队列中的消息->转换消息->使用转换后的消息调用方法。

以下是我的代码

代码语言:javascript
复制
    <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> 

我的Transformer代码如下:

代码语言:javascript
复制
@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();
            }
       }

========================================================================我的服务激活器方法代码如下:

代码语言:javascript
复制
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();
       }

}

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

我的服务激活器方法没有被调用。但是我的转换正在被调用,我可以在日志中看到同样的情况。请帮我找出哪里出了问题。提前谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-08-27 22:35:29

<channel id="consoleOut"/>是一个DirectChannel;您有两个消费者订阅了该通道(日志记录适配器和服务激活器)。

默认调度程序将以循环方式将消息分发给这些相互竞争的消费者;因此,每个用户都将获得备用消息。

如果您希望两个消费者都能获得所有消息,则需要将consoleOut更改为<publish-subscribe-channel />

You can read about channel types here

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45900819

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档