跳到主要内容

Saydo实现注意事项

本节提供了一些 Solace 特定的实现细节,以帮助开发人员在实现 OpenMAMA 消息应用程序时。

主题结构

当客户端应用程序订阅主题或向主题发布消息时,呈现给 Solace 中间件桥接的根、源和符号字符串值用于主题。(注意,订阅不提供根变量,但可能在源中包含根值。)

OpenMAMA 使用点(“.”)字符分隔主题级别。然而,Solace PubSub+ 使用正斜杠(“/”)字符分隔这三个主题级别。

因此,为了从 OpenMAMA 客户端提供的三个变量生成符合 Solace 使用的主题语法的主题,Solace 中间件桥接将收到的订阅中的根、源和符号变量中的任何“/”字符替换为“^”字符。然后将根、源和符号连接成一个字符串,并使用“/”字符分隔非 NULL 的变量。主题订阅以转换后的主题语法保存到事件代理。

语言调用
原始字符/
Solace 中间件桥接使用^

Solace 中间件桥接的特殊字符转换

主题通配符

当使用 OpenMAMA 通配符基本订阅创建函数时,Solace 中间件桥接将把“”和“>”字符视为根、源、符号变量的通配符。只有在用于特殊的通配符基本订阅创建函数时,“”和“>”通配符字符才被支持为通配符。

字典前缀和后缀的处理

OpenMAMA 字典的订阅请求在主题中添加了标识前缀“_MDDD.”(例如,“_MDDD.TEST.DATA_DICT”,其中“TEST”是源)。

发布 OpenMAMA 字典在主题中添加了标识的“.DATA_DICT”后缀(例如,“TEST.DATA_DICT”,其中“TEST”是源)。

Solace 中间件桥接以以下方式处理这些字典前缀和后缀,并将 OpenMAMA 主题分隔符“.”更改为 Solace 主题分隔符“/”:

以“.DATA_DICT”结尾且不以“_MDDD.”开头的主题发布的消息将被添加前缀“#MDDD/”。

示例:

  • 发布的 OpenMAMA 数据字典主题“TEST.DATA_DICT”被转换为“#MDDD/TEST/DATA_DICT”
  • 发布的 OpenMAMA 数据字典主题“_MDDD.TEST.DATA_DICT”被转换为“_MDDD/TEST/DATA_DICT”

当启用 PubSub+ 缓存时,字典快照订阅(MAMA_SUBSC_DDICT_SNAPSHOT)被重定向到 PubSub+ 缓存实例,并将其主题从“_MDDD/TEST/DATA_DICT”更改为“#MDDD/TEST/DATA_DICT”

示例:

OpenMAMA 字典快照主题订阅“_MDDD.TEST.DATA_DICT”被转换为 Solace 主题“#MDDD/TEST/DATA_DICT”

Saydo特殊前缀

Solace PubSub+ 使用一些特殊主题来促进特定的消息交换模式。这些特殊主题始终以“#”字符开头。例如,Solace API 可以为客户端创建一个以“#P2P”开头的独特主题订阅,这使得在请求/回复场景中可以直接将消息发送到客户端。Solace 中间件桥接不会强制限制以“#”开头的 OpenMAMA 主题订阅,然而,建议您避免使用它们。

负载字段类型

Solace 负载桥接支持 OpenMAMA 2.3.1 版本支持的所有负载类型。此外,Solace 负载桥接还提供对布尔向量和字符向量负载类型的支持。

目前,这些负载类型仅在使用 OpenMAMA 2.3.1 版本时由 Solace 负载桥接支持。然而,它们已被 OpenMAMA 项目接受,并预计将在 OpenMAMA 2.3.3 版本中得到支持。

  • 要设置布尔向量负载,请调用 mamaMsg_addVectorBool(...)
  • 要设置字符向量负载,请调用 mamaMsg_addVectorChar(...)

异步发布失败通知

对于 Solace 中间件桥接,传输主题事件用于通知应用程序异步发布者失败。

当 Solace 会话在会话事件回调中收到 SOLCLIENT_SESSION_EVENT_REJECTED_MSG_ERROR 会话事件时,将引发 OpenMAMA 发布者传输主题事件。检查最后错误子代码,并映射到 OpenMAMA 传输主题事件,如下表所示。

SOLCLIENT 子代码OpenMAMA 传输主题事件
SOLCLIENT_SUBCODE_PUBLISH_ACL_DENIEDMAMA_TRANSPORT_TOPIC_PUBLISH_ERROR_NOT_ENTITLED
SOLCLIENT_SUBCODE_TOPIC_MISSINGMAMA_TRANSPORT_TOPIC_PUBLISH_ERROR_BAD_SYMBOL
SOLCLIENT_SUBCODE_TOPIC_TOO_LARGEMAMA_TRANSPORT_TOPIC_PUBLISH_ERROR_BAD_SYMBOL
SOLCLIENT_SUBCODE_INVALID_TOPIC_SYNTAXMAMA_TRANSPORT_TOPIC_PUBLISH_ERROR_BAD_SYMBOL
SOLCLIENT_SUBCODE_TIMEOUTMAMA_TRANSPORT_TOPIC_PUBLISH_ERROR
所有其他子代码MAMA_TRANSPORT_TOPIC_PUBLISH_ERROR

将 SOLCLIENT 子代码映射到 OpenMAMA 传输主题事件

日志记录

下表显示了生成的 OpenMAMA 日志如何映射到 C API 日志。

OpenMAMA 生成的日志级别对应于 C API 日志级别...
MAMA_LOG_LEVEL_SEVERESOLCLIENT_LOG_EMERGENCY; SOLCLIENT_LOG_CRITICAL
MAMA_LOG_LEVEL_ERRORSOLCLIENT_LOG_ERROR
MAMA_LOG_LEVEL_WARNSOLCLIENT_LOG_WARNING; SOLCLIENT_LOG_NOTICE
MAMA_LOG_LEVEL_NORMALSOLCLIENT_LOG_NOTICE
MAMA_LOG_LEVEL_FINESOLCLIENT_LOG_INFO
MAMA_LOG_LEVEL_FINERSOLCLIENT_LOG_INFO
MAMA_LOG_LEVEL_FINESTSOLCLIENT_LOG_DEBUG
MAMA_LOG_LEVEL_OFFSOLCLIENT_LOG_EMERGENCY; 作为最严格的日志级别,此 C API 日志级别是最匹配的,因为几乎不生成任何日志。

将 OpenMAMA 日志级别映射到 C API 日志级别

下表显示了生成的 C API 日志如何映射到 OpenMAMA 日志。

C API 生成的日志级别对应于 Mama 日志级别...
SOLCLIENT_LOG_EMERGENCYMAMA_LOG_LEVEL_SEVERE
SOLCLIENT_LOG_CRITICALMAMA_LOG_LEVEL_SEVERE
SOLCLIENT_LOG_ERRORMAMA_LOG_LEVEL_ERROR
SOLCLIENT_LOG_WARNINGMAMA_LOG_LEVEL_WARN
SOLCLIENT_LOG_NOTICEMAMA_LOG_LEVEL_WARN
SOLCLIENT_LOG_INFOMAMA_LOG_LEVEL_FINE
SOLCLIENT_LOG_DEBUGMAMA_LOG_LEVEL_FINEST

将 C API 日志级别映射到 OpenMAMA 日志级别

当使用最后值缓存时,每个 SolOpenMAMA 插件的日志级别(通过它们的 mama.properties 文件设置)必须与其 PubSub+ 缓存实例的日志级别(通过 PubSub+ 缓存实例配置文件设置)匹配。默认情况下,提供的 SolOpenMAMA 插件设置的日志级别与样本 PubSub+ 缓存实例配置文件设置的日志级别匹配。然而,如果您想要更改用于最后值缓存的日志级别,您必须手动更改 mama.properties 文件的 OpenMAMA 日志级别,并更改 PubSub+ 缓存实例配置文件中的日志级别为等效的 C API 日志级别。

日期时间

SolOpenMAMA 返回的日期时间字符串的格式取决于平台和日期范围。

Win32、Win64 和 Linux_x86_64 平台

对于 1601 年 1 月 1 日之前的日期,SolOpenMAMA 返回的日期时间字符串的值以秒为单位。

对于 1601 年 1 月 1 日之后的日期,SolOpenMAMA 返回的日期时间字符串的值以标准 OpenMAMA 日期时间字符串格式表示。

Linux_i386 平台

对于 1901 年 12 月 13 日至 2038 年 1 月 18 日之间的日期,SolOpenMAMA 返回的日期时间字符串的值以标准 OpenMAMA 日期时间字符串格式表示。

对于 1901 年 12 月 13 日之前的日期和 2038 年 1 月 18 日之后的日期,SolOpenMAMA 返回的日期时间字符串的值以秒为单位。