跳到主要内容

消息服务

Java 的 PubSub+ 消息 API 提供了 MessagingService 接口,允许您连接到事件代理。MessagingService 接口处理与 PubSub+ 事件代理交互的所有功能。要创建 MessagingService 对象,您必须首先配置一个包含连接到事件代理所需信息的 Properties 对象,包括主机详细信息和身份验证方案。

为了确保与未来版本的 API 向后兼容,创建 MessagingService 对象时必须传递一个配置文件作为参数。

创建Properties对象

PropertiesSolaceProperties 接口)对象可以具有多个属性,但至少有一个属性对象必须配置并传递给 MessagingService.builder(),以配置与事件代理的连接,包括 SolaceProperties.TransportLayerProperties.HOSTSolaceProperties.TransportLayerProperties.VPN。在 Properties 对象中可以配置以下五类属性。

  • ServiceProperties(需要用于 VPN 属性)
  • TransportLayerProperties(需要用于 HOST 属性)
  • AuthenticationProperties
  • ClientProperties
  • TransportLayerSecurityProperties

有关更多信息,请参阅 Java 的 PubSub+ 消息 API 参考。

以下是一个基本连接的 Properties 对象示例。创建 Properties 对象后,您可以使用设置方法来配置连接。在以下示例中,字段已硬编码为 string 值,以便于阅读。在您自己的代码中,根据您的事件代理更改这些值。

import com.solace.messaging.MessagingService;
import com.solace.messaging.config.SolaceConstants.AuthenticationConstants;
import com.solace.messaging.config.SolaceProperties.AuthenticationProperties;
import com.solace.messaging.config.SolaceProperties.TransportLayerProperties;
import com.solace.messaging.config.profile.ConfigurationProfile;
import java.util.Properties;
...
...
...
final Properties properties = new Properties();
properties.setProperty(TransportLayerProperties.HOST, "host");
properties.setProperty(ServiceProperties.VPN_NAME, "vpn");
properties.setProperty(AuthenticationProperties.SCHEME_BASIC_USER_NAME, "userName");
properties.setProperty(AuthenticationProperties.SCHEME_BASIC_PASSWORD, "password");
properties.setProperty(ServiceProperties.RECEIVER_DIRECT_SUBSCRIPTION_REAPPLY, "true");

如果您正在运行示例,可以通过在 main 方法中的 args[] 数组中传递命令行参数或将配置加载到属性文件中,将您要使用的配置传递给客户端应用程序。以下示例代码展示了如何创建 Properties 对象并使用文件输入流(FileInputStream)读取器加载其值。有关常量字段值的完整列表,请参阅 AuthenticationProperties

/* 创建 Properties 对象并使用 FileInputStream 文件读取器设置其值 */
try (InputStream input = new FileInputStream("path/to/properties/file")) {
Properties properties = new Properties();
properties.load(input);
} catch (IOException e) {
e.printStackTrace();
}

端到端有效负载压缩

Java 的 PubSub+ API 可执行端到端有效负载压缩,以实现:

  • 更快的消息吞吐量
  • 减少带宽使用
  • 提高应用程序性能

虽然端到端有效负载压缩为各个 PubSub+ API 增加了更多工作量,但它能够实现更快的聚合消息发布和接收速率。PubSub+ 事件代理提供了传输消息压缩功能,该功能压缩整个消息,参见流式压缩连接。但是,当您发送和接收大消息时,压缩整个消息会给事件代理带来大量工作,这可能会导致吞吐量变慢。如果您的应用程序需要发送和接收大消息,我们建议您使用端到端有效负载压缩以提高性能。

  1. 压缩消息有效负载时的注意事项
  2. 在 PubSub+ Java API 中压缩消息有效负载

压缩消息有效负载时的注意事项

以下部分解释了在使用 PubSub+ 消息 API 压缩消息有效负载时您需要注意的事项。

仅使用一种消息压缩形式

我们建议您只使用一种压缩形式,即通过事件代理的流式压缩连接或通过 API 的端到端有效负载压缩。多次压缩同一消息可能会浪费资源,通常不会产生更小的消息大小。

不要使用端到端有效负载压缩来绕过 PubSub+ 事件代理支持的最大消息大小

不要传递超过事件代理支持的最大消息大小的有效载荷。我们建议您在使用有效载荷压缩之前将有效载荷大小减小到小于最大消息大小。有关最大消息大小的更多信息,请参阅发送大于事件代理最大消息大小的消息。

不要使用端到端有效负载压缩与小消息

端到端有效负载压缩最适合几兆字节大小的消息。Solace 不建议使用消息有效负载压缩与小消息,因为端到端有效负载压缩实际上可能会增加小消息的大小。

升级您的发布者和接收者应用程序

接收者应用程序仅在 API 支持消息有效负载压缩且已更新到最低支持版本时,才会自动解压缩任何压缩的消息有效负载。如果您的接收者应用程序不支持消息有效负载压缩,这可能会导致潜在错误或异常。确保您将发布者 接收者应用程序更新到有效负载压缩的最低支持版本。有关版本支持信息,请参阅 PubSub+ 消息 API 的功能支持。

端到端有效负载压缩限制

端到端有效负载压缩目前不支持 PubSub+ 缓存。

端到端有效负载压缩与以下内容不兼容:

  • SolCache

  • 非 SMF 协议,例如 AMQP、HTTP、Kafka 和 MQTT

如果您的应用程序使用上述任何一项,我们建议您不要使用端到端有效负载压缩。

在 PubSub+ Java API 中压缩消息有效负载

您的发布者应用程序可以在发布消息之前压缩任何消息的有效载荷。要压缩消息有效载荷,您必须设置 PAYLOAD_COMPRESSION_LEVEL,这告诉 API 您希望启用端到端有效负载压缩。有效载荷压缩级别属性可以设置为 0 到 9 之间的整数:

  • 0 — 禁用有效载荷压缩。这是默认设置。
  • 1 - 9 — 启用有效载荷压缩。1 是压缩级别最低、数据吞吐量最快的设置,9 是压缩级别最高、数据吞吐量最慢的设置。

根据您的网络和性能需求调整您的有效载荷压缩级别。以下代码片段展示了如何在代理属性字典中设置 PAYLOAD_COMPRESSION_LEVEL

Properties properties = new Properties();
// 启用最大压缩的有效载荷压缩:
properties.setProperty(SolaceProperties.ServiceProperties.PAYLOAD_COMPRESSION_LEVEL, "9");

与事件代理建立连接

当设置了必要的属性并将其存储在 Properties 对象中时,您可以调用 MessagingService.build() 来创建 MessagingService 对象。MessagingService 对象允许 API 与事件代理建立连接。以下是使用 MessagingServiceClientBuilder 接口创建必要的 MessagingService 对象并连接到事件代理时常用的列表方法:

  • builder(ConfigurationProfile activeProfile)
  • withAuthenticationStrategy(AuthenticationStrategy authenticationProvider)
  • fromProperties(Properties properties)
  • build()

有关更多信息,请参阅 Java 的 PubSub+ 消息 API 参考。

创建 MessagingService 对象后,调用 connect() 方法。

以下示例代码展示了如何创建一个简单的 MessagingService 对象,该对象连接到事件代理:

final MessagingService messagingService = MessagingService.builder(ConfigurationProfile.V1)
.fromProperties(properties) // 启用基于属性的配置,需要设置主机和 VPN 属性
// 可在此处调用 withAuthenticationStrategy(),使用以下列出的策略之一
.build() // 根据提供的配置返回一个 MessagingService 对象
.connect(); // 与事件代理建立同步连接。

使用传输层安全

传输层安全(TLS)允许 PubSub+ Java API 和 PubSub+ 事件代理之间进行加密身份验证和数据传输。PubSub+ Java API 支持传输层安全版本:TLS 1.0、TLS 1.1 和 TLS 1.2。推荐使用最新版本的 TLS。也支持安全套接字层(SSL)协议,版本 3(SSLv3)。我们不建议您使用 SSL,除非需要向后兼容。

您可以使用 TransportSecurityStrategy.TLS.create() 配置 TLS 连接属性,例如要使用的 Java 密钥库(JKS),或者是否禁用证书验证。使用 TLS 时,您必须始终在设置连接的 TransportLayerProperties.HOST 属性时使用安全 TCP 协议(tcpshttps),例如:

properties.setProperty(TransportLayerProperties.HOST, "tcps://my-host-connection.messaging.solace.cloud:11111");

以下示例代码展示了使用 TLS 时客户端应用程序推荐的安全设置:

/* 使用配置文件(V1 将其设置为默认值)创建服务构建器的入口点。 */
MessagingService.builder(ConfigurationProfile.V1)
.withTransportSecurityStrategy(
TLS.create() // 创建新的传输安全层实例(必需)。可以手动配置或覆盖身份验证。
.withCertificateHostValidation() // 配置传输层安全(TLS)以根据服务器证书中的主机名验证主机。
.withCertificateValidation("changeme", false) // changeme 是默认信任库密码,ignoreExpiration 设置为 false,拒绝过期证书
.withExcludedProtocols(SecureProtocols.TLSv1_1, SecureProtocols.TLSv1, SecureProtocols.SSLv3) // 排除过时的 SSL 协议
.withAuthenticationStrategy( // 使用 AuthenticationStrategy 启用/覆盖现有的身份验证策略。
ClientCertificateAuthentication
.of(myKeystoreUrl, myKeystorePassword) // 创建用于客户端证书身份验证的实例的工厂方法。
)
.build()
.connect();

还有许多方法可以使用 TransportSecurityStrategy.TLS 配置 TLS 连接。以下是配置 TLS 连接时常用的三个方法:

  • withCipherSuites() — 可配置在协商 TLS 连接时使用的密码套件列表。您可以配置 Java API 仅使用一组更强的密码,以帮助确保客户端应用程序和事件代理之间的更安全连接。

密码套件是通过 TLS 握手加密通信的有用方法,并提供通过事件代理连接的应用程序之间的改进安全性。有关更详细的解释和支持的密码套件列表,请参阅密码套件。

以下代码示例展示了如何使用 withCipherSuites() 方法:

/* 使用配置文件(V1 将其设置为默认值)创建服务构建器的入口点。 */
MessagingService.builder(ConfigurationProfile.V1)
.withTransportSecurityStrategy(TLS.create() // 创建新的传输安全层实例(必需)。可以手动配置或覆盖身份验证。
.withCipherSuites("CipherSuite1, // 用于安全套接字层(SSL)连接的密码套件列表,按优先顺序用逗号分隔。
CipherSuite2") // 可以使用它们的 JSSE 名称或 openSSL 名称指定密码套件。
)
.withAuthenticationStrategy( // 使用 AuthenticationStrategy 启用/覆盖现有的身份验证策略。
ClientCertificateAuthentication
.of(myKeystoreUrl, myKeystorePassword) // 创建用于客户端证书身份验证的实例的工厂方法。
)
.build() // 根据提供的配置和身份验证参数的数量返回一个 PubSub+ MessagingService 对象。
.connect(); // 与 PubSub+ 事件代理建立同步连接。
  • withExcludedProtocols() — 您可能不希望使用特定协议与微服务连接。例如,您可能不想使用遗留协议。使用此方法指定不使用的安全套接字层(SSL)和传输层安全(TLS)协议。以下示例代码展示了如何排除特定协议:
/* 使用配置文件(V1 将其设置为默认值)创建服务构建器的入口点。 */
MessagingService.builder(ConfigurationProfile.V1)
.withTransportSecurityStrategy(
TLS.create() // 创建传输安全层实例。可以手动配置或覆盖身份验证。
.withExcludedProtocols(TransportSecurityStrategy.TLS.SecureProtocols.TLS1.1) // 排除对微服务的 TLS1.1 访问。
)
.withAuthenticationStrategy( // 使用 AuthenticationStrategy 启用或覆盖现有的身份验证策略。
ClientCertificateAuthentication
.of(myKeystoreUrl, myKeystorePassword) // 创建用于客户端证书身份验证的新实例的工厂方法。
)
.build() // 根据提供的配置和身份验证参数的数量返回一个 MessagingService 对象。
.connect(); // 与事件代理建立同步连接。
  • withoutCertificateValidation() — 此方法配置您的 TLS 连接不验证服务器证书。

仅在开发环境中使用此方法。我们建议您永远不要在生产环境中使用此方法,因为它会创建安全漏洞。

以下示例代码展示了如何使用 withoutCertificateValidation() 方法:

/* 使用配置文件(V1 将其设置为默认值)创建服务构建器的入口点。 */
MessagingService.builder(ConfigurationProfile.V1)
.withTransportSecurityStrategy(
TLS.create() // 创建传输安全层实例。可以手动配置或覆盖身份验证。
.withoutCertificateValidation() // 配置传输层安全(TLS)不验证服务器证书。
)
.withAuthenticationStrategy( // 使用 AuthenticationStrategy 启用/覆盖现有的身份验证策略。
ClientCertificateAuthentication // 配置传输层安全(TLS)不验证服务器证书。
.of(myKeystoreUrl, myKeystorePassword) // 创建用于客户端证书身份验证的实例的工厂方法。
)
.build() // 根据提供的配置和身份验证参数的数量返回一个 MessagingService 对象。
.connect(); // 与事件代理建立同步连接。

您还可以使用 TransportLayerSecurityPropertiesProperties 对象配置 TLS 连接的各个方面。可以使用 SolaceProperties.TransportLayerSecurityProperties 中的各种字段配置 TLS 连接。我们建议您使用默认设置(设置为 true 并启用),以确保以下属性的安全连接:

  • CERT_REJECT_EXPIRED
  • CERT_VALIDATE_USERNAME
  • CERT_VALIDATED

有关对象、方法和属性的更多信息,请参阅 Java 的 PubSub+ 消息 API 参考。

有关创建 Properties 对象和通过 MessagingService 对象建立与代理的连接的详细信息,请参阅创建 Properties 对象。

使用Websockets

Java 的 PubSub+ API 支持使用 WebSockets,允许数据传输能够绕过典型的防火墙和代理障碍。WebSockets 允许您的应用程序通过端口 80(HTTP)和 443(HTTPS)连接。由于这些端口在大多数防火墙配置中通常处于打开状态,因此 WebSockets 可以在不需要额外端口打开或配置的情况下建立连接。要使用 Websockets,请在您的 HOST URL 属性中使用以下前缀之一:

  • ws:ws:// — 使用 WebSockets 进行应用程序和事件代理之间的不安全通信。

  • wss:wss:// — 在 WebSockets 上使用 TLS/SSL 通道进行应用程序和事件代理之间的安全通信。

以下示例代码展示了如何设置示例 WebSocket HOST 属性:

final Properties properties = new Properties();
properties.setProperty(TransportLayerProperties.HOST, "wss://my-websocket.example:443");

身份验证

Java 的 PubSub+ API 支持多种身份验证方案(或策略),您可以从中选择。您选择的方案可能取决于连接客户端需要提供的凭据。您可以使用以下身份验证方案之一:

  • 基本身份验证
  • Kerberos 身份验证
  • 客户端证书身份验证
  • OAuth 2.0 身份验证

基本身份验证

基本身份验证是默认的客户端身份验证方案,允许客户端使用客户端用户名和密码对事件代理进行身份验证。要指定基本身份验证,请创建一个 MessagingService 对象的实例,并将以下内容作为 withAuthenticationStrategy() 方法的参数:

  • BasicUserNamePassword
    • of(String userName, String password)

有关对象和方法的详细信息,请参阅 Java 的 PubSub+ 消息 API 参考。

以下示例代码展示了如何使用基本身份验证:

final String username = "solace01";
final String password = "12345678";

/* 使用 ConfigurationProfile(参阅下面的 ConfigurationProfile 部分)创建服务构建器的入口点。 */
final MessagingService messagingService = MessagingService.builder(ConfigurationProfile.V1)
.withAuthenticationStrategy(BasicUserNamePassword // 使用传递给参数的策略覆盖/启用现有的身份验证策略。
.of(username,password)) // 创建 BasicUserNamePassword 的实例。
.build()
.connect();

有关创建 Properties 对象和通过 MessagingService 对象建立与代理的连接的详细信息,请参阅创建 Properties 对象。

Kerberos 身份验证

Java 的 PubSub+ API 提供了对 Kerberos 身份验证的支持。使用此方法进行连接需要一个有效的 jaas 登录配置文件以及一个有效的 Kerboros 配置文件。调用 withAuthenticationStrategy() 方法,并将以下对象和方法作为参数传递:

  • Kerboros
    • of(String jaasLoginContextName, String kerberosPrincipalInstanceName)
    • withUserName(String userName)
    • withMutualAuthentication()
    • withReloadableJaasConfiguration()

有关对象和方法的详细信息,请参阅 Java 的 PubSub+ 消息 API 参考。

以下示例代码展示了如何使用 Kerboros 进行身份验证,并需要您按照 Solace 开发者中心中的示例创建这些文件:

  • jaas.conf 用于登录配置文件
  • krb5.conf 用于 Kerberos 配置文件
final String kerberosPrincipalInstanceName = "solace01";
final String jaasLoginContextName = "SolaceGSS"; // jaasLoginContextName 与 resources/jaas.conf 文件中的条目相对应。
final String myUserNameOnBroker = "myUserNameOnBroker"; // myUserNameOnBroker 应在代理上设置,启用相互身份验证和 JAAS 配置文件重新加载。

// 使用配置文件(V1 将其设置为默认值)创建服务构建器的入口点
MessagingService.builder(ConfigurationProfile.V1)
.fromProperties(serviceConfiguration) // 使用通过命令行传递或硬编码到程序中的身份验证属性。
.withAuthenticationStrategy( // 使用 AuthenticationStrategy 启用或覆盖现有的身份验证策略。
Kerberos
.of(kerberosPrincipalInstanceName, jaasLoginContextName) // 创建 Kerboros 的实例。
.withUserName(myUserNameOnBroker) // 配置使用 Kerberos 时的非默认用户名的工厂方法。
.withMutualAuthentication() // 配置使用 Kerberos 时的相互身份验证的工厂方法。
.withReloadableJaasConfiguration()) // 配置 (jaas.conf) 文件重新加载行为的工厂方法。
.build()
.connect();

有关创建 Properties 对象和通过 MessagingService 对象建立与代理的连接的详细信息,请参阅创建 Properties 对象。

客户端证书身份验证

要使用客户端证书身份验证方案,需要执行以下步骤:

  1. 您必须配置主机事件代理以使用 TLS 连接(参阅使用传输层安全)。

  2. 您的应用程序必须使用 TLS 连接到代理。

  3. 您必须在应用程序使用的 Message VPN 上启用客户端证书验证。

  4. 在客户端应用程序中,客户端证书必须存在于密钥库文件中,并且您使用 ClientCertificateAuthentication.of(String keystoreURL, String keystorePassword) 方法配置证书。

有关对象和方法的详细信息,请参阅 Java 的 PubSub+ 消息 API 参考。

以下示例代码展示了如何配置客户端证书身份验证:

MessagingService.builder(ConfigurationProfile.V1)
.withTransportSecurityStrategy(TLS.create()) // 创建新的传输安全层实例(必需)。可以手动配置或覆盖身份验证。
.withAuthenticationStrategy( // 使用 AuthenticationStrategy 启用/覆盖现有的身份验证策略。
ClientCertificateAuthentication
.of(myKeystoreUrl, myKeystorePassword) // 创建用于客户端证书身份验证的实例的工厂方法。
)
.build()
.connect();

有关创建 Properties 对象和通过 MessagingService 对象建立与代理的连接的详细信息,请参阅创建 Properties 对象。

OAuth 2.0 身份验证

OAuth 身份验证方案允许客户端应用程序使用 OAuth 机制对与事件代理的连接进行身份验证。要使用 OAuth 2.0 身份验证,请配置主机事件代理以使用 TLS 连接(参阅使用传输层安全),并确保您的应用程序使用 TLS 连接到事件代理。有关更多信息,请参阅 OAuth 身份验证。

PubSub+ 事件代理支持以下 OAuth 身份验证机制:

  • OAuth 2.0
  • OpenID Connect

Java 的 PubSub+ API 支持可以发送到事件代理的不同字段:

  • accessToken — 一个 String,用于应用程序请求数据访问

和/或

idToken — 一个 String,用于 Open ID Connect(OIDC)连接

  • issuerIdentifier — (可选)一个 String,用于标识适当的 OAuth 配置文件

OAuth 身份验证需要使用 accessTokenidToken 或两者启用这些方法中的 AuthenticationStrategy.OAuth2

  • of(String token)
    • 可以使用 idTokenaccessToken 作为此方法的参数
  • of(String accessToken, String idToken)
    • 如果您使用两个令牌,accessToken 必须是第一个参数
  • withIssuerIdentifier(String issuerIdentifier)
    • 可选的授权服务器发行者标识符

有关对象和方法的详细信息,请参阅 Java 的 PubSub+ 消息 API 参考。

OAuth 2.0

OAuth2.0 是一个开放标准,用于访问委托和授权。它通常用作一种机制,允许网站或应用程序访问用户在其他网站上的信息,而无需提供敏感凭据。OAuth 身份验证方案允许通过授权服务器向第三方客户端颁发的令牌来访问用户资源。有关更多信息,请参阅 OAuth 身份验证。

  • (必须)OAuth 中定义的访问令牌。授权服务器在成功验证用户并获得其同意后颁发访问令牌。访问令牌是允许 OAuth 客户端应用程序访问用户资源的工具。如果令牌中存在 issuerIdentifier 声明,则用于标识事件代理将用于令牌验证的 OAuth 配置文件。如果没有找到匹配的发行者配置文件,则使用默认配置文件。

  • (可选)授权服务器发行者标识符(issuerIdentifier)。如果提供,此参数必须与事件代理上的 OAuth 配置文件的发行者匹配。该配置文件将用于令牌验证,而不是令牌的 iss 声明中提供的发行者,如果有的话,或者事件代理上配置的默认配置文件。

以下示例代码展示了如何使用带有发行者的 OAuth2 身份验证:

/* 配置服务访问以使用带有访问令牌和可选发行者标识符的 OAuth 2 身份验证。 */
MessagingService.builder(ConfigurationProfile.V1)
// 使用 accessToken 和 issuerIdentifier 配置服务:
.withAuthenticationStrategy(OAuth2.of(accessToken).withIssuerIdentifier(issuerIdentifier))
.build()
.connect();

OpenID Connect

如果事件代理配置为使用 OpenID Connect 身份验证(oauth-role 设置为 client),您必须提供以下属性,以便事件代理对客户端应用程序进行身份验证:

  • Open ID Connect 令牌:(必须)由 OpenID Connect(OIDC)定义,OIDC 令牌是 OAuth2.0 的扩展。ID 令牌由授权服务器颁发,包含携带有关用户信息的声明。ID 令牌是证明用户已通过身份验证的工具。如果令牌中存在 issuerIdentifier 声明,则用于标识事件代理将用于令牌验证的 OAuth 配置文件。如果没有找到匹配的发行者配置文件,则使用默认配置文件。

  • 访问令牌:(可选)此访问令牌是您的组织可能需要的可选访问令牌,事件代理使用它来确定经过身份验证的客户端应用程序的授权。

/* 配置服务访问以使用带有 ID 令牌和可选访问令牌的 OpenID Connect 身份验证。 */
MessagingService.builder(ConfigurationProfile.V1)
.withAuthenticationStrategy(OAuth2.of(accessToken,idToken)) // 使用 accessToken 和 idToken 配置服务。
.build()
.connect();

必要的事件代理配置

要使客户端应用程序使用 OAuth 身份验证方案,必须为宿主事件代理配置消息 VPN OAuth 配置文件,并为客户端连接的任何消息 VPN 配置并启用 OAuth 身份验证。有关更多信息,请参阅 OAuth 身份验证。

刷新过期的 OAuth 令牌

默认情况下,事件代理会在令牌过期时断开客户端连接(参阅令牌过期时断开连接)。当客户端会话断开连接时,客户端应用程序会根据 RECONNECTION_ATTEMPTS 属性使用相同的 OAuth 令牌尝试重新连接多次。如果由于令牌过期无法重新建立连接,则客户端应用程序必须重新创建带有所有订阅的会话。

要更新 OAuth 令牌,请使用 updateProperty(String, Object) 方法,该方法允许您在创建 MessagingService 对象后设置可修改的服务属性。第一个参数是以下字符串之一,第二个参数是令牌:

  • SolaceProperties.AuthenticationProperties.SCHEME_OAUTH2_ACCESS_TOKEN 用于更新过期的访问令牌
  • SolaceProperties.AuthenticationProperties.SCHEME_OAUTH2_OIDC_ID_TOKEN 用于更新过期的 ID 令牌

可修改的服务属性可能不会立即更新,可能需要下次重新连接尝试才能进行更新。

刷新过期的令牌可以在以下情况下发生:

  • 客户端应用程序已连接。在这种情况下,客户端联系授权服务器刷新令牌,并修改会话以在下次 API 连接到事件代理时使用更新后的令牌。

  • 客户端应用程序正在重新连接。重新连接事件包括一个诊断子代码。如果此子代码为 Login Failure,则可能表明您的令牌已过期。在这种情况下,API 尝试使用过期的令牌重新连接。然后,客户端联系授权服务器刷新令牌,并修改会话以在下次 API 尝试重新连接到事件代理时使用更新后的令牌。

一般来说,如果客户端应用程序能够意识到潜在的令牌过期,并在令牌过期之前刷新令牌,这是更好的选择。

当客户端应用程序的会话重新连接时,Java API 会重新应用客户端应用程序的直接订阅。如果由于刷新的令牌导致 ACL 发生变化,事件代理可能会拒绝这些订阅。

配置文件

为了确保您的应用程序与未来版本的 API 保持兼容,您必须将预定义的配置文件枚举(作为 ConfigurationProfile.V1)传递给 MessagingService.builder() 方法。V1(版本 1)指的是当前可用的配置文件。

以下示例代码展示了如何使用配置文件配置应用程序以实现向后兼容:

final MessagingService messagingService = MessagingService.builder(ConfigurationProfile.V1)
.fromProperties(properties) // 使用通过命令行传递或硬编码到程序中的身份验证属性。
.build()
.connect();