跳到主要内容

使用其他API创建JMS兼容消息

本节展示了如何使用非JMS PubSub+消息API创建和设置消息数据,以便PubSub+ JMS API可以将这些消息解释为以下标准消息类型之一:

  • BytesMessage
  • MapMessage
  • StreamMessage
  • TextMessage
  • ObjectMessage
  • 非标准消息

BytesMessage

以下示例展示了如何使用非JMS PubSub+消息API创建和接收BytesMessage。

PubSub+ JCSMP API

创建

BytesMessage message = JCSMPFactory.onlyInstance().createMessage(BytesMessage.class);
message.setData(new byte[] {0x01, 0x02});

接收

FlowReceiver receiver = session.createFlow(endpoint, topic, null);
receiver.start();
BytesMessage message = (BytesMessage)receiver.receive();
byte[] data = message.getData();

PubSub+ C API

创建

solClient_opaqueMsg_pt msg_p = NULL;
char* data[2];

// 创建消息
if (solClient_msg_alloc(&msg_p) == SOLCLIENT_OK)
{
// 将数据内容复制到二进制附件中
if ( solClient_msg_setBinaryAttachment (msg_p, data, (solClient_uint32_t)2) == SOLCLIENT_OK)
{
// 此时消息已准备好发送
}
}

接收

// 二进制附件缓冲区指针和大小
void *dataBuf_p;
solClient_uint32_t dataBufSize;

// 假设msg_p是接收到的消息的引用
if (solClient_msg_getBinaryAttachmentPtr(msg_p, &dataBuf_p, &dataBufSize ) == SOLCLIENT_OK)
{
// 此时可以使用dataBuf_p和dataBufSize访问或复制二进制附件
}

PubSub+ .NET API

创建

// 创建消息
IMessage message = ContextFactory.Instance.CreateMessage();
byte[] data = {0x01, 0x02};
message.BinaryAttachment = data;
// 设置其他消息属性
// ...
// 此时消息已准备好发送

接收

// 假设message是接收到的消息的引用
IMessage message = args.Message; /*args是MessageEventArgs*/
if (SDTUtils.GetContainer(message) == null && SDTUtils.GetText(message) == null)
{
// 它不是map、stream或text消息
Byte[] rxData = message.BinaryAttachment;
}

PubSub+ JavaScript API

创建

// 二进制数据
var data;

// 创建消息
var message = solace.SolclientFactory.createMessage();

// 假设用户向data添加了内容
message.setBinaryAttachment(data);
// 设置其他消息属性
// ...
// 此时消息已准备好发送

接收

// 假设message是接收到的消息的引用
var message;
if (message.getType() == solace.MessageType.BINARY)
{
// rxData将是表示二进制数据的JavaScript字符串
var rxData = message.getBinaryAttachment();
}

MapMessage

以下示例展示了如何使用非JMS PubSub+消息API创建和接收MapMessage。

PubSub+ JCSMP API

创建

MapMessage message = JCSMPFactory.onlyInstance().createMessage(MapMessage.class);
SDTMap map = JCSMPFactory.onlyInstance().createMap();
map.putBoolean("success", true);
message.setMap(map);

接收

FlowReceiver receiver = session.createFlow(endpoint, topic, null);

receiver.start();

MapMessage message = (MapMessage )receiver.receive();
if (message !=null) {
SDTMap rcvdMap = message.getMap();
...
}

PubSub+ C API

创建(消息独立容器)

solClient_opaqueMsg_pt msg_p = NULL;
solClient_opaqueContainer_pt mapContainer = NULL;
char map[1024];

// 创建消息
if (solClient_msg_alloc(&msg_p) == SOLCLIENT_OK)
{
// 创建map容器
if (solClient_container_createMap (&mapContainer, map, sizeof(map)) == SOLCLIENT_OK)
{
// 填充map容器
// ...
// 将map容器设置为消息负载
if (solClient_msg_setBinaryAttachmentContainer (msg_p, mapContainer) == SOLCLIENT_OK)
{
// 此时消息已准备好发送
}

}
}

创建(消息依赖容器)

solClient_opaqueMsg_pt msg_p = NULL;
solClient_opaqueContainer_pt mapContainer = NULL;

// 创建消息
if (solClient_msg_alloc(&msg_p) == SOLCLIENT_OK)
{
// 创建map容器
if (solClient_msg_createBinaryAttachmentMap (msg_p, &mapContainer, 1024) == SOLCLIENT_OK)
{
// 填充map容器
// ...
// 此时消息已准备好发送

}
}

接收

solClient_opaqueContainer_pt mapContainer = NULL;

// 假设msg_p是接收到的消息的引用
if (solClient_msg_getBinaryAttachmentMap (msg_p, &mapContainer) == SOLCLIENT_OK)
{
// 此时可以使用SDT访问器函数访问mapContainer
// ...
}

PubSub+ .NET API

创建(消息独立容器)

// 创建消息
IMessage message = ContextFactory.Instance.CreateMessage();

// 创建map容器并填充它
IMapContainer map = SDTUtils.CreateMap(1024);

// 将map设置为消息负载
SDTUtils.SetSDTContainer(message, map);

创建(消息依赖容器)

// 创建消息
IMessage message = ContextFactory.Instance.CreateMessage();

// 创建map容器并填充它
IMapContainer map = SDTUtils.CreateMap(message, 1024);

// 不需要将map添加到消息中,它已经在负载中

接收

// 假设message是接收到的消息的引用
IMessage message = args.Message; /*args是MessageEventArgs*/
ISDTContainer container = SDTUtils.GetContainer(message);
if (container != null && container is IMapContainer)
{
// 将容器转换为IMapContainer
IMapContainer map = (IMapContainer) container;
}

PubSub+ JavaScript API

创建

// 创建map容器
var map = new solace.SDTMapContainer();

// 创建消息
var message = solace.SolclientFactory.createMessage();

// 假设map包含条目
message.setSdtContainer(solace.SDTField.create(solace.SDTFieldType.MAP, map));

// 设置其他消息属性
// ...
// 此时消息已准备好发送

接收

// 假设message是接收到的消息的引用
var message;
if (message.getType() == solace.MessageType.MAP)
{
var rxMap = message.getSdtContainer();
}

StreamMessage

以下示例展示了如何使用非JMS PubSub+消息API创建和接收StreamMessage。

PubSub+ JCSMP API

创建

StreamMessage message = JCSMPFactory.onlyInstance().createMessage(StreamMessage.class);
SDTStream stream = JCSMPFactory.onlyInstance().createStream();
stream.writeBoolean(true);
message.setStream(stream);

接收

FlowReceiver receiver = session.createFlow(endpoint, topic, null);
receiver.start();
BytesMessage message = (BytesMessage)receiver.receive();
byte[] data = message.getData();

PubSub+ C API

创建(消息独立容器)

solClient_opaqueMsg_pt msg_p = NULL;
solClient_opaqueContainer_pt streamContainer = NULL;
char stream[1024];

// 创建消息
if (solClient_msg_alloc(&msg_p) == SOLCLIENT_OK)
{
// 创建stream容器
if (solClient_container_createStream (&streamContainer, stream, sizeof(stream)) == SOLCLIENT_OK)
{
// 填充stream容器
// ...
// 将stream容器设置为消息负载
if (solClient_msg_setBinaryAttachmentContainer (msg_p, streamContainer) == SOLCLIENT_OK)
{
// 此时消息已准备好发送
}
}
}

创建(消息依赖容器)

solClient_opaqueMsg_pt msg_p = NULL;
solClient_opaqueContainer_pt streamContainer = NULL;

// 创建消息
if (solClient_msg_alloc(&msg_p) == SOLCLIENT_OK)
{
// 创建stream容器
if (solClient_msg_createBinaryAttachmentStream (msg_p, &streamContainer, 1024) == SOLCLIENT_OK)
{
// 填充stream容器
// ...
// 此时消息已准备好发送

}
}

接收

solClient_opaqueContainer_pt streamContainer = NULL;

// 假设msg_p是接收到的消息的引用
if (solClient_msg_getBinaryAttachmentStream (msg_p, &streamContainer) == SOLCLIENT_OK)
{
// 此时可以使用SDT访问器函数访问streamContainer
// ...
}

PubSub+ .NET API

创建(消息独立容器)

// 创建消息
IMessage message = ContextFactory.Instance.CreateMessage();

// 创建stream容器并填充它
IStreamContainer map = SDTUtils.CreateStream(1024);

// 将stream设置为消息负载
SDTUtils.SetSDTContainer(message, stream);

创建(消息依赖容器)

// 创建消息
IMessage message = ContextFactory.Instance.CreateMessage();

// 创建stream容器并填充它
IStreamContainer map = SDTUtils.CreateStream(message, 1024);

// 不需要将stream添加到消息中,它已经在负载中

接收

// 假设message是接收到的消息的引用
IMessage message = args.Message; /*args是MessageEventArgs*/
ISDTContainer container = SDTUtils.GetContainer(message);
if (container != null && container is IStreamContainer)
{
// 将容器转换为IStreamContainer
IStreamContainer map = (IStreamContainer) container;
}

PubSub+ JavaScript API

创建

// 创建stream容器
var stream = new solace.SDTStreamContainer();

// 创建消息
var message = solace.SolclientFactory.createMessage();

// 假设stream包含条目
message.setSdtContainer(solace.SDTField.create(solace.SDTFieldType.STREAM, stream));

// 设置其他消息属性
// ...
// 此时消息已准备好发送

接收

// 假设message是接收到的消息的引用
var message;
if (message.getType() == solace.MessageType.STREAM)
{
var rxStream = message.getSdtContainer();
}

TextMessage

以下示例展示了如何使用非JMS PubSub+消息API创建和接收TextMessage。

PubSub+ JCSMP API

此示例需要JMS连接工厂设置text-msg-xml-payload设置为false,这指定TextMessage字符串在消息的二进制附件中设置/获取。

创建

TextMessage message = JCSMPFactory.onlyInstance().createMessage(TextMessage.class);
message.setText("This is a text message.");

接收

FlowReceiver receiver = session.createFlow(endpoint, topic, null);
receiver.start();
TextMessage message = (TextMessage)receiver.receive();
String text = message.getText();

PubSub+ C API

此示例需要JMS连接工厂设置text-msg-xml-payload设置为false,这指定TextMessage字符串在消息的二进制附件中设置/获取。

创建

solClient_opaqueMsg_pt msg_p = NULL;
char* text = "This is a text message.";

// 创建消息
if (solClient_msg_alloc(&msg_p) == SOLCLIENT_OK)
{
if (solClient_msg_setBinaryAttachmentString (msg_p, text )== SOLCLIENT_OK)
{
// 此时消息已准备好发送
}
}

接收

// 指向负载中的字符串
const char *textStr;

// 假设msg_p是接收到的消息的引用
if (solClient_msg_getBinaryAttachmentString (msg_p, &textStr) == SOLCLIENT_OK)
{
// 此时textStr指向文本消息负载中的字符串
// ...
}

PubSub+ .NET API

此示例需要JMS连接工厂设置text-msg-xml-payload设置为false,这指定TextMessage字符串在消息的二进制附件中设置/获取。

创建

// 创建消息
IMessage message = ContextFactory.Instance.CreateMessage();

// 设置文本
SDTUtils.SetText(message,"This is a text message.");

接收

// 假设message是接收到的消息的引用
IMessage message = args.Message; /*args是MessageEventArgs*/
String textStr = SDTUtils.GetText(message);
if (textStr != null)
{
// 消息是文本消息
}

PubSub+ JavaScript API

此示例需要JMS连接工厂设置text-msg-xml-payload设置为false,这指定TextMessage字符串在消息的二进制附件中设置/获取。

创建

// 创建消息
var message = solace.SolclientFactory.createMessage();

// 设置内容
message.setSdtContainer(solace.SDTField.create(solace.SDTFieldType.STRING, "This is a text message."));

// 设置其他消息属性
// ...
// 此时消息已准备好发送

接收

// 假设message是接收到的消息的引用
var message;
if (message.getType() == solace.MessageType.TEXT)
{
var txtStr = message.getSdtContainer().getValue();
}

ObjectMessage

非JMS PubSub+消息API无法创建JMS API会解释为ObjectMessage的消息。

非标准消息

当JMS API无法将非JMS PubSub+消息API发送的消息解释为JMS BytesMessage、MapMessage、StreamMessage或TextMessage时,根据其消息负载,消息将被处理为预定的默认消息类型。此消息转换在下表中描述:

是否存在XML负载是否存在二进制附件转换为消息类型...
TextMessage
TextMessage
BytesMessage
Message(仅包含头信息)