2017-07-20 115 views
0

在我的場景中,隊列包含巨大(32MB +)消息,並且數據的結構使得標識消息類型的信息包含在前幾個消息的字節。JMS IBM MQ - 限制瀏覽返回消息的大小

使用低級Websphere MQ API時,可以提供特定(有限)大小的緩衝區,然後使用包含MQGMO_ACCEPT_TRUNCATED_MSG標誌的選項發出MQGET調用。 MQGET返回的原因代碼可能會是MQRC_TRUNCATED_MSG_ACCEPTED(這是預期的)。

這使得人們可以編寫一個非常快速的「瀏覽全部」類型的邏輯,返回每個消息的第一個(比方說)100個字節,而不是每個消息的完整緩衝區。

是否有可能使用java JMS做類似的事情?我一直無法找到允許我在 session.createBrowser(隊列...)或 browser.getEnumeration()調用中指定緩衝區大小的任何內容。

謝謝。

+0

感覺太具體IBM MQ我。我從未在JMS中看到過這樣的事情。聽起來很糟糕的設計。如果你需要知道消息類型,也許你應該爲每種消息類型使用一個主題。這樣的事情能幫助你嗎? https://docs.oracle.com/cd/E19798-01/821-1841/bncfl/index.html – duffymo

+0

謝謝,我看了你提供的鏈接。這基本上是我在做的。問題是瀏覽的正常方式會回退所有那些佔用大量資源的巨大消息。 最接近我得到一個可能的答案是這[鏈接] https://stackoverflow.com/questions/34377185/spring-jms-ibm-mq-how-to-set-message-buffer-size-or-wait-超時) - 該帖子使用ibm mq特定的jms api(我使用了vanilla javax.jms類)。他得到了mqrc_truncated_msg_failed,但它看起來好像是由通道問題引起的。 –

+0

您對IBM有同感。我更喜歡堅持JMS,而不是將自己與太陽系緊密聯繫在一起。 – duffymo

回答

0

不是選擇一個模式,然後定義數據,你有數據,並希望強制它來適應模式。這有點倒退。

問題:

(1)您是否將不同類型的數據放入同一隊列?即多種不同類型的發送者?

(2)發件人(發佈者)是JMS應用程序嗎? (3)您是否正在嘗試創建一個應用程序來移動/過濾IIB(Message Broker)所要執行的消息?如果不是,那麼你的程序的真正目的是什麼?


每個獨特的應用程序應該有自己的隊列。在萬聖節期間,隊列應該像蠟燭一樣分發給孩子們。

即可以說,人力資源具有以下5個應用程序:

  • 招聘
  • 工資
  • 優勢
  • 培訓
  • 員工

不要創建一個名爲隊列「 HR.Q'將處理所有的HR消息。糟糕的設計,不好的支持。

而是每個獨特的應用程序應該有自己的隊列。 即

  • 'HR.RECRUITING.Q'
  • 'HR.PAYROLL.Q'
  • 'HR.BENEFITS.Q'
  • 'HR.TRAINING.Q'
  • 「HR 。僱員。Q」
+0

我完全同意。然而,我試圖讓遺留系統的性能更好,所以我的選擇在重新設計方面受到嚴重限制。 關於您的問題: 1)否 2)否 3)不確定Message Broker的作用 我想要完成的所有工作是瀏覽大量的大量消息,而不必檢索每個消息緩衝區他們。 我可以用低級別的IBM MQ API來做到這一點,我希望可以用vanilla JMS做同樣的事情。 –

+0

你爲什麼只想讀第一個100字節左右?爲什麼不閱讀整個消息並進行處理?你是否試圖確定應用程序是否應該處理消息?即應用程序不處理隊列中是否存在消息?即你對Q1表示「不」。 – Roger

+0

該隊列包含XML文檔,前100個字節包含足夠的信息來填充排序的「收件箱」,該消息僅在用戶選擇他感興趣的項目時被消費/處理。我瞭解設計是不是最佳的,但我對消息製作者沒有任何影響。 。 。 –