gpt4 book ai didi

c# - 在 .NET WMQ API 中接收 WebSphere MQ 消息有时会抛出 MQRC_RFH_FORMAT_ERROR

转载 作者:行者123 更新时间:2023-11-30 22:26:25 25 4
gpt4 key购买 nike

我将 WebSphere MQ v7 服务器和 WebSphere MQ 客户端 v7.5 与 amqmdnet.dll 7.5.0.0 一起用作 .NET 库,以便通过 WebSphere MQ 进行通信。有时,当我尝试从队列中读取 MQMessage 时,我会得到 MQException,原因是 MQRC_RFH_FORMAT_ERROR

var message = new MQMessage();
queue.Get(message);

此行为似乎取决于消息的发送者及其内容。它通常不适用于不同平台上发送具有 float 或 double 属性的消息的系统。

最佳答案

这是 IBM 的 amqmdnet.dll 中的全局化错误。在客户端 (strmqtrc.exe) 上打开 MQ 跟踪后,我尝试再次接收消息,我在其中一个跟踪文件中找到了它:

00001F21 11:48:00.351013   7104.1           :       Exception received
System.FormatException
Message: Input string was not in a correct format.
StackTrace:
at System.Number.ParseSingle(String value, NumberStyles options, NumberFormatInfo numfmt)
at System.Convert.ToSingle(String value)
at IBM.WMQ.MQMarshalMessageForGet.GetValueAsObject(String dt, String propValue)
at IBM.WMQ.MQMarshalMessageForGet.ProcessAllAvailableRFHs()
00001F22 11:48:00.351115 7104.1 : We are not sucessful in parsing one of theRFH2Header.Raise the RFH_FORMAT exception and breakfurther processing in loop
00001F23 11:48:00.351825 7104.1 : MQException CompCode: 2 Reason: 2421

使用 .NET Reflector 反编译 MQMarshalMessageForGet显示了这个:

private object GetValueAsObject(string dt, string propValue)
{
...

switch (dt)
{
...

case "r4":
return Convert.ToSingle(propValue);

case "r8":
return Convert.ToDouble(propValue);

...
}

...
}

消息是在当前系统的文化中读取的,而不是在传输预期的文化中(在所有平台上都应该相同)!重现问题的简单测试:

[Test]
public void PutAndGetMessageWithFloatProperty() {
using (MQQueue queue = _queueManager.AccessQueue(TestQueue, MQC.MQOO_OUTPUT | MQC.MQOO_INPUT_AS_Q_DEF))
{
Thread.CurrentThread.CurrentCulture = new CultureInfo("en-US");

MQMessage message = new MQMessage();
message.SetFloatProperty("TEST_SINGLE", 14.879f);
message.WriteString("some string");
message.Format = MQC.MQFMT_STRING;

queue.Put(message); // Writes property value as 14.879

Thread.CurrentThread.CurrentCulture = new CultureInfo("cs-CZ");

MQMessage readMessage = new MQMessage();
queue.Get(readMessage); // Throws MQException because 14,879 is correct format

queue.Close();
}
}

解决方法

我正在使用这个简单的作用域类:

public class CultureForThreadScope : IDisposable {
private readonly CultureInfo oldCulture;

public CultureForThreadScope(CultureInfo culture) {
oldCulture = Thread.CurrentThread.CurrentCulture;
Thread.CurrentThread.CurrentCulture = culture;
}

public void Dispose() {
Thread.CurrentThread.CurrentCulture = oldCulture;
}
}

我将每个 Get 调用包装到作用域。

using (new CultureForThreadScope(CultureInfo.InvariantCulture)) {
destination.Get(message, getOptions);
}

关于c# - 在 .NET WMQ API 中接收 WebSphere MQ 消息有时会抛出 MQRC_RFH_FORMAT_ERROR,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11829264/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com