我使用Azure服务总线,并希望向主题中的所有订阅者发送消息。客户的应用程序是用JavaFX编写的,为了处理,我使用下一个代码:
IMessageHandler messageHandler = new IMessageHandler() {
// callback invoked when the message handler loop has obtained a message
public CompletableFuture<Void> onMessageAsync(IMessage message) {
String body = new String(message.getBody());
System.out.println(body);
decorator.showToastWithTitleAndBody("", body);
return receiveClient.abandonAsync(message.getLockToken());
}
public void notifyException(Throwable throwable, ExceptionPhase exceptionPhase) {
System.out.printf(exceptionPhase + "-" + throwable.getMessage());
}
};
receiveClient.registerMessageHandler(
messageHandler,
// callback invoked when the message handler has an exception to report
// 1 concurrent call, messages are auto-completed, auto-renew duration
new MessageHandlerOptions(1, true, Duration.ofSeconds(1)));
在“ onMessageAsync”方法中,我使用abandonAsync不删除消息,下一次接收者将收到消息。但是我在每个应用程序实例中都收到了很多内容相同的消息。如果我使用completeAsync方法,消息将被删除,没有其他人将得到它。
将消息发送给主题中的所有订户而不删除并重复就真的吗?
答案 0 :(得分:1)
您的消息处理程序配置为自动完成传入的消息。但是,在回调方法中,消息被放弃了。这意味着它们将永远不会自动完成,而是按照订阅的MaxDeliveryCount
配置为重新发送多次(假设您正在从订阅中获取消息)。
不应该不要放弃处理程序代码,或者让自动完成取代它,或者禁用自动完成功能,并在处理完传入消息后立即调用.completeAsync()
。< / p>
此外,自动更新被定义为1秒。没事了该时间至少应超过LockDuration
个周期,或者完全不指定。
将消息发送给主题中的所有订户而不删除并重复就真的吗?
是的。您不需要重复数据删除,因为这不是重复发送的问题,而是重复的处理。