将 JMS 消息属性放入 IBM MQ 队列中,并从在 Websphere liberty 上运行的其他 JMS 客户端进行访问

问题描述 投票:0回答:1

我有两个 JMS 应用程序,它们使用 IBM MQ 服务器作为单独的 MQ 服务器。我想从一个客户端设置消息属性并将消息放入 IBM 队列中。在 websphere liberty 上运行的另一端客户端应用程序使用“messageSelector”根据消息属性过滤和读取来自 IBM MQ 服务器的消息。

生产者代码

    public void send(AppMessage msg) throws JMSException {
        MessageProducer messageProducer = this.messageProducer;
        TextMessage sendMsg = session.createTextMessage();
        if (groupingEnabled) {

            sendMsg.setStringProperty(SettingsConstants.JMS_GRP_ID_PROPERTY, msg.getMsgGroupId());
        }
        // Property set in here
        sendMsg.setStringProperty("appServerID","12");
        String message = msg.composeMessage();
        sendMsg.setText(message);
        messageProducer.send(sendMsg);
    }

当我从 IBM MQ 服务器端评估消息时,“appServerID”消息属性不可见,并且 messageSelector 无法过滤消息。但是由

sendMsg.setStringProperty(SettingsConstants.JMS_GRP_ID_PROPERTY, msg.getMsgGroupId());
设置的“JMSXGroupID”是可见的并且messageSelector起作用了。

这就是 messageSelector 从消费者端实现的方式

@MessageDriven(activationConfig = {
        @ActivationConfigProperty(propertyName = "destinationType", propertyValue = "javax.jms.Queue"),
        @ActivationConfigProperty(propertyName = "destination", propertyValue = "FromPreProcessedQueue"),
        @ActivationConfigProperty(propertyName = "messageSelector", propertyValue = "appServerID = 12")
})
public class ConnectorPreProcessedBean implements MessageListener {

我尝试在消息属性名称中添加“usr”前缀,如text中所示。我收到错误消息,指示 JMS 不支持此格式。错误:“属性名称 'usr.appServerID' 不是有效的 Java(tm) 标识符”

sendMsg.setStringProperty("usr.appServerID","12");

然后我尝试添加下面的标题字段,但没有成功

MQRFH2 header = new MQRFH2();
header.setFieldValue("appServerID", "12");
sendMsg.setObjectProperty("JMS_IBM_MQRFH2", header);

从 IBM MQ 端查看的消息

[bin]$ ./amqsbcg FromPreProcessedQueue QM1

AMQSBCG0 - starts here
**********************

 MQOPEN - 'FromPreProcessedQueue'


 MQGET of message number 1, CompCode:0 Reason:0
****Message descriptor****

  StrucId  : 'MD  '  Version : 2
  Report   : 0  MsgType : 8
  Expiry   : -1  Feedback : 0
  Encoding : 273  CodedCharSetId : 1208
  Format : 'MQSTR   '
  Priority : 4  Persistence : 1
  MsgId : X'414D5120514D31202020202020202020C49A036602850140'
  CorrelId : X'000000000000000000000000000000000000000000000000'
  BackoutCount : 0
  ReplyToQ       : '                                                '
  ReplyToQMgr    : 'QM1                                             '
  ** Identity Context
  UserIdentifier : 'mqm         '
  AccountingToken :
   X'0000000000000000000000000000000000000000000000000000000000000000'
  ApplIdentityData : '                                '
  ** Origin Context
  PutApplType    : '28'
  PutApplName    : 'WebSphere MQ Client for Java'
  PutDate  : '20240327'    PutTime  : '06213953'
  ApplOriginData : '    '

  GroupId : X'300000000000000000000000000000000000000000000000'
  MsgSeqNumber   : '1'
  Offset         : '0'
  MsgFlags       : '8'
  OriginalLength : '-1'

****   Message      ****

 length - 33 of 33 bytes

00000000:  1C1C 3232 3432 301C 4446 4958 2049 4E46           '..22420. INF'
00000010:  4F52 4D41 5449 4F4E 2052 4551 5545 5354           'ORMATION REQUEST'
00000020:  1C       

IBM-MQ版本:9.4.3 JMS 版本:来自 Maven 的 javax.jms:j2ee:j2ee:1.4 (j2ee-1.4.jar)

有人可以通过设置自定义消息属性来帮助解决此问题。请注意,这适用于 JMS 中的现有属性。

queue jms ibm-mq websphere-liberty
1个回答
0
投票

对于 amqsbcg 输出,示例有第三个参数,用于控制消息属性的处理。如果不指定选项,默认值为 0,即 PROPS_AS_Q_DEF。由于您的输出既不包含属性部分也不包含 RFH2 标头,我怀疑这意味着您的队列是用 PROPCTL(NONE) 定义的。这意味着消息返回到 amqsbcg 时没有任何属性。

尝试使用 1 作为第三个参数运行 amqsbcg,看看是否打印出属性。

(我知道这没有回答原来的问题,应该是一条评论,但我还没有积累足够的声誉来发表评论,抱歉)。

© www.soinside.com 2019 - 2024. All rights reserved.