Как получить метаданные события Pub / Sub в функции Spring Cloud в функции Google Cloud

Я создал простую облачную функцию Google с библиотекой Spring Cloud Function, которая запускается по прибытии сообщения Pub / Sub. Я следил за образцом function-sample-gcp-background. Каждый раз, когда сообщение отправляется в Pub / Sub, оно печатается из облачной функции, как и ожидалось.

Но мне интересно, как мне получить метаданные сообщения Pub / Sub в Cloud Functon. В документации по облачным функциям Google говорится, что

Эти метаданные доступны через объект контекста, который передается вашей функции при ее вызове.

Как я могу получить доступ к этим метаданным (или объекту контекста) в приложении Spring Cloud Function?

ОБНОВЛЕНИЕ: - Версия spring-cloud-function-adapter-gcp:3.1.2

ОБНОВЛЕНИЕ 2: - Я поднял проблему в github и получил проблема решена. Спасибо команде Spring Cloud Function.


person Manu    schedule 01.05.2021    source источник
comment
Какие метаданные вам нужны?   -  person guillaume blaquiere    schedule 02.05.2021
comment
Метаданные, которые мне нужны, - это время публикации сообщения и идентификатор сообщения.   -  person Manu    schedule 02.05.2021


Ответы (2)


Когда вы используете фоновую функцию, сообщение PubSub и контекст извлекаются и предоставляются в сообщении PubSub. Если вы посмотрите на объект PubSub здесь; у вас есть время публикации и встроенный в него идентификатор сообщения. Вам нужно только использовать их!

person guillaume blaquiere    schedule 02.05.2021
comment
Значения полей messageId и publishTime равны null. Но я вижу, что в поле attributes появляются дополнительные настраиваемые атрибуты. - person Manu; 03.05.2021

Проблема решена в соответствии с советом команды spring-cloud-function. Функция Consumer должна принять параметр типа Message<PubSubMessage> вместо PubSubMessage, чтобы получить объект Context.

    @Bean
    public Consumer<Message<PubSubMessage>> pubSubFunction() {
        return message -> {
            // The PubSubMessage data field arrives as a base-64 encoded string and must be decoded.
            // See: https://cloud.google.com/functions/docs/calling/pubsub#event_structure

            PubSubMessage payload = message.getPayload();
            String decodedMessage = new String(
                    Base64.getDecoder().decode(message.getPayload().getData()), StandardCharsets.UTF_8);
            System.out.println("Hello!!! Received Pub/Sub message with data: " + decodedMessage);

                        // Print out timestamp and event id
            Context ctx = message.getHeaders().get("gcf_context", Context.class);
            System.out.println(ctx.eventId());
            System.out.println(ctx.timestamp());
        };
    }

Ссылка: - проблема с github № 695

person Manu    schedule 06.05.2021