Skip to content

Commit 4e8e0ce

Browse files
committed
Support ID: prefix in JMSMessageID, JMSCorrelationID - #46
1 parent 361ac23 commit 4e8e0ce

File tree

3 files changed

+82
-0
lines changed

3 files changed

+82
-0
lines changed

getbycorrelid_test.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -130,6 +130,11 @@ func TestSelectorParsing(t *testing.T) {
130130
assert.Nil(t, msgIDErr)
131131
assert.NotNil(t, msgIDConsumer)
132132

133+
// MessageID selector that has an empty ID
134+
failMsgIDConsumer, failMsgIDErr := context.CreateConsumerWithSelector(queue, "JMSMessageID = 'ID:'")
135+
assert.NotNil(t, failMsgIDErr)
136+
assert.Nil(t, failMsgIDConsumer)
137+
133138
// Check that we get an appropriate error when trying to create a consumer with
134139
// a malformed selector.
135140
fail1Consumer, fail1Err := context.CreateConsumerWithSelector(queue, "JMSCorrelationID")

getbymsgid_test.go

Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -89,3 +89,74 @@ func TestGetByMsgID(t *testing.T) {
8989
}
9090

9191
}
92+
93+
/*
94+
* Test receiving a specific message from a queue using its JMSMessageID
95+
*/
96+
func TestGetByMsgIDWithPrefix(t *testing.T) {
97+
98+
// Loads CF parameters from connection_info.json and applicationApiKey.json in the Downloads directory
99+
cf, cfErr := mqjms.CreateConnectionFactoryFromDefaultJSONFiles()
100+
assert.Nil(t, cfErr)
101+
102+
// Creates a connection to the queue manager, using defer to close it automatically
103+
// at the end of the function (if it was created successfully)
104+
context, ctxErr := cf.CreateContext()
105+
assert.Nil(t, ctxErr)
106+
if context != nil {
107+
defer context.Close()
108+
}
109+
110+
// First, check the queue is empty
111+
queue := context.CreateQueue("DEV.QUEUE.1")
112+
consumer, conErr := context.CreateConsumer(queue)
113+
assert.Nil(t, conErr)
114+
if consumer != nil {
115+
defer consumer.Close()
116+
}
117+
reqMsgTest, err := consumer.ReceiveNoWait()
118+
assert.Nil(t, err)
119+
assert.Nil(t, reqMsgTest)
120+
121+
// Put a couple of messages before the one we're aiming to get back
122+
producer := context.CreateProducer().SetTimeToLive(10000)
123+
producer.SendString(queue, "One-prefix")
124+
producer.SendString(queue, "Two-prefix")
125+
producer.SendString(queue, "Three-prefix")
126+
127+
myMsgFourStr := "Four-prefix"
128+
sentMsg := context.CreateTextMessageWithString(myMsgFourStr)
129+
err = producer.Send(queue, sentMsg)
130+
assert.Nil(t, err)
131+
sentMsgID := sentMsg.GetJMSMessageID()
132+
133+
// Put a couple of messages after the one we're aiming to get back
134+
producer.SendString(queue, "Five-prefix")
135+
136+
// Create the consumer to read by CorrelID
137+
correlIDConsumer, correlErr := context.CreateConsumerWithSelector(queue, "JMSMessageID = 'ID:"+sentMsgID+"'")
138+
assert.Nil(t, correlErr)
139+
gotCorrelMsg, correlGetErr := correlIDConsumer.ReceiveNoWait()
140+
141+
// Clean up the remaining messages from the queue before we start checking if
142+
// we got the right one back.
143+
var cleanupMsg jms20subset.Message
144+
for ok := true; ok; ok = (cleanupMsg != nil) {
145+
cleanupMsg, err = consumer.ReceiveNoWait()
146+
}
147+
148+
// Now do the comparisons
149+
assert.Nil(t, correlGetErr)
150+
assert.NotNil(t, gotCorrelMsg)
151+
gotMsgID := gotCorrelMsg.GetJMSMessageID()
152+
assert.Equal(t, sentMsgID, gotMsgID)
153+
154+
switch msg := gotCorrelMsg.(type) {
155+
case jms20subset.TextMessage:
156+
assert.Equal(t, myMsgFourStr, *msg.GetText())
157+
default:
158+
fmt.Println(reflect.TypeOf(gotCorrelMsg))
159+
assert.Fail(t, "Got something other than a text message")
160+
}
161+
162+
}

mqjms/ConsumerImpl.go

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -322,6 +322,12 @@ func applySelector(selector string, getmqmd *ibmmq.MQMD, gmo *ibmmq.MQGMO) error
322322
stringSplits := strings.Split(value, "'")
323323
selectorValue := stringSplits[1]
324324

325+
// For CorrelID and MsgID there is typically an "ID:" prefix on the
326+
// selector value that needs to be trimmed off before we convert it.
327+
if strings.HasPrefix(selectorValue, "ID:") {
328+
selectorValue = selectorValue[3:]
329+
}
330+
325331
if selectorValue != "" {
326332

327333
selectorValueBytes := convertStringToMQBytes(selectorValue)

0 commit comments

Comments
 (0)