跳到主要内容

PubSub+事件代理交互

以下各节详细介绍了 Solace REST 消息功能与 SolacePubSub+ 事件代理的交互方式。

PubSub+事件代理消息VPN选择

每个消息 VPN 都配置了自己的 TCP 端口集,以支持 REST 客户端。因此,通过连接到事件代理上配置的正确 TCP 端口来选择消息 VPN。

下表总结了 REST 客户端如何选择消息 VPN 并进行认证。

通过 REST 协议选择消息 VPN

协议传输认证方案消息 VPN用户名
RESTHTTP & HTTPS基本认证TCP 端口(明文端口或 SSL 端口)HTTP 标头:授权
TCP 端口(明文端口或 SSL 端口)未提供。
OAuthTCP 端口(明文端口或 SSL 端口)从提供给事件代理的令牌中提取。有关详细信息,请参阅 OAuth 认证。
HTTPS客户端证书TCP 端口(SSL 端口)通用名称;频率:连接时一次;客户端证书主题字段中的通用名称包含用户名。

客户端认证

REST 协议支持基本认证、SSL 和 OAuth 客户端认证。

基本客户端认证

对于 HTTP 基本认证,HTTP 客户端提供一个“授权”HTTP 标头,其值是一个“用户名:密码”对,该对被编码成一个 base64 字符串,跨越“:”。如果不需要密码,则将“用户名”编码成一个不带“:”的 base64 字符串。

使用相同的持久 HTTP/1.1 连接向事件代理发送的连续 HTTP POST 请求可以各自提供自己的“授权”标头。如果后续的 HTTP POST 请求没有“授权”标头,或者“授权”标头值与前面的“授权”标头值匹配,则事件代理不会重新认证 REST 生产者客户端。

如果 HTTP POST 请求的“授权”标头值与前面的“授权”标头值不同,则根据新的“授权”标头重新认证 HTTP 连接。这可能导致 HTTP 连接被归属于不同的事件代理客户端会话。(如果 HTTP 连接通过 HTTP 代理或交换机,该代理或交换机从实际 HTTP 客户端的一些连接中多路复用到事件代理的较少数 HTTP 连接,则可能需要事件代理重新认证客户端连接。)有关详细信息,请参阅 PubSub+ 事件代理消息 VPN 选择。

如果新连接的第一个 HTTP POST 请求中没有包含“授权”标头,则事件代理将使用名为 default 的客户端用户名进行认证。

用户名最多可以包含 189 个字母数字字符(不区分大小写)。还允许使用“_”和“-”字符,但不允许使用?和 * 字符。密码的最大长度为 128 字节;REST 消息传递对密码没有字符限制。

SSL—客户端证书

建立 HTTPS 连接后,基于 TCP 端口确定连接的 Solace 消息 VPN。

当使用 SSL 传输的客户端证书认证方案时,默认情况下,用户名取自证书的通用名称。或者,您可以配置消息 VPN 使用不同的源作为客户端用户名(参阅配置客户端用户名来源)。在这两种情况下,都不应提供 HTTP 授权标头,因为只能使用一种认证方案。如果提供了 HTTP 授权标头,则会被忽略。

OAuth 认证

有关详细信息,请参阅 OAuth 认证。

Solace 客户端名称

HTTP 客户端可以在每个 HTTP POST 请求中提供一个“Solace-客户端名称”HTTP 标头,以指定客户端名称。此名称唯一标识一个 Solace 客户端会话;如果相同的 Solace 客户端名称已在现有的 Solace 客户端会话中使用,则事件代理将注销争夺该名称的客户端会话之一。在相同的持久 HTTP/1.1 连接上后续的 HTTP POST 请求中,如果 HTTP 客户端不支持“Solace-客户端名称”,事件代理将认为客户端名称保持不变。

HTTP 客户端可以在后续的 HTTP POST 请求中提供不同的“Solace-客户端名称”。这将更改事件代理的客户端会话的客户端名称,而无需重新认证客户端。然而,Solace 客户端名称必须唯一的约定在客户端名称更改时仍然有效:如果 HTTP 客户端将“Solace-客户端名称”更改为已经使用的客户端名称,则事件代理将注销争夺该名称的客户端会话之一。

如果 HTTP 客户端在 HTTP 连接的第一个 HTTP POST 请求中没有提供“Solace-客户端名称”HTTP 标头,则事件代理将在认证期间为该 HTTP 连接生成一个唯一的客户端名称。

在所有 HTTP 响应中,事件代理将发送包含与客户端会话相关联的客户端名称的“Solace-客户端名称”HTTP 标头。

PubSub+ 事件代理客户端会话

事件代理认为在相同的持久 HTTP/1.1 连接上收到的连续 HTTP POST 请求,具有相同的(隐式或显式)认证和客户端名称参数,属于同一个客户端会话,用于客户端统计和事件记录的目的。

HTTP 客户端可以在任何 HTTP POST 请求上提供“授权”和“Solace-客户端名称”HTTP 标头。

与PubSub+消息传递API的交互

PubSub+消息传递API—访问HTTP内容类型和内容编码

如 HTTP 内容实体标头和消息负载类型中所述,HTTP 内容类型内容编码 标头保留在结果 Solace 消息中。这些字段也可以通过 PubSub+ 消息传递 API 访问。这意味着以下 API 可以从 Solace 消息中设置和检索这些字段。

  • PubSub+ 消息传递 API for JMS
  • PubSub+ 消息传递 API for JCSMP
  • PubSub+ 消息传递 API for Java RTO
  • PubSub+ 消息传递 API for C
  • PubSub+ 消息传递 API for .NET

PubSub+ 消息传递 API for JMS 是一个标准化的 API,因此它有一种独特的方式来访问这些 Solace 消息字段。这在它自己的部分中显示如下。其他 PubSub+ 消息传递 API 有一种共同的方式来访问这些字段,因此以 PubSub+ 消息传递 API for JCSMP 为例,但这同样适用于其他 API。

使用JMS访问HTTP内容类型和内容编码

在 PubSub+ 消息传递 API for JMS 中,HTTP 标头内容类型和内容编码的访问方式如下:

MessageConsumer consumer = session.createConsumer(queue);
Message msg = consumer.receive();
String httpContentType = msg.getStringProperty(
           SupportedProperty.SOLACE_JMS_PROP_HTTP_CONTENT_TYPE);
String httpContentEncoding = msg.getStringProperty(
SupportedProperty.SOLACE_JMS_PROP_HTTP_CONTENT_ENCODING);

在发送消息时设置属性的模式与上述类似,如下所示:

Message msg = session. createTextMessage();
msg.setStringProperty(
           SupportedProperty.SOLACE_JMS_PROP_HTTP_CONTENT_TYPE,
“application/json”);
msg.setStringProperty(
SupportedProperty.SOLACE_JMS_PROP_HTTP_CONTENT_ENCODING,
“gzip”);

使用其他 Solace API 访问 HTTP 内容类型和内容编码

本节适用于以下 Solace API:

  • PubSub+ 消息传递 API for JCSMP
  • PubSub+ 消息传递 API for Java RTO
  • PubSub+ 消息传递 API for C
  • PubSub+ 消息传递 API for .NET

在这些 API 中,HTTP 标头内容类型和内容编码作为常规消息属性访问,就像其他消息属性(如传递模式)一样。以下示例使用 PubSub+ .NET API 进行说明:

public static void HandleMessageEvent(Object source,
MessageEventArgs args)
{
    IMessage message = args.Message;

    // 处理消息
    Console.WriteLine(“HTTP 内容类型”);
    Console.WriteLine(message.HTTPContentType);
    Console.WriteLine(“HTTP 内容编码”);
    Console.WriteLine(message.HTTPContentEncoding);

    message.Dispose();
}

在发送消息时设置属性的模式与上述类似,如下所示:

IMessage message = ContextFactory.Instance.CreateMessage();
message.HTTPContentType = “application/json”;
message.HTTPContentEncoding = “gzip”;

JMS 交互 — 文本消息

PubSub+ 消息传递 API for JMS 的实现是灵活的,并允许对文本消息进行多种编码格式。具体来说,JMS 消息属性“文本消息是 XML”控制发布的文本消息是否可以具有 XML 负载。默认情况下,此字段设置为 false,即禁用。建议为 JMS 客户端禁用此字段,以便与 REST 客户端互操作。因此,您应该在 Solace JNDI 配置中禁用此属性。有关如何设置此属性的信息,请参阅 XML 负载。