在我的 java 代码中,我创建了一个订阅者
public Subscriber createSubscriber(String subscriptionId, MessageReceiver receiver) throws MessagingException {
Subscriber subscriber = null;
ProjectSubscriptionName subscriptionName = null;
String projectId = getProjectId();
if (Objects.isNull(projectId) || Objects.isNull(subscriptionId)) {
throw new MessagingException(MessagingErrorCodes.MIX90810
+ " Project Id/Subscription Id is null for subscriptionId = " + subscriptionId + " projectId= "
+ projectId, MessagingErrorCodes.MIX90810);
}
try {
subscriptionName = ProjectSubscriptionName.of(projectId, subscriptionId);
subscriber = Subscriber.newBuilder(subscriptionName, receiver).setExecutorProvider(getExecutorProvider()).build();
} catch (Exception e) {
throw new MessagingException(MessagingErrorCodes.MAX34540
+ " Error occurred while creating the subscriber for the subscriptionId = " + subscriptionId
+ "projectId " + projectId + "subscriptionName= " + subscriptionName,
MessagingErrorCodes.MAX34540, e);
}
enter code here
return subscriber;
}
我第一次在我的接收消息(PubsubMessage消息,AckReply消费者消费者)上收到消息,但如果我不确认消息,就不会再次收到消息。但如果发送nack,它会再次发送消息。
@Service
public class MyMessageReceiver implements MessageReceiver {
@Override
public void receiveMessage(PubsubMessage message, AckReplyConsumer consumer) {
System.out.println(message.getMessageId());
}
}
我是否需要提及其他配置以在不确认消息的情况下启用重试?
关于重试策略,文档中说,只有在确认截止日期到期或订阅者否定消息时,Pub/Sub才会尝试重新传递消息。一旦确认截止日期过去,该消息就成为要重新传递的候选消息。重新交付可能不是立即的,因为重新交付是在尽最大努力的基础上执行的。
正如注释中已经提到的,DEFAULT_MAX_ACK_EXTENSION_PERIOD
在Subscriber.java中设置为60分钟,这是造成这种延迟的原因。Ack截止日期将继续延长(由客户端库作为本机功能),直到达到这个持续时间。这意味着,未被激活的消息由订阅者租用60分钟,并且没有资格在这段时间内重新交付。setMaxAckExtension周期(Duration maxAckExtension周期)
用于将自定义值设置为消息的确认截止日期将延长到的最大期限。
还请注意,这些值都不能保证邮件不会在该时间段内重新传递。由于网络或服务器故障,邮件可能会在maxAckExtensionPeriod之前重新传递。