I have a publisher that uses JMS to publish data to a topic via AMQP. It uses a message broker called WSO2 message broker.
In the default java implementation a received message is mapped to a javax.jms.MapMessage
object and the values are extracted from a map with key,value pairs.
I want to subscribe to a topic from a Go client to retrieve the messages. I could connect to the message broker with https://github.com/streadway/amqp library and retrieve the required message with the amqp.Delivery type and it's body as a byte array. But when I try to Unmarshal/decode it to a struct/map, I get the error invalid character '\x00' looking for beginning of value
.
This is the message received from the java side,
Body:
{event_type=key_manager_configuration, name=NewKM, action=update, type=Okta, tenantDomain=carbon.super, value=eyJjbGFpbV9tYXBwaW5ncyI6W10sImF1dGhvcml6ZV9lbmRwb2ludCI6Imh0dHBzOi8vZGV2LTI3MzEwNDkub2t0YS5jb20vb2F1dGgyL2RlZmF1bHQvdjEvYXV0aG9yaXplIiwiYXBpS2V5IjoiMDBRakd2aFotVThxNVptQ1dwRVY5Qy0zNVE2QzFjdXhOTEtVMDhidjJYIiwiZ3JhbnRfdHlwZXMiOlsiYXV0aG9yaXphdGlvbl9jb2RlIiwiaW1wbGljaXQiLCJyZWZyZXNoX3Rva2VuIiwicGFzc3dvcmQiLCJjbGllbnRfY3JlZGVudGlhbHMiXSwiZW5hYmxlX29hdXRoX2FwcF9jcmVhdGlvbiI6dHJ1ZSwiaW50cm9zcGVjdGlvbl9lbmRwb2ludCI6Imh0dHBzOi8vZGV2LTI3MzEwNDkub2t0YS5jb20vb2F1dGgyL2RlZmF1bHQvdjEvaW50cm9zcGVjdCIsImNlcnRpZmljYXRlX3ZhbHVlIjoiaHR0cHM6Ly9kZXYtMjczMTA0OS5va3RhLmNvbS9vYXV0aDIvZGVmYXVsdC92MS9rZXlzIiwiZW5hYmxlX3Rva2VuX2dlbmVyYXRpb24iOnRydWUsImNsaWVudF9pZCI6IjBvYTFjeDR5ajI4UVJzMUhINWQ2IiwiaXNzdWVyIjoiaHR0cHM6Ly9kZXYtMjczMTA0OS5va3RhLmNvbS9vYXV0aDIvZGVmYXVsdCIsImVuYWJsZV9tYXBfb2F1dGhfY29uc3VtZXJfYXBwcyI6dHJ1ZSwiZW5hYmxlX3Rva2VuX2hhc2giOmZhbHNlLCJzZWxmX3ZhbGlkYXRlX2p3dCI6ZmFsc2UsInJldm9rZV9lbmRwb2ludCI6Imh0dHBzOi8vZGV2LTI3MzEwNDkub2t0YS5jb20vb2F1dGgyL2RlZmF1bHQvdjEvcmV2b2tlIiwid2VsbF9rbm93bl9lbmRwb2ludCI6Imh0dHBzOi8vZGV2LTI3MzEwNDkub2t0YS5jb20vb2F1dGgyL2RlZmF1bHQvLndlbGwta25vd24vb2F1dGgtYXV0aG9yaXphdGlvbi1zZXJ2ZXIiLCJzY29wZXNfY2xhaW0iOiJzY3AiLCJlbmFibGVfdG9rZW5fZW5jcnlwdGlvbiI6ZmFsc2UsImNsaWVudF9yZWdpc3RyYXRpb25fZW5kcG9pbnQiOiJodHRwczovL2Rldi0yNzMxMDQ5Lm9rdGEuY29tL29hdXRoMi92MS9jbGllbnRzIiwidG9rZW5fZm9ybWF0X3N0cmluZyI6Ilt7XCJpZFwiOjEsXCJlbmFibGVcIjp0cnVlLFwidHlwZVwiOlwiSldUXCIsXCJ2YWx1ZVwiOntcImJvZHlcIjp7fX19XSIsImNvbnN1bWVyX2tleV9jbGFpbSI6ImNpZCIsImNsaWVudF9zZWNyZXQiOiJaclZfNnAtcS0zSy01bzdldFFicmtwUm9MMmI1UDZYeU1rcTZXclNSIiwiY2VydGlmaWNhdGVfdHlwZSI6IkpXS1MiLCJ0b2tlbl9lbmRwb2ludCI6Imh0dHBzOi8vZGV2LTI3MzEwNDkub2t0YS5jb20vb2F1dGgyL2RlZmF1bHQvdjEvdG9rZW4ifQ==, enabled=false}
JMS Correlation ID: null
JMS timestamp: 1607418910052
JMS expiration: 0
JMS priority: 4
JMS delivery mode: 2
JMS reply to: null
JMS Redelivered: false
JMS Destination: topic://amq.topic/keymanager/?routingkey='keymanager'&exclusive='true'&autodelete='true'
JMS Type: null
JMS MessageID: ID:d0ef4dac-9844-3e66-9a4e-a8f2448d360d
JMS Content-Type: amqp/map
AMQ message number: 6
Properties:
JMS_QPID_DESTTYPE = 2
This is the converted string from the byte array received from Go side,
\x00\x00\a\x0f\x00\x00\x00\a\nevent_type\x98\x00\x00\x00\x19key_manager_configuration\x04name\x98\x00\x00\x00\x05NewKM\x06action\x98\x00\x00\x00\x06update\x04type\x98\x00\x00\x00\x04Okta\ftenantDomain\x98\x00\x00\x00\fcarbon.super\x05value\x98\x00\x00\x06\x80eyJjbGFpbV9tYXBwaW5ncyI6W10sImF1dGhvcml6ZV9lbmRwb2ludCI6Imh0dHBzOi8vZGV2LTI3MzEwNDkub2t0YS5jb20vb2F1dGgyL2RlZmF1bHQvdjEvYXV0aG9yaXplIiwiYXBpS2V5IjoiMDBRakd2aFotVThxNVptQ1dwRVY5Qy0zNVE2QzFjdXhOTEtVMDhidjJYIiwiZ3JhbnRfdHlwZXMiOlsiYXV0aG9yaXphdGlvbl9jb2RlIiwiaW1wbGljaXQiLCJyZWZyZXNoX3Rva2VuIiwicGFzc3dvcmQiLCJjbGllbnRfY3JlZGVudGlhbHMiXSwiZW5hYmxlX29hdXRoX2FwcF9jcmVhdGlvbiI6dHJ1ZSwiaW50cm9zcGVjdGlvbl9lbmRwb2ludCI6Imh0dHBzOi8vZGV2LTI3MzEwNDkub2t0YS5jb20vb2F1dGgyL2RlZmF1bHQvdjEvaW50cm9zcGVjdCIsImNlcnRpZmljYXRlX3ZhbHVlIjoiaHR0cHM6Ly9kZXYtMjczMTA0OS5va3RhLmNvbS9vYXV0aDIvZGVmYXVsdC92MS9rZXlzIiwiZW5hYmxlX3Rva2VuX2dlbmVyYXRpb24iOnRydWUsImNsaWVudF9pZCI6IjBvYTFjeDR5ajI4UVJzMUhINWQ2IiwiaXNzdWVyIjoiaHR0cHM6Ly9kZXYtMjczMTA0OS5va3RhLmNvbS9vYXV0aDIvZGVmYXVsdCIsImVuYWJsZV9tYXBfb2F1dGhfY29uc3VtZXJfYXBwcyI6dHJ1ZSwiZW5hYmxlX3Rva2VuX2hhc2giOmZhbHNlLCJzZWxmX3ZhbGlkYXRlX2p3dCI6ZmFsc2UsInJldm9rZV9lbmRwb2ludCI6Imh0dHBzOi8vZGV2LTI3MzEwNDkub2t0YS5jb20vb2F1dGgyL2RlZmF1bHQvdjEvcmV2b2tlIiwid2VsbF9rbm93bl9lbmRwb2ludCI6Imh0dHBzOi8vZGV2LTI3MzEwNDkub2t0YS5jb20vb2F1dGgyL2RlZmF1bHQvLndlbGwta25vd24vb2F1dGgtYXV0aG9yaXphdGlvbi1zZXJ2ZXIiLCJzY29wZXNfY2xhaW0iOiJzY3AiLCJlbmFibGVfdG9rZW5fZW5jcnlwdGlvbiI6ZmFsc2UsImNsaWVudF9yZWdpc3RyYXRpb25fZW5kcG9pbnQiOiJodHRwczovL2Rldi0yNzMxMDQ5Lm9rdGEuY29tL29hdXRoMi92MS9jbGllbnRzIiwidG9rZW5fZm9ybWF0X3N0cmluZyI6Ilt7XCJpZFwiOjEsXCJlbmFibGVcIjp0cnVlLFwidHlwZVwiOlwiSldUXCIsXCJ2YWx1ZVwiOntcImJvZHlcIjp7fX19XSIsImNvbnN1bWVyX2tleV9jbGFpbSI6ImNpZCIsImNsaWVudF9zZWNyZXQiOiJaclZfNnAtcS0zSy01bzdldFFicmtwUm9MMmI1UDZYeU1rcTZXclNSIiwiY2VydGlmaWNhdGVfdHlwZSI6IkpXS1MiLCJ0b2tlbl9lbmRwb2ludCI6Imh0dHBzOi8vZGV2LTI3MzEwNDkub2t0YS5jb20vb2F1dGgyL2RlZmF1bHQvdjEvdG9rZW4ifQ==\aenabled\b\x00
If someone can direct me towards a workaround to make the message usable it would be a great help.
This is the code snippet used to unmarshal the message
func handle(deliveries <-chan amqp.Delivery, done chan error) {
for d := range deliveries {
var bar map[string]string
err := json.Unmarshal(d.Body, &bar)
if err != nil {
log.Println(err)
}
log.Println(bar)
d.Ack(false)
}
log.Printf("handle: deliveries channel closed")
done <- nil
}
Don't rely on broker or protocol specific conversions. You should send protocol agnostic data (e.g. JSON, protobuf, XML, etc.) and then do the conversions in the clients.
If you rely on the broker for such functionality then you're at its mercy which means things may change if you ever change brokers. This is bad for application portability and ultimately threatens application stability.