未调用服务激活器



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

这是我的代码

<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....rn"+vor);
return vor.toString();
}
}

====

==================================================================================我的服务激活器方法未被调用。但是我的转换被调用了,我可以在日志中看到相同的转换。 请帮助我知道我哪里出错了。 提前谢谢。

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

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

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

您可以在此处阅读有关渠道类型的信息。

最新更新