The following is the code that reads via MQ Queue and sends to MQ Queue using Message Converter(reads from jms:message-driven-channel-adapter and writes to jms:outbound-channel-adapter)
Code:
<bean id="common.durableListenerContainer" class="org.springframework.jms.listener.DefaultMessageListenerContainer"
abstract="true">
<property name="sessionTransacted" value="true"/>
<property name="pubSubDomain" value="false"></property>
</bean>
<jms:message-driven-channel-adapter id="proj.Reader"
container="proj.recvQueueContainer"
message-converter="proj.MessageConverter"
channel="proj.toProcess"/>
<bean id="proj.recvQueueContainer" parent="common.durableListenerContainer" >
<property name="connectionFactory" ref="common-ibmmq.queueConnectionFactory"></property>
<property name="destination" ref="common.projRecvQueue"></property>
</bean>
<jms:outbound-channel-adapter id="proj.QueueSender"
channel="proj.to" jms-template="proj.outboundJmsTemplate"/>
<bean id="proj.outboundJmsTemplate" parent="common-ibmmq.queueJmsTemplate">
<property name="messageConverter" ref="proj.MessageConverter"/>
<property name="defaultDestination" ref="common.projSendQueue"/>
</bean>
<bean id="proj.MessageConverter" class="com.ubs.etdet.skore.jms.ProjTransferObjectMessageConverter">
<constructor-arg value="fat-processor"/>
<constructor-arg value="true"/>
<property name="maxRedeliveryCount" value="${message.max_redelivery}" />
</bean>
<bean id="common-ibmmq.queueConnectionFactory" class="com.ibm.mq.jms.MQConnectionFactory" lazy-init="true">
<property name="queueManager" value="${mq.conn.fac.name.mgr}" />
<property name="hostName" value="${mq.conn.fac.host}" />
<property name="port" value="${mq.conn.fac.port}" />
<property name="channel" value="${mq.conn.fac.channel}" />
<property name="transportType" value="1" />
</bean>
<bean id="common-ibmmq.baseJmsTemplate" abstract="true"
class="org.springframework.jms.core.JmsTemplate" />
<bean id="common-ibmmq.queueJmsTemplate" parent="common-ibmmq.baseJmsTemplate" lazy-init="true">
<property name="connectionFactory" ref="common-ibmmq.queueConnectionFactory" />
</bean>
public class ProjTransferObjectMessageConverter extends AbstractLoggingMessageConverter {
String messageId = "";
private Integer redeliveryCount = 0;
public Integer maxRedeliveryCount = 0;
public void setMaxRedeliveryCount(Integer maxRedeliveryCount) {
this.maxRedeliveryCount = maxRedeliveryCount;
}
public ProjTransferObjectMessageConverter(String appName, boolean doLog) {
super(appName, doLog);
}
private static final XStream xs = new XStream(new XppDriver());
static {
xs.registerConverter(new EnumSingleValueConverter<ProjAllocationStatus>(ProjAllocationStatus.class));
xs.registerConverter(new EnumSingleValueConverter<ProjMessageType>(ProjMessageType.class));
}
@Override
public Message toMessage(final Object message, final Session session)
throws JMSException, MessageConversionException {
if (message instanceof MTO) {
MTO mto = (MTO) message;
beforeLog("toMessage", mto.getInitialOrderRef(), mto.getOrderId(), mto, true);
ProjTransferObject fto = (ProjTransferObject)mto;
BytesMessage toSend = session.createBytesMessage();
toSend.writeBytes(xs.toXML(fto).getBytes());
afterLog("toMessage", mto.getInitialOrderRef(), mto.getOrderId(), toSend, false);
return toSend;
}
return null;
}
@Override
public Object fromMessage(final Message message) throws JMSException, MessageConversionException {
if(maxRedeliveryCount > 0) {
redeliveryCount = MessageUtils.incrementRedeliveryCount(message, messageId, redeliveryCount);
if(redeliveryCount > maxRedeliveryCount) {
errorLog("Reached maximum retries after encountering an ERROR_MESSAGE ", message.toString());
errorLog("fromMessage", message.toString());
return MessageUtils.buildErrorMTO(message);
} else if (redeliveryCount > 1) {
errorLog("Retry message-count:" + redeliveryCount, "");
} else {
messageId = message.getJMSMessageID();
}
}
if (message instanceof BytesMessage) {
beforeLog("fromMessage", null, null, message, true);
BytesMessage bm = (BytesMessage) message;
byte[] array = new byte[(int) bm.getBodyLength()];
bm.readBytes(array);
Object o = xs.fromXML(new String(array));
beforeLog("fromMessage", null, null, o, true);
return o;
}
return null;
}
}