Creating JMS‑Compatible Messages With Other APIs
This section shows code samples of how non-JMS Solace Messaging APIs can create and set data on messages so that the Solace Messaging API for JMS can interpret those messages as one of the following standard message types:
BytesMessage
The following examples show how to create and receive a BytesMessage using non-JMS Solace Messaging APIs.
Solace JCSMP API
Create:
BytesMessage message = JCSMPFactory.onlyInstance().createMessage(BytesMessage.class);
message.setData(new byte[] {0x01, 0x02});
Receive:
FlowReceiver receiver = session.createFlow(endpoint, topic, null); receiver.start(); BytesMessage message = (BytesMessage)receiver.receive(); byte[] data = message.getData();
Solace C API
Create:
solClient_opaqueMsg_pt msg_p = NULL;
char* data[2];
// create a message
if (solClient_msg_alloc(&msg_p) == SOLCLIENT_OK)
{
// copy the content of data to the binary attachment
if ( solClient_msg_setBinaryAttachment (msg_p,data,(solClient_uint32_t)2) == SOLCLIENT_OK)
{
// at this point the message is ready to be sent
}
}
Receive:
// binary attachment buffer pointer and size
void *dataBuf_p;
solClient_uint32_t dataBufSize;
// Assuming that msg_p is a reference to a received message
if (solClient_msg_getBinaryAttachmentPtr(msg_p, &dataBuf_p, &dataBufSize ) == SOLCLIENT_OK)
{
// at this point dataBuf_p and dataBufSize can be used to access or copy out
// the binary attachment
}
Solace .NET API
Create:
// create a message
IMessage message = ContextFactory.Instance.CreateMessage();
byte[] data = {0x01, 0x02};
message.BinaryAttachment = data;
// Set other message properties
// ...
// at this point the message is ready to be sent
Receive:
// assuming that message is a reference to a received message
IMessage message = args.Message; /*args is a MessageEventArgs*/
if (SDTUtils.GetContainer(message) == null && SDTUtils.GetText(message) == null)
{
// it is not a map, stream or text message
Byte[] rxData = message.BinaryAttachment;
}
Solace JavaScript API
Create:
// the binary data var data; // create a message var message = solace.SolclientFactory.createMessage(); // assuming that data the user added content to data message.setBinaryAttachment(data); // Set other message properties // ... // At this point the message is ready to be sent
Receive:
// assuming that message is a reference to a received message
var message;
if (message.getType() == solace.MessageType.BINARY)
{
// rxData will be the JavaScript string representing the binary data
var rxData = message.getBinaryAttachment();
}
MapMessage
The following examples show how to create and receive a MapMessage using non-JMS Solace Messaging APIs.
Solace JCSMP API
Create:
MapMessage message = JCSMPFactory.onlyInstance().createMessage(MapMessage.class);
SDTMap map = JCSMPFactory.onlyInstance().createMap();
map.putBoolean("success", true);
message.setMap(map);
Receive:
FlowReceiver receiver = session.createFlow(endpoint, topic, null);
receiver.start();
MapMessage message = (MapMessage )receiver.receive();
if (message !=null) {
SDTMap rcvdMap = message.getMap();
...
}
Solace C API
Create (message independent container):
solClient_opaqueMsg_pt msg_p = NULL;
solClient_opaqueContainer_pt mapContainer = NULL;
char map[1024];
// create a message
if (solClient_msg_alloc(&msg_p) == SOLCLIENT_OK)
{
// create a map container
if (solClient_container_createMap (&mapContainer, map, sizeof(map) == SOLCLIENT_OK)
{
// populate the map container
// ...
// set the map container as message payload
if (solClient_msg_setBinaryAttachmentContainer (msg_p, mapContainer) == SOLCLIENT_OK)
{
// at this point the message is ready to be sent
}
}
}
Create (message dependent container):
solClient_opaqueMsg_pt msg_p = NULL;
solClient_opaqueContainer_pt mapContainer = NULL;
// create a message
if (solClient_msg_alloc(&msg_p) == SOLCLIENT_OK)
{
// create a map container
if (solClient_msg_createBinaryAttachmentMap (msg_p, &mapContainer, 1024) == SOLCLIENT_OK)
{
// populate the map container
// ...
// at this point the message is ready to be sent
}
}
Receive:
solClient_opaqueContainer_pt mapContainer = NULL;
// Assuming that msg_p is a reference to a received message
if (solClient_msg_getBinaryAttachmentMap (msg_p, &mapContainer) == SOLCLIENT_OK)
{
// At this point mapContainer is accessible using SDT accessor functions
// ...
}
Solace .NET API
Create (message independent container):
// create a message
IMessage message = ContextFactory.Instance.CreateMessage();
// create a map container and populate it
IMapContainer map = SDTUtils.CreateMap(1024);
// set the map as the message payload
SDTUtils.SetSDTContainer(message,map);
Create (message dependent container):
// create a message IMessage message = ContextFactory.Instance.CreateMessage(); // create a map container and populate it IMapContainer map = SDTUtils.CreateMap(message,1024); // no need to add the map to the message, it is already in the payload
Receive:
// assuming that message is a reference to a received message
IMessage message = args.Message; /*args is a MessageEventArgs*/
ISDTContainer container = SDTUtils.GetContainer(message);
if (container != null && container is IMapContainer)
{
// typecast the container to IMapContainer
IMapContainer map = (IMapContainer) container;
}
Solace JavaScript API
Create:
// create the map container var map = new solace.SDTMapContainer(); // create a message var message = solace.SolclientFactory.createMessage(); // assuming the map contains entries message.setSdtContainer(solace.SDTField.create(solace.SDTFieldType.MAP, map)); // set other message properties // ... // at this point the message is ready to be sent
Receive:
// assuming that message is a reference to a received message
var message;
if (message.getType() == solace.MessageType.MAP)
{
var rxMap = message.getSdtContainer();
}
StreamMessage
The following examples show how to create and receive a StreamMessage using non-JMS Solace Messaging APIs.
Solace JCSMP API
Create:
StreamMessage message = JCSMPFactory.onlyInstance().createMessage(StreamMessage.class); SDTStream stream = JCSMPFactory.onlyInstance().createStream(); stream.writeBoolean(true); message.setStream(stream);
Receive:
FlowReceiver receiver = session.createFlow(endpoint, topic, null); receiver.start(); BytesMessage message = (BytesMessage)receiver.receive(); byte[] data = message.getData();
Solace C API
Create (message independent container):
solClient_opaqueMsg_pt msg_p = NULL;
solClient_opaqueContainer_pt streamContainer = NULL;
char stream[1024];
// create a message
if (solClient_msg_alloc(&msg_p) == SOLCLIENT_OK)
{
// create a stream container
if (solClient_container_createStream (&streamContainer, stream, sizeof(stream) == SOLCLIENT_OK)
{
// populate the stream container
// ...
// set the stream container as message payload
if (solClient_msg_setBinaryAttachmentContainer (msg_p, streamContainer) == SOLCLIENT_OK)
{
// at this point the message is ready to be sent
}
}
}
Create (message dependent container):
solClient_opaqueMsg_pt msg_p = NULL;
solClient_opaqueContainer_pt streamContainer = NULL;
// create a message
if (solClient_msg_alloc(&msg_p) == SOLCLIENT_OK)
{
// create a stream container
if (solClient_msg_createBinaryAttachmentStream (msg_p, &streamContainer, 1024) == SOLCLIENT_OK)
{
// populate the stream container
// ...
// at this point the message is ready to be sent
}
}
Receive:
solClient_opaqueContainer_pt streamContainer = NULL;
// Assuming that msg_p is a reference to a received message
if (solClient_msg_getBinaryAttachmentStream (msg_p, &streamContainer) == SOLCLIENT_OK)
{
// At this point streamContainer is accessible using SDT accessor functions
// ...
}
Solace .NET API
Create (message independent container):
// create a message IMessage message = ContextFactory.Instance.CreateMessage(); // create a stream container and populate it IStreamContainer map = SDTUtils.CreateStream(1024); // set the stream as the message payload SDTUtils.SetSDTContainer(message,stream);
Create (message dependent container)
// create a message IMessage message = ContextFactory.Instance.CreateMessage(); // create a stream container and populate it IStreamContainer map = SDTUtils.CreateStream(message,1024); // no need to add the stream to the message, it is already in the payload
Receive:
// assuming that message is a reference to a received message
IMessage message = args.Message; /*args is a MessageEventArgs*/
ISDTContainer container = SDTUtils.GetContainer(message);
if (container != null && container is IStreamContainer)
{
// typecast the container to IStreamContainer
IStreamContainer map = (IStreamContainer) container;
}
Solace JavaScript API
Create:
// create the stream container var stream = new solace.SDTStreamContainer(); // create a message var message = solace.SolclientFactory.createMessage(); // assuming the stream contains entries message.setSdtContainer(solace.SDTField.create(solace.SDTFieldType.STREAM, stream)); // set other message properties // ... // at this point the message is ready to be sent
Receive:
// assuming that message is a reference to a received message
var message;
if (message.getType() == solace.MessageType.STREAM)
{
var rxStream = message.getSdtContainer();
}
TextMessage
The following examples show how to create and receive a TextMessage using non-JMS Solace Messaging APIs.
Solace JCSMP API
This sample requires the JMS connection factory setting text-msg-xml-payload to be set to false, which specifies that the TextMessage string is set/get in the messageʼs binary attachment.
Create:
TextMessage message = JCSMPFactory.onlyInstance().createMessage(TextMessage.class);
message.setText("This is a text message.");
Receive:
FlowReceiver receiver = session.createFlow(endpoint, topic, null); receiver.start(); TextMessage message = (TextMessage)receiver.receive(); String text = message.getText();
Solace C API
This sample requires the JMS connection factory setting text-msg-xml-payload to be set to false, which specifies that the TextMessage string is set/get in the messageʼs binary attachment.
Create:
solClient_opaqueMsg_pt msg_p = NULL;
char* text = "This is a text message.";
// create a message
if (solClient_msg_alloc(&msg_p) == SOLCLIENT_OK)
{
if (solClient_msg_setBinaryAttachmentString (msg_p, text )== SOLCLIENT_OK)
{
// at this point the message is ready to be sent
}
}
Receive:
// pointer to the string in the payload
const char *textStr;
// Assuming that msg_p is a reference to a received message
if (solClient_msg_getBinaryAttachmentString (msg_p, &textStr) == SOLCLIENT_OK)
{
// at this point textStr points to the contained string in the
// text message payload
// ...
}
Solace .NET API
This sample requires the JMS connection factory setting text-msg-xml-payload to be set to false, which specifies that the TextMessage string is set/get in the messageʼs binary attachment.
Create:
// create a message IMessage message = ContextFactory.Instance.CreateMessage(); // and set the text SDTUtils.SetText(message,"This is a text message.");
Receive:
// assuming that message is a reference to a received message
IMessage message = args.Message; /*args is a MessageEventArgs*/
String textStr = SDTUtils.GetText(message);
if (textStr != null)
{
// message is a text message
}
Solace JavaScript API
This sample requires the JMS connection factory setting text-msg-xml-payload to be set to false, which specifies that the TextMessage string is set/get in the messageʼs binary attachment.
Create:
// create a message var message = solace.SolclientFactory.createMessage(); // set content message.setSdtContainer(solace.SDTField.create(solace.SDTFieldType.STRING, "This is a text message.")); // set other message properties // ... // at this point the message is ready to be sent
Receive:
// assuming that message is a reference to a received message
var message;
if (message.getType() == solace.MessageType.TEXT)
{
var txtStr = message.getSdtContainer().getValue();
}
ObjectMessage
Non-JMS Solace Messaging APIs do not have the ability to create a message that the Solace JMS API would interpret as an ObjectMessage.
Non-Standard Messages
When the Solace JMS API cannot interpret a message sent by a non-JMS Solace Messaging API as a JMS BytesMessage, MapMessage, StreamMessage, or TextMessage, the message is handled as a predetermined default message type according to its message payload. This message conversion is described in the following table:
| XML Payload Present? | Binary Attachment Present? | Convert to Message Type... |
|---|---|---|
|
Yes |
Yes |
TextMessage |
|
Yes |
No |
TextMessage |
|
No |
Yes |
BytesMessage |
|
No |
No |
Message (contains only header information) |