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 JMS API 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.

Java Messaging 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();

C Messaging 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
}

.NET Messaging 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;
}

JavaScript Messaging 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.

Java Messaging 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();
...
}

C Messaging 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
    // ...
}

.NET Messaging 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;
}

JavaScript Messaging 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.

Java Messaging 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();

C Messaging 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
     // ...
}

.NET Messaging 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;
}

JavaScript Messaging 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.

Java Messaging 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();
BytesMessage message = (BytesMessage)receiver.receive();
byte[] data = message.getData();

C Messaging 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
    // ...
}

.NET Messaging 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
}

JavaScript Messaging 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 APIs do not have the ability to create a message that the JMS API would interpret as an ObjectMessage.

Non-Standard Messages

When the JMS API cannot interpret a message sent by a non-JMS Solace 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)