PubSub не повторно доставляет сообщение после крайнего срока подтверждения - PullRequest
0 голосов
/ 17 июня 2020

У меня два подписчика указывают на одну и ту же подписку варианта использования topi c. Согласно документу pub sub повторно доставьте сообщение, если подписчику потребовалось больше времени, чем крайний срок подтверждения, чтобы подтвердить сообщение.

Я настроил значение по умолчанию, которое составляет 10 se c. Но обработка и подтверждение занимает около 1 минуты. Ниже мой пример кода

public class SubscribeAsyncExample {

    private Subscriber subscriber = null;

    @PostConstruct
    public void init() throws Exception {
        // TODO(developer): Replace these variables before running the sample.
        String projectId = "your-project-id";
        String subscriptionId = "your-subscription-id";
        subscribeAsyncExample(projectId, subscriptionId);
    }

    public void subscribeAsyncExample(String projectId, String subscriptionId) {
        ProjectSubscriptionName subscriptionName = ProjectSubscriptionName.of(projectId, subscriptionId);

        // Instantiate an asynchronous message receiver.
        MessageReceiver receiver = (PubsubMessage message, AckReplyConsumer consumer) -> {
            // Handle incoming message, then ack the received message.
            System.out.println("Id: " + message.getMessageId());
            System.out.println("Data: " + message.getData().toStringUtf8());
            int sleepingTime = 20000;
            System.out.println("sleepingTime:" + sleepingTime);
            try { 
                Thread.sleep(sleepingTime); 
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            consumer.ack();
            System.out.println("test completed");
        };
        try {
            subscriber = Subscriber.newBuilder(subscriptionName, receiver).build();
            // Start the subscriber.
            subscriber.startAsync().awaitRunning();
            System.out.printf("Listening for messages on %s:\n", subscriptionName.toString());
            // Allow the subscriber to run for 30s unless an unrecoverable error occurs.
            // subscriber.awaitTerminated(30, TimeUnit.SECONDS);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    @PreDestroy
    public void preDestroy() throws Exception {
        // Shut down the subscriber after 30s. Stop receiving messages.
        subscriber.stopAsync();
    }

}```

Below is Response
20:53:24,300 INFO  [stdout] (Thread-128) Id: 1288313732423842
20:53:24,300 INFO  [stdout] (Thread-128) Data: abc13
**20:53:24,300 INFO**  [stdout] (Thread-128) sleepingTime:20000
**20:53:44,300 INFO**  [stdout] (Thread-128) test completed

1 Ответ

0 голосов
/ 17 июня 2020

При использовании клиентских библиотек Cloud Pub / Sub крайний срок автоматически увеличивается до MaxAckExtensionPeriod , указанного в Subscriber.Buider. Этот период продления по умолчанию составляет один час. Чтобы изменить это значение, вам нужно изменить строку, создающую подписчика, следующим образом:

subscriber = Subscriber.newBuilder(subscriptionName, receiver)
    .setMaxAckExtensionPeriod(Duration.ofSeconds(10))
    .build();
...