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 tables provide code examples of 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 tables provide code examples of 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 tables provide code examples of 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 tables provide code examples of how to create and receive a TextMessage using non-JMS Solace messaging APIs.

Note:  These samples require 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.

Java Messaging API

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

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 payloa

    // …

}

.NET Messaging API

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

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.

Conversion of Received Non-Standard Messages

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)