提问者:小点点

在java中从GCP pub/sub重试消息需要哪些设置


在我的 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());
    }
}

我是否需要提及其他配置以在不确认消息的情况下启用重试?


共1个答案

匿名用户

关于重试策略,文档中说,只有在确认截止日期到期或订阅者否定消息时,Pub/Sub才会尝试重新传递消息。一旦确认截止日期过去,该消息就成为要重新传递的候选消息。重新交付可能不是立即的,因为重新交付是在尽最大努力的基础上执行的。

正如注释中已经提到的,DEFAULT_MAX_ACK_EXTENSION_PERIOD在Subscriber.java中设置为60分钟,这是造成这种延迟的原因。Ack截止日期将继续延长(由客户端库作为本机功能),直到达到这个持续时间。这意味着,未被激活的消息由订阅者租用60分钟,并且没有资格在这段时间内重新交付。setMaxAckExtension周期(Duration maxAckExtension周期)用于将自定义值设置为消息的确认截止日期将延长到的最大期限。

还请注意,这些值都不能保证邮件不会在该时间段内重新传递。由于网络或服务器故障,邮件可能会在maxAckExtensionPeriod之前重新传递。