Я попытался запустить пример здесь https://github.com/spring-cloud/spring-cloud-gcp/tree/master/spring-cloud-gcp-samples/spring-cloud-gcp-pubsub-binder-sample Я ожидал, что он создаст тему в моем проекте по умолчанию. Служба Tomcat запущена, но даже страница index.html не загружается (должно быть сообщение типа «Tomcat запущен на порту (ах): 8080 (http) с контекстным путем ''»), поэтому кажется, что он застрял, и это произошло после того, как я добавил:
@Autowired
private Source source;
Вот журнал
2019-02-14 12:06:54.305 INFO 3560 --- [ main] com.example.demo.DemoApplication : Starting DemoApplication on 2019-02-14 12:06:54.309 INFO 3560 --- [ main] com.example.demo.DemoApplication : No active profile set, falling back to default profiles: default
2019-02-14 12:06:55.362 INFO 3560 --- [ main] faultConfiguringBeanFactoryPostProcessor : No bean named 'errorChannel' has been explicitly defined. Therefore, a default PublishSubscribeChannel will be
(http)
2019-02-14 12:06:56.246 INFO 3560 --- [ main] o.apache.catalina.core.StandardService : Starting service [Tomcat]
2019-02-14 12:06:56.247 INFO 3560 --- [ main] org.apache.catalina.core.StandardEngine : Starting Servlet engine: [Apache Tomcat/9.0.14]
2019-02-14 12:06:56.257 INFO 3560 --- [ main] 2019-02-14 12:06:56.385 INFO 3560 --- [ main] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring embedded WebApplicationContext
2019-02-14 12:06:56.385 INFO 3560 --- [ main] o.s.web.context.ContextLoader : Root WebApplicationContext: initialization completed in 2027 ms
2019-02-14 12:06:56.970 INFO 3560 --- [ main] o.s.s.concurrent.ThreadPoolTaskExecutor : Initializing ExecutorService 'applicationTaskExecutor'
2019-02-14 12:06:57.079 INFO 3560 --- [ main] o.s.b.a.w.s.WelcomePageHandlerMapping : Adding welcome page: class path resource [static/index.html]
2019-02-14 12:06:57.253 WARN 3560 --- [ main] c.g.a.oauth2.DefaultCredentialsProvider : Your application has authenticated using end user credentials from Google Cloud SDK. We recommend that most server applications use service accounts instead. If your application continues to use end user credentials from Cloud SDK, you might receive a "quota exceeded" or "API not enabled" error. For more information about service accounts, see https://cloud.google.com/docs/authentication/.
2019-02-14 12:06:57.383 INFO 3560 --- [ main] o.s.c.g.a.c.GcpContextAutoConfiguration : The default project ID is xxxxxx-xxxxx
2019-02-14 12:06:58.373 INFO 3560 --- [ main] o.s.i.monitor.IntegrationMBeanExporter : Registering MessageChannel nullChannel
2019-02-14 12:06:58.395 INFO 3560 --- [ main] o.s.i.monitor.IntegrationMBeanExporter : Registering MessageChannel output
2019-02-14 12:06:58.455 INFO 3560 --- [ main] o.s.i.monitor.IntegrationMBeanExporter : Registering MessageChannel errorChannel
2019-02-14 12:06:58.492 INFO 3560 --- [ main] o.s.i.monitor.IntegrationMBeanExporter : Registering MessageHandler errorLogger
2019-02-14 12:06:58.525 INFO 3560 --- [ main] o.s.i.endpoint.EventDrivenConsumer : Adding {logging-channel-adapter:_org.springframework.integration.errorLogger} as a subscriber to the 'errorChannel' channel
2019-02-14 12:06:58.525 INFO 3560 --- [ main] o.s.i.channel.PublishSubscribeChannel : Channel 'application.errorChannel' has 1 subscriber(s).
2019-02-14 12:06:58.525 INFO 3560 --- [ main] o.s.i.endpoint.EventDrivenConsumer : started _org.springframework.integration.errorLogger
Что может происходить??





Вы определили spring.cloud.stream.bindings.input.destination в своем application.properties?
Связыватель создаст анонимную подписку для вашей темы, если она не настроена, но не создаст тему самостоятельно.
На самом деле, я был не прав насчет того, что тема не создавалась автоматически; связующее создает тему, если она не существует. Не могли бы вы проверить, созданы ли в вашем проекте GCP тема "input" и подписка "input.input-sub"?
Вы также можете попробовать запустить образец с дополнительным журналом загрузки spring, чтобы увидеть, соответствует ли PubSubBinderConfiguration: -Dlogging.level.org.springframework.boot.autoconfigure.logging=DEBUG
На самом деле, отступая от природы паба/подписки, вы используете прокси? Запуск errorLogger — это последнее, что происходит перед тем, как код попытается подключиться к pubsub.googleapis.com.
Я внедрил производителя с использованием библиотек gcp (без Spring), и это сработало... Вот что я получаю с дополнительным ведением журнала PubSubBinderConfiguration: - @ConditionalOnMissingBean (типы: org.springframework.cloud.stream.binder.Binder ; SearchStrategy: все) бины не найдены (OnBeanCondition)
Можете ли вы внедрить PubSubAdmin bean-компонент и попытаться вызвать для него createTopic("testTopic") напрямую? Публикация и подписка выполняются через gRPC, но администрирование темы/подписки осуществляется через HTTP, поэтому прокси-сервер может заблокировать их независимо. @Autowired PubSubAdmin pubSubAdmin;
Я проверил, и транспортом по умолчанию для административных операций является gRPC, а не HTTP. Но все же стоит проверить, можете ли вы выполнять операции PubSubAdmin вручную, поскольку код почти наверняка застревает в PubSubChannelProvisioner, либо проверяя, существует ли тема, либо пытаясь ее создать (потому что вы получаете application.errorChannel, но не канал application.output в журналы).
это была проблема с разрешениями. Я понимаю это, используя API Pub Sub. Но почему это не было показано в журнале ошибок? Как можно обработать эти ошибки?
Я протестировал образец связующего в служебной учетной записи без разрешения «pub/sub admin» и получил ожидаемое исключение при подготовке связующего. Caused by: io.grpc.StatusRuntimeException: PERMISSION_DENIED: User not authorized to perform this action.
Это была проблема с разрешениями. Среда GOOGLE_APPLICATION_CREDENTIALS задана неправильно.
Я сделал... spring.cloud.stream.bindings.input.destination=input spring.cloud.stream.bindings.output.destination=input spring.cloud.stream.bindings.input.group=input-sub