這又是IBM的amqmdnet.dll錯誤。與.NET Reflector拆卸庫和檢查負責讀取JMS屬性代碼(GetJmsProperty
MQMessage
類的私有方法)後,我發現這一點:
if (name.Equals("JMSDeliveryMode"))
{
// Properties never contain the property with such name!
if (this.properties.ContainsKey("JMSDeliveryMode"))
{
...
}
return this.Persistence; // Executes always
}
的問題是,properties
集合從不包含任何財產與JMSDeliveryMode
作爲重點。 properties
集合包含格式爲的RFH2頭文件RFH2Folder.RFH2PropertyName。 JMSDeliveryMode
的正確屬性名稱是jms.Dlv
!有趣的是GetJmsHeader
方法讀取所有JMS屬性,而所有其他屬性在屬性集合中搜索時使用正確的RFH2名稱!
當我檢查逆向操作時,情況更糟 - 專用方法SetJmsProperty
從MQMessage
類。設置JMSDeliveryMode
包含此代碼:
else if (name.Equals("JMSDeliveryMode"))
{
if (value is int)
{
int num2 = Convert.ToInt32(value);
switch (num2)
{
// Non persistent JMS message creates persistent MQ message
case 1:
this.Persistence = 1;
break;
// Invalid value for JMS delivery mode
case 0:
this.Persistence = 0;
break;
// Great if I try to create persistent JMS message I will
// get MQRC_PERSISTENCE_ERROR exception!
default:
base.throwNewMQException(2, 0x7ff);
break;
}
queue.Enqueue(num2);
// Correct RFH2 identifier is used
this.properties.Add("jms.Dlv", queue);
}
else
{
base.throwNewMQException(2, 0x9a9);
}
}
所以設置JMSDelivery
模式要麼火異常或設置無效堅持!以下是重現此問題的小測試:
[Test]
public void PutAndGetMessageWithDeliveryMode() {
using (MQQueue queue = _queueManager.AccessQueue(TestQueue, MQC.MQOO_OUTPUT | MQC.MQOO_INPUT_AS_Q_DEF)) {
MQMessage message = new MQMessage();
message.SetInt4Property("JMSDeliveryMode", 2);
message.WriteString("some string");
message.Format = MQC.MQFMT_STRING;
queue.Put(message);
MQMessage readMessage = new MQMessage();
queue.Get(readMessage);
Assert.AreEqual(2, readMessage.GetInt4Property("JMSDeliveryMode"));
queue.Close();
}
}
MQ .NET API不給我我在消息中得到的東西。它甚至不允許我發送正確的值。如果MQ.NET API是「本地」實現,它應該給我一個完整的控制。我不明白爲什麼高層(JMS)在傳輸層(MQ)中直接硬編碼的行爲。這應該在一些橋樑中單獨定義。 – 2012-08-06 18:28:49