How to get back the message id after publishing a message on solace topic using nodejs
hi Members,
i need help to get the message id immediately after publishing a message on topic using nodejs. i can publish a message but not sure how to get the message id back after publishing.
i tried to search on the google but no luck.
here is the code i am using to publish.
code block :
const solace = require('solclientjs'); const hostUrl = 'url'; const vpnName = 'VPN'; const userName = 'user'; const password = 'pwd'; const topicName = 'testtopic'; const messagePayload = 'hello nodejs'; const factoryProps = new solace.SolclientFactoryProperties(); solace.SolclientFactory.init(factoryProps); const session = solace.SolclientFactory.createSession({ url: hostUrl, vpnName: vpnName, userName: userName, password: password }); session.connect(); session.on(solace.SessionEventCode.UP_NOTICE, () => { console.log('Session is up.'); const message = solace.SolclientFactory.createMessage(); message.setDestination(solace.SolclientFactory.createTopicDestination(topicName)); message.setBinaryAttachment(messagePayload); message.setDeliveryMode(solace.MessageDeliveryModeType.PERSISTENT); message.setAcknowledgeImmediately(true); session.send(message); console.log(`Message sent: ${messagePayload}`); session.disconnect(); }); session.on(solace.SessionEventCode.DISCONNECTED, () => { console.log('Session is disconnected.'); }); session.on(solace.SessionEventCode.RECONNECTING_NOTICE, () => { console.log('Session is reconnecting.'); }); session.on(solace.SessionEventCode.RECONNECTED_NOTICE, () => { console.log('Session is reconnected.'); }); session.on(solace.SessionEventCode.CONNECT_FAILED_ERROR, (sessionEvent) => { console.error(`Error connecting to Solace message broker: ${sessionEvent.infoStr}`); });
*************
thanks
Answers
-
I don't think it is there in JS API yet, but I'll let others correct me if I'm wrong later :)
But what is your requirement?
I know for some use cases, we can work with something like correlation ID though, but this is something the publisher planted in the message, not the generated/assigned message ID by the broker.
Interested to see what others can suggest too.
1 -
Agree, you can't really. There is an associated message ID that the publisher might be able to see after publishing, but this is an internal number between the API and broker specifically for this particular ingress flow, and isn't / won't be the same number that the broker uses internally for storing in the message spool.
What are you trying to do? What's the use case?
1 -
-
Yeah I remember JMS send method return the message ID from the broker, but bummer if you'd want to have this in JS API :(
If you use Direct messaging, it's basically fire and forget, at least once delivery, but you can still track the published messages only from the app publisher point of view - just without a 'broker generated ID'.
But if I understand this correctly, you want to track messages succesfully sent to the broker, right?
In that sense, maybe @Aaron and others who know better can give samples around using ACK and guaranteed messaging to really make sure the broker gets your message, but then again it may not necessarily have the 'broker generated ID' but you can be sure that message is received.
1 -
thanks @arih , yes you are right it wont be broker provided message id as per my understanding. may be others can suggest if any way of getting that. only way i could figure out is to use the method message.setApplicationMessageId which will bet set as a message id in payload.
0 -
Ok, I had to go dig up some JavaScript samples and some JMS samples to test this stuff out myself.
First: the message ID that appears to auto-populate with the JMS API is also known as the Application Message ID in our native SMF APIs. This is set by the app, or the API, and appears to be set automatically with JMS. The value I see:
JMSMessageID: ID:172.31.233.989ffb187d91d9a150:0 AppMessageID: ID:172.31.233.989ffb187d91d9a150:0
I'm not sure how/where this is getting set. In fact, I can't seem to override it with
message.setJMSMessageID("blah");
which is a bit weird. I'm going to ask about that.But anyhow, this is not an ID that is set by the broker. There are other IDs (the message spool ID you can see inside PubSub+ Manager listing of messages inside the queue, and also the Replication Group Message ID).
So yes, the exact equivalent of this particular message header (JMS Message ID), is the "Application Message ID" in other Solace APIs. This is an application-owned/set metadata on the message that the broker doesn't use. And it is our recommendation that for any ID that the application requires for end-to-end tracking, this one is a good choice.
Note: this is not inside the payload. It's a header field.
Finally: if you're using JMS: I'd urge you to double-check that your publishers are not sending TextMessages using the default XML portion of the payload. This is the default configuration, and is due to legacy reasons, but it is very much not the recommended way. Double-check your connection factories.
1 -
Hi @solacenewbie80 , just a quick follow-up here. Yes, the JMS Message ID is auto-populated by the API, and is not settable by the application. The format of it is set by the API, and there are apparently some options: https://docs.solace.com/API/Solace-JMS-API/Data-Connection-Properti.htm#Message
The main thing is: it's not set by the broker.
So you can emulate the same behaviour in other non-JMS APIs... just set it yourself... as you noted, the Application Message ID is the same field. So populate it with any unique-type value that you wish.
However, note that this value won't be visible in the broker... you'll have to consume the message to be able to see it. So I'm still wondering: what are you using this message ID for? Just to have "some ID #" for a message? Or do you need some kind of traceability ID for your published messages?
0