Spring.Messaging.Nms 的BUG
悲催啊,以为是我配置有问题,折腾一下午时间,最后发现是一BUG。。
具体代码
1、扩展的NmsTemplate ,使用了委托
public class RequestReplyNmsTemplate : NmsTemplate
{
public object ConvertAndSendRequestReply(object objectToSend)
{
return Execute(delegate(ISession session, IMessageProducer producer)
{
ITemporaryQueue tempQueue = null;
try
{
tempQueue = session.CreateTemporaryQueue();
this.ConvertAndSendWithDelegate(objectToSend, delegate(IMessage message)
{
message.NMSReplyTo =
tempQueue;
return message;
});
return ReceiveAndConvert(tempQueue);
}
finally
{
if (tempQueue != null) session.DeleteDestination(tempQueue);
}
});
}
{
public object ConvertAndSendRequestReply(object objectToSend)
{
return Execute(delegate(ISession session, IMessageProducer producer)
{
ITemporaryQueue tempQueue = null;
try
{
tempQueue = session.CreateTemporaryQueue();
this.ConvertAndSendWithDelegate(objectToSend, delegate(IMessage message)
{
message.NMSReplyTo =
tempQueue;
return message;
});
return ReceiveAndConvert(tempQueue);
}
finally
{
if (tempQueue != null) session.DeleteDestination(tempQueue);
}
});
}
}
2、 配置文件
<?xml version="1.0" encoding="utf-8" ?>
<objects xmlns="http://www.springframework.net"
xmlns:nms="http://www.springframework.net/nms">
<object id="ConnectionFactory" type="Spring.Messaging.Nms.Connections.CachingConnectionFactory, Spring.Messaging.Nms">
<property name="SessionCacheSize" value="10" />
<property name="TargetConnectionFactory">
<object type="Apache.NMS.ActiveMQ.ConnectionFactory, Apache.NMS.ActiveMQ">
<constructor-arg index="0" value="tcp://192.168.1.22:61616"/>
</object>
</property>
</object>
<!-- NMS based implementation of technology neutral IStockServiceGateway -->
<object name="NmsSyncStockServiceGateway" type="Messaging.Client.Gateways.NmsSyncStockServiceGateway, Messaging.Client">
<property name="NmsTemplate" ref="NmsTemplate"/>
<!--<property name="DefaultReplyToQueue">
<object type="Apache.NMS.ActiveMQ.Commands.ActiveMQQueue, Apache.NMS.ActiveMQ">
<constructor-arg value="APP.STOCK.JOE"/>
</object>
</property>-->
</object>
<object name="NmsTemplate" type="Messaging.Client.Gateways.RequestReplyNmsTemplate, Messaging.Client">
<property name="ConnectionFactory" ref="ConnectionFactory"/>
<property name="DefaultDestinationName" value="APP.STOCK.REQUEST"/>
<property name="MessageConverter" ref="XmlMessageConverter"/>
</object>
<object name="XmlMessageConverter" type="Messaging.Domain.Converters.TxMessageConverter, Messaging.Domain" />
<objects xmlns="http://www.springframework.net"
xmlns:nms="http://www.springframework.net/nms">
<object id="ConnectionFactory" type="Spring.Messaging.Nms.Connections.CachingConnectionFactory, Spring.Messaging.Nms">
<property name="SessionCacheSize" value="10" />
<property name="TargetConnectionFactory">
<object type="Apache.NMS.ActiveMQ.ConnectionFactory, Apache.NMS.ActiveMQ">
<constructor-arg index="0" value="tcp://192.168.1.22:61616"/>
</object>
</property>
</object>
<!-- NMS based implementation of technology neutral IStockServiceGateway -->
<object name="NmsSyncStockServiceGateway" type="Messaging.Client.Gateways.NmsSyncStockServiceGateway, Messaging.Client">
<property name="NmsTemplate" ref="NmsTemplate"/>
<!--<property name="DefaultReplyToQueue">
<object type="Apache.NMS.ActiveMQ.Commands.ActiveMQQueue, Apache.NMS.ActiveMQ">
<constructor-arg value="APP.STOCK.JOE"/>
</object>
</property>-->
</object>
<object name="NmsTemplate" type="Messaging.Client.Gateways.RequestReplyNmsTemplate, Messaging.Client">
<property name="ConnectionFactory" ref="ConnectionFactory"/>
<property name="DefaultDestinationName" value="APP.STOCK.REQUEST"/>
<property name="MessageConverter" ref="XmlMessageConverter"/>
</object>
<object name="XmlMessageConverter" type="Messaging.Domain.Converters.TxMessageConverter, Messaging.Domain" />
</objects>
3、调用
TxRequest txRequest = new TxRequest();
txRequest.ServiceID = "1";
txRequest.ServiceName = "test";
txRequest.InPara = new System.Collections.Hashtable();
txRequest.InPara.Add("aaa","aaa");
IApplicationContext context = ContextRegistry.GetContext();
ISyncStockService nmsService = (ISyncStockService)context.GetObject("NmsSyncStockServiceGateway");
nmsService.Send(txRequest);
txRequest.ServiceName = "test";
txRequest.InPara = new System.Collections.Hashtable();
txRequest.InPara.Add("aaa","aaa");
IApplicationContext context = ContextRegistry.GetContext();
ISyncStockService nmsService = (ISyncStockService)context.GetObject("NmsSyncStockServiceGateway");
nmsService.Send(txRequest);
这时会报错!查找源码后发现问题在这里
public object DoInNms(ISession session)
{
//IMessageProducer producer = jmsTemplate.CreateProducer(session, null);
IMessageProducer producer = jmsTemplate.CreateProducer(session, jmsTemplate.ResolveDestinationName(session, jmsTemplate.DefaultDestinationName));
try
{
if (producerCallback != null)
{
return producerCallback.DoInNms(session, producer);
}
else
{
return producerDelegate(session, producer);
}
}
finally
{
NmsUtils.CloseMessageProducer(producer);
}
}
{
//IMessageProducer producer = jmsTemplate.CreateProducer(session, null);
IMessageProducer producer = jmsTemplate.CreateProducer(session, jmsTemplate.ResolveDestinationName(session, jmsTemplate.DefaultDestinationName));
try
{
if (producerCallback != null)
{
return producerCallback.DoInNms(session, producer);
}
else
{
return producerDelegate(session, producer);
}
}
finally
{
NmsUtils.CloseMessageProducer(producer);
}
}
}
注意我注释掉的哪一行。。程序后面要从cache中取值,存取时会用到第二个参数,IDestination类型(即消息目的地)。