Amol - no this is the vanilla spring implementation.
Gary,
I thought I understood what you had said - but maybe not...
What I cannot figure out is how to get the message-convertor (to marshall into a JAXB object) into play.
When I have the following configuration, ALL messages are failing - HOWEVER, they are only failing once - so progress in the right direction I think :-)
Code:
<jpa:repositories base-package="myorg.efx.ods.nrml" />
<bean id="nrmlMsgSelector" class="myorg.efx.ods.nrml.NrmlMessageFilter">
<property name="currencyPairRegex" value="(AUD\.[A-Z]{3}|USD\.[A-Z]{3}|[A-Z]{3}\.USD)" />
</bean>
<bean id="nrmlMsgHandler" class="myorg.efx.ods.nrml.NrmlMessageHandler">
<property name="repository" ref="nrmlRateRepository" />
</bean>
<bean id="jmsTransManager" class="org.springframework.jms.connection.JmsTransactionManager">
<property name="connectionFactory" ref="connectionFactory" />
</bean>
<int-jms:message-driven-channel-adapter id="nrmlIn2"
connection-factory="connectionFactory"
destination-name="${nrml.rate.topic.name}"
transaction-manager="jmsTransManager"
channel="nrmlInbound"
error-channel="exampleErrorChannel"
pub-sub-domain="true"
durable-subscription-name="fxODS"
subscription-durable="true"
/>
<oxm:jaxb2-marshaller id="marshaller" contextPath="myorg.wfs.schema.nrml._1" />
<bean id="nrmlMsgConverter" class="org.springframework.jms.support.converter.MarshallingMessageConverter">
<constructor-arg ref="marshaller" />
<constructor-arg ref="marshaller" />
</bean>
<int:channel id="exampleErrorChannel" />
<int:service-activator input-channel="exampleErrorChannel" ref="loggingErrorHandler" output-channel="nullChannel"/>
<bean id="loggingErrorHandler" class="myorg.efx.ods.nrml.MyLoggingErrorHandler"/>
<int:channel id="nrmlInbound" />
<int:filter input-channel="nrmlInbound" ref="nrmlMsgConverter" output-channel="nrmlSelector"/>
<int:channel id="nrmlSelector" />
<int:filter input-channel="nrmlSelector" ref="nrmlMsgSelector" output-channel="filteredNrml"/>
<int:channel id="filteredNrml" />
<int:service-activator input-channel="filteredNrml" ref="nrmlMsgHandler" />
They are failing with
Code:
...</NRML>][Headers={timestamp=1326435491896, id=2cf1b7a6-7f03-42bb-8175-30c94c00366d, jms_redelivered=false, jms_messageId=ID:EMS-DEV2.2E8F4EC31058328B7AE:22}]
org.springframework.integration.MessageHandlingException: error occurred in message handler [org.springframework.integration.filter.MessageFilter@19b32e]
at org.springframework.integration.handler.AbstractMessageHandler.handleMessage(AbstractMessageHandler.java:79)
at org.springframework.integration.dispatcher.UnicastingDispatcher.doDispatch(UnicastingDispatcher.java:114)
at org.springframework.integration.dispatcher.UnicastingDispatcher.dispatch(UnicastingDispatcher.java:101)
at org.springframework.integration.channel.AbstractSubscribableChannel.doSend(AbstractSubscribableChannel.java:61)
at org.springframework.integration.channel.AbstractMessageChannel.send(AbstractMessageChannel.java:157)
at org.springframework.integration.core.MessagingTemplate.doSend(MessagingTemplate.java:288)
at org.springframework.integration.core.MessagingTemplate.send(MessagingTemplate.java:149)
at org.springframework.integration.core.MessagingTemplate.convertAndSend(MessagingTemplate.java:189)
at org.springframework.integration.gateway.MessagingGatewaySupport.send(MessagingGatewaySupport.java:183)
at org.springframework.integration.jms.ChannelPublishingJmsMessageListener$GatewayDelegate.send(ChannelPublishingJmsMessageListener.java:423)
at org.springframework.integration.jms.ChannelPublishingJmsMessageListener.onMessage(ChannelPublishingJmsMessageListener.java:277)
at org.springframework.jms.listener.AbstractMessageListenerContainer.doInvokeListener(AbstractMessageListenerContainer.java:535)
at org.springframework.jms.listener.AbstractMessageListenerContainer.invokeListener(AbstractMessageListenerContainer.java:495)
at org.springframework.jms.listener.AbstractMessageListenerContainer.doExecuteListener(AbstractMessageListenerContainer.java:467)
at org.springframework.jms.listener.AbstractPollingMessageListenerContainer.doReceiveAndExecute(AbstractPollingMessageListenerContainer.java:325)
at org.springframework.jms.listener.AbstractPollingMessageListenerContainer.receiveAndExecute(AbstractPollingMessageListenerContainer.java:243)
at org.springframework.jms.listener.DefaultMessageListenerContainer$AsyncMessageListenerInvoker.invokeListener(DefaultMessageListenerContainer.java:1058)
at org.springframework.jms.listener.DefaultMessageListenerContainer$AsyncMessageListenerInvoker.executeOngoingLoop(DefaultMessageListenerContainer.java:1050)
at org.springframework.jms.listener.DefaultMessageListenerContainer$AsyncMessageListenerInvoker.run(DefaultMessageListenerContainer.java:947)
at java.lang.Thread.run(Thread.java:619)
Caused by: java.lang.IllegalArgumentException: result must not be null
at org.springframework.util.Assert.notNull(Assert.java:112)
at org.springframework.integration.filter.AbstractMessageProcessingSelector.accept(AbstractMessageProcessingSelector.java:60)
at org.springframework.integration.filter.MessageFilter.handleRequestMessage(MessageFilter.java:103)
at org.springframework.integration.handler.AbstractReplyProducingMessageHandler.handleMessageInternal(AbstractReplyProducingMessageHandler.java:97)
at org.springframework.integration.handler.AbstractMessageHandler.handleMessage(AbstractMessageHandler.java:73)
... 19 more
I think I'm on the right track, because when I bring the messageConverter back into play
Code:
<int-jms:message-driven-channel-adapter id="nrmlIn2"
connection-factory="connectionFactory"
destination-name="${nrml.rate.topic.name}"
transaction-manager="jmsTransManager"
channel="nrmlSelector"
error-channel="exampleErrorChannel"
message-converter="nrmlMsgConverter"
pub-sub-domain="true"
durable-subscription-name="fxODS"
subscription-durable="true"
/>
the message is being rolled back and re-presented and rolled back and re-presented...
Changing
Code:
<int:filter input-channel="nrmlInbound" ref="nrmlMsgConverter" output-channel="nrmlSelector"/>
to
Code:
<int:filter input-channel="nrmlInbound" ref="nrmlMsgConverter" method="fromMessage" output-channel="nrmlSelector"/>
fails as it wants a Message, but [default] SimpleMessageConverter presents a String to the channel though it has a GenericMessage.
Sorry for being thick, but what am I missing?
Thanks!