跳到主要内容

在PubSub+ JCSMP API中从重放日志重放

本节描述了使用 PubSub+ JCSMP API 的客户端应用程序应如何处理由事件代理发起的消息重放,以及客户端应用程序如何完全代表自身发起消息重放。

如果您对消息重放不太熟悉,请查看消息重放以获取高级介绍,有关如何在事件代理上配置和使用该功能的详细信息,请查看消息重放配置。

还有一个 Solace JCSMP 教程,展示了客户端如何发起和处理重放。

事件代理发起的重放

客户端发起的重放

客户端出于各种原因可以发起消息重放,包括它可以检测到需要从重放日志重放消息,或者客户端中可能存在需要从特定时间点重放消息的启动条件。

客户端在绑定到队列或主题端点时可以发起消息重放。您可能需要查阅 PubSub+ JCSMP 消息传递 API 参考,了解有关如何绑定到队列或主题端点的具体细节。在创建保证消息接收器时,无论是流还是消费者,应用程序都可以指定重放起始位置,以指示消息重放的起始点。

支持的不同类型的重放起始点包括:

  • 从重放日志的开头开始重放。

  • 从指定时间戳开始重放所有消息。

  • 在指定复制组消息 ID 之后重放所有消息。

要设置流的重放起始位置,请使用 ConsumerFlowProperties.setReplayStartLocation(...) 方法。以下代码片段显示了一个简单的示例:

if (dateStr != null) {
Date date = simpleDateFormat.parse(dateStr);
loc = JCSMPFactory.onlyInstance().createReplayStartLocationDate(date);
} else {
loc = JCSMPFactory.onlyInstance().createReplayStartLocationBeginning();
}

consumerProps.setReplayStartLocation(loc);

有关如何指定这些不同的重放起始点的详细信息,请参阅 PubSub+ JCSMP 消息传递 API 参考。

您应该记住,从重放日志创建时间之前的任何时间戳开始的重放尝试都将失败。当流成功绑定时,它将从指定的重放起始位置开始接收重放日志中的所有消息。

客户端发起重放的限制

  • 不支持非独占端点。
  • 无法从非活动流发起。
  • 无法在浏览器流上发起。
  • 无法使用 JMS API 完成。

如果您的应用程序希望将特定主题的消息重放到队列

当连接到主题端点时,要从重放日志重放的主题在创建流时设置在流属性中。如果连接到队列,则会重放发布到队列的消息,这些消息匹配在创建流之前队列上存在的订阅。如果应用程序希望将特定主题的消息重放到队列,它必须确保在连接流之前向队列添加订阅。

重放失败

如果消息重放失败,事件代理将关闭客户端的流,并通过流关闭事件通知应用程序。以下代码片段显示了 FlowEvent.FLOW_DOWN 的示例实现以及应用程序可能收到的不同子代码:

public void handleEvent(Object source, FlowEventArgs event) {
System.out.println("Flow " + flowName + " (" + source + ") received flow event: " + event);

if (event.getEvent() == FlowEvent.FLOW_DOWN) {
if (event.getException() instanceof JCSMPErrorResponseException) {
JCSMPErrorResponseException ex = (JCSMPErrorResponseException) event.getException();

switch (ex.getSubcodeEx()) {
case JCSMPErrorResponseSubcodeEx.REPLAY_STARTED:
case JCSMPErrorResponseSubcodeEx.REPLAY_FAILED:
case JCSMPErrorResponseSubcodeEx.REPLAY_CANCELLED:
case JCSMPErrorResponseSubcodeEx.REPLAY_LOG_MODIFIED:
case JCSMPErrorResponseSubcodeEx.REPLAY_START_TIME_NOT_AVAILABLE:
case JCSMPErrorResponseSubcodeEx.REPLAY_MESSAGE_UNAVAILABLE:
case JCSMPErrorResponseSubcodeEx.REPLAYED_MESSAGE_REJECTED:
case JCSMPErrorResponseSubcodeEx.REPLAY_START_MESSAGE_UNAVAILABLE:
break;
default:
break;
}
}
}
}

有关可能收到的不同子代码的详细信息,请参阅 PubSub+ JCSMP 消息传递 API 参考。