首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Websphere,接收大消息(100 MB)

问Websphere,接收大消息(100 MB)
EN

Stack Overflow用户
提问于 2016-09-27 10:19:25
回答 1查看 1.4K关注 0票数 1

我正在尝试从Websphere MQ队列读取一个100 MB的文件。文件应该包含大约。800.000张唱片。但是在一个特定的行号(通常在90.000左右)之后,我只能得到空(或者�,这取决于我试图查看文件的方式)。

我听说队列应该允许100 MB的消息。

我的代码:

代码语言:javascript
复制
            var mqQueueManager = getMqQueueManager(ConfigurationManager.AppSettings["MQ_QueueManager"]);
            var mqQueue = mqQueueManager.AccessQueue(mqReceiveQueueName,
                                                        MQC.MQOO_INPUT_AS_Q_DEF | MQC.MQOO_FAIL_IF_QUIESCING);

            MQGetMessageOptions gmo = new MQGetMessageOptions();
            gmo.Options = MQC.MQGMO_NO_WAIT;

            for (int i = 0; i < maxMessagesToRead; i++)
            {
                var mqMessage = new MQMessage();
                mqQueue.Get(mqMessage, gmo);

                messageTexts.Add(mqMessage.ReadString(mqMessage.MessageLength));
            }

这个密码有什么问题吗?或者是发送端的错误?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-10-04 17:39:05

目前还不清楚人们在问什么,我认为这是问题的根源。虽然MQ确实可以处理大小高达100 MQ的消息,但问题不是这样读的。

我正在尝试从Websphere MQ队列读取一个100 MB的文件。文件应该包含大约。800.000张唱片。但是在一个特定的行号之后(通常在90.000左右)

隐藏在该语句中的引用是:

  • 文件
  • 排队
  • 记录
  • 行

我相信,您询问的每个人都在响应队列,因此多次保证MQ可以处理100 MQ消息。但是,代码似乎正在重新组合一个文件,该文件已被拆分为一个记录/行(每个消息)。这是一个完全不同的用例。

每次使用这些消息,在MQ中完全有可能来回传递100 MQ消息。这样做需要将该路径上的每个QMgr、通道和队列配置为MAXMSGL的4MB默认值。不太明显的是,如果使用线性日志和/或消息是在同步点下处理的,则必须有足够的日志空间来包含多个100 is的事务。默认日志范围计数和大小不会预期100 do消息。最后,应用程序需要提供足够大的缓冲区,并确保不告诉MQ允许截断消息。

这种在MQ上的movign文件方法仅限于100 MQ以下的文件,但具有原子操作的明显优势--要么获得/放置整个文件,要么根本就没有。没有遗漏的部分,没有什么不正常的,等等。这大大简化了代码。

第二种可能性是,代码正在重新组合一个文件,该文件已被拆分为多个消息。发布的代码片段是否真的希望相互附加多个100 It的消息似乎令人怀疑,所以我假设它试图从许多消息中重新组装一个文件。(我相信多达80万人。)在这种情况下,问题是一个工作单元中可以有多少条消息。代码片段省略了任何有意义的错误处理,因此我假设同步点处理也被省略了。

在重新组装文件时出现的错误包括无序消息和丢失消息。即使是使用每个文件多条消息的最简单的基于MQ的文件移动器,也需要使用同步点来确保作为一个单元发送或接收整个文件。但是MQ并不期望在一个工作单元中有80万条消息,所以您需要调优日志区段和 MAXUMSGS来做任何事情。

当然,在将文件拆分成许多消息时,移动文件并确保它们的完整性并不是一件容易的事情,而且当所有的排列都被考虑在内时,结果看起来很像MQ托管文件传输。

回到问题上,如果文件是在单个消息中传输的,并且没有设置截断消息的API选项,那么MQ中没有什么会在出现一定数量的行或消息长度后影响消息。在这种情况下,解释垃圾超过某一点的唯一方法是发送应用程序发送垃圾。(例如,分配了100 it缓冲区,填充了50 it的缓冲区,然后发送了100 it的消息。)

但是,如果像代码中显示的那样,文件被分割成许多消息,那么必须执行上面提到的调优。这包括将MAXUMSGS设置为大于80万(doc链接)的值,并确保主日志和次要日志区段中有足够的空间容纳几个大型工作单元。详情请参见计算日志的大小。

另外,您也可能希望每次重置MQGMO,因为正如该对象的概述中所指出的,它既是输入也是输出。

修改后的代码看起来更像这样:

代码语言:javascript
复制
            MQGetMessageOptions gmo = new MQGetMessageOptions();

            for (int i = 0; i < maxMessagesToRead; i++)
            {
                var mqMessage = new MQMessage();
                gmo.Options = MQC.MQGMO_NO_WAIT;
                mqQueue.Get(mqMessage, gmo);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39722117

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档