0

我是 GCP 发布/订阅的新手,并试图重新发送未确认的消息 (ack/nack)。在 GCP 控制台仪表板的订阅中,我提到过: 在此处输入图像描述

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

我第一次在我的 receiveMessage(PubsubMessage message, AckReplyConsumer consumer) 上收到消息,但如果我不确认该消息,则不会再次收到消息。但是如果发送 nack 它会再次发送消息。

@Service
public class MyMessageReceiver implements MessageReceiver {

    @Override
    public void receiveMessage(PubsubMessage message, AckReplyConsumer consumer) {
        System.out.println(message.getMessageId());
    }
}

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

4

1 回答 1

0

关于重试策略,文档说 Pub/Sub 尝试重新传递消息,只有在确认截止日期到期或订阅者不接受消息的情况下。一旦确认截止日期过去,该消息将成为重新传递的候选者。重新交付可能不会立即进行,因为重新交付是在尽力而为的基础上执行的。

正如评论中已经提到的,在Subscriber.javaDEFAULT_MAX_ACK_EXTENSION_PERIOD中设置为 60 分钟,这是导致此延迟的原因。Ack 截止日期将继续延长(由客户端库作为本机功能),直到达到此持续时间。意思是,未确认的消息被订阅者租用了 60 分钟,并且在此期间没有资格重新传递。用于将自定义值设置为消息的确认截止日期将延长到的最大期限。setMaxAckExtensionPeriod(Duration maxAckExtensionPeriod)

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

于 2021-09-15T18:50:05.120 回答