我有两个 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 中的现有属性。
对于 amqsbcg 输出,示例有第三个参数,用于控制消息属性的处理。如果不指定选项,默认值为 0,即 PROPS_AS_Q_DEF。由于您的输出既不包含属性部分也不包含 RFH2 标头,我怀疑这意味着您的队列是用 PROPCTL(NONE) 定义的。这意味着消息返回到 amqsbcg 时没有任何属性。
尝试使用 1 作为第三个参数运行 amqsbcg,看看是否打印出属性。
(我知道这没有回答原来的问题,应该是一条评论,但我还没有积累足够的声誉来发表评论,抱歉)。