替换表达式概述
替换表达式是 Solace 特定的表达式语言,用于将特定的文本属性(请求目标、请求头等)替换为系统生成的输出。
例如,假设您的部署需要使用REST交付点(RDP)将消息发送到存储服务,如Azure Storage、Amazon S3或Google Cloud Storage。这要求将每个消息发送到一个唯一的目标,最好是从消息主题、元数据或当前时间获取该唯一性。为了实现这一点,您可以在请求目标中嵌入一个替换表达式,配置系统根据每个传入消息的数据(主题、当前时间等)修改目标。
替换表达式由字面值或函数调用来组成。函数调用参数可以是任何适当类型的替换表达式。
当嵌入到文本属性中时,替换表达式由${
和}
分隔。只有在字符串文字之外的闭合大括号才能结束替换表达式;在替换表达式内部不需要特别转义大括号。要在文本中包含${
,可以使用替换表达式。例如,${
可以编码为${"$"}{
}。
任何无效的替换表达式都会在配置时导致错误。您可以通过所有可用的监控接口(Broker Manager、CLI、SEMPv1和SEMPv2)查看错误消息的详细信息。
替换表达式函数锚
替换表达式函数返回一个值,并且可能需要参数。以下是当前可用的函数以及它们是否适用于RDP、Kafka发送方或Kafka接收方对象的列表。
函数参数和返回值有指定的类型。字符串可以在任何接受字节的地方传递;没有其他自动转换。可用的类型包括:
-
integer:一个64位整数值(范围:-9223372036854775808到9223372036854775807)。
-
string:一个UTF-8编码的字符串。
-
bytes:一个0个或多个字节的序列。
所有传递给时间函数的时间戳参数(utcYear、utcDate等)必须以毫秒为单位。
函数名称 | 使用 | 参数类型 | 返回类型 | 上下文 | 描述 |
---|---|---|---|---|---|
... | ... | ... | ... | ... | ... |
1—这些值对应于非SMF API中的特定字段。有关这些替换表达式从SMF到非SMF协议的值映射信息,请参阅我们协议元数据和负载编码交互页面上的以下部分:
- SMF到AMQP转换
- SMF到MQTT 5.0转换
- SMF到MQTT 3.1转换
- SMF到JMS转换
- SMF到HTTP转换
- SMF到HTTP请求转换
- SMF到Kafka转换
替换表达式处理示例
下表列出了几个示例,说明了PubSub+事件代理如何处理替换表达式。示例假设一条消息在2006年1月2日15:04:05.123到达,具有以下数据:
-
主题 = t/v1/DE/sk/escalator/1,2/sk_1.x/DE12345/raw
-
发送者时间戳 = 2006年1月2日15:04:04.987
-
"author"用户属性 = Jane "The Bear" Doe
-
在启用替换表达式的特定上下文中,替换表达式评估后可能会发生进一步处理。例如,替换处理后,请求目标将有空格和非ASCII字符进行百分比编码,以确保目标有效。
-
下面的示例中的换行符和缩进仅为了可读性。
输入 | 输出 |
---|---|
${topic()} | t/v1/DE/sk/escalator/1,2/sk_1.x/DE12345/raw |
${urlEncode(topic(),<br>"/")} | t/v1/DE/sk/escalator/1%2C2/sk_1.x/DE12345/raw |
${urlEncode(topic())} | t%2Fv1%2FDE%2Fsk%2Fescalator%2F1%2C2%2Fsk_1.x%2FDE12345%2Fraw |
global/landing/solace/${topic(5)}/${topic(7)}/${topic(8)}/${ts()} | global/landing/solace/escalator/sk_1.x/DE12345/1136189044987 |
${utcDate()}/${utcTime()}/${base32(randomBytes(15))} | 2006-01-02/15:04:04/4fdm3hlyafhh77ntxqcwbt7b |
${utcDate("/")}/${utcTime("/")}/${BASE32(randomBytes(15))} | 2006/01/02/15/04/04/4FDM3HLYAFHH77NTXQCWBT7B |
${userPropertyAsString("author")} | Jane "The Bear" Doe |
${"${"}text in the<br>delimiters} | ${text in the delimiters} |
A number: ${5} | A number: 5 |
${"${This is a valid<br>substitution expression.}"} | ${This is a valid substitution<br>expression.} |
${"This is also a valid<br>substitution expression! :-}"} | This is also a valid<br>substitution expression! :-} |
This is a valid attribute value<br>with no substitution expression. :-} | This is a valid attribute value<br>with no substitution expression. :-} |
${base64("Strings can be<br>used where bytes are specified.")} | U3RyaW5ncyBjYW4gYmUgdXNlZCB3aGVyZSBieXRlcyBhcmUgc3BlY2lmaWVkLg== |
可以包含替换表达式的文本属性
以下文本属性可以包含替换表达式:
-
如果配置了替换表达式评估,则RDP POST请求目标。更多信息,请参见管理REST交付点。
-
RDP请求头。更多信息,请参见管理REST交付点。
-
Kafka接收方主题绑定(SMF主题生成)。更多信息,请参见配置SMF主题生成。
-
Kafka接收方主题绑定(分区队列密钥生成)。更多信息,请参见配置分区密钥生成。
-
Kafka发送方队列绑定(Kafka分区密钥生成)。更多信息,请参见配置Kafka分区密钥生成。