Spring 集成/GCP PubSub:频道订阅者丢失

时间:2021-04-20 14:15:48

标签: spring spring-integration google-cloud-pubsub

一切都在标题中。 我有一个特定的渠道可以将数据发送到 PubSub,使用 Spring 集成和这个 information about GCP PubSub

我在本地或 QA 环境中没有任何问题。 但是,在 prod 中,我有以下错误:

org.springframework.messaging.MessageDeliveryException: failed to send Message to channel 
'pubSubFlow.channel#1'; nested exception is java.lang.IllegalStateException: The [bean 
'pubSubFlow.channel#1'; defined in: 'class path resource [fr/auchan/lark/tracking/api/v1
/pubsub/PubSubRequestIntegration.class]'; from source: 'bean method pubSubFlow'] doesn't 
have subscribers to accept messages

org.springframework.integration.support.utils.IntegrationUtils.wrapInDeliveryExceptionIfNecessary(IntegrationUtils.java:167) ~[spring-integration-core-5.3.5.RELEASE.jar:5.3.5.RELEASE]
org.springframework.integration.channel.AbstractMessageChannel.send(AbstractMessageChannel.java:600) ~[spring-integration-core-5.3.5.RELEASE.jar:5.3.5.RELEASE]
org.springframework.integration.channel.AbstractMessageChannel.send(AbstractMessageChannel.java:520) ~[spring-integration-core-5.3.5.RELEASE.jar:5.3.5.RELEASE]
org.springframework.integration.channel.FluxMessageChannel.lambda$subscribeTo$2(FluxMessageChannel.java:83) ~[spring-integration-core-5.3.5.RELEASE.jar:5.3.5.RELEASE]
reactor.core.publisher.FluxPeekFuseable$PeekFuseableSubscriber.onNext(FluxPeekFuseable.java:189) ~[reactor-core-3.3.13.RELEASE.jar:3.3.13.RELEASE]
reactor.core.publisher.FluxPublishOn$PublishOnSubscriber.runAsync(FluxPublishOn.java:439) ~[reactor-core-3.3.13.RELEASE.jar:3.3.13.RELEASE]
reactor.core.publisher.FluxPublishOn$PublishOnSubscriber.run(FluxPublishOn.java:526) ~[reactor-core-3.3.13.RELEASE.jar:3.3.13.RELEASE]
reactor.core.scheduler.WorkerTask.call(WorkerTask.java:84) ~[reactor-core-3.3.13.RELEASE.jar:3.3.13.RELEASE]
reactor.core.scheduler.WorkerTask.call(WorkerTask.java:37) ~[reactor-core-3.3.13.RELEASE.jar:3.3.13.RELEASE]
java.base/java.util.concurrent.FutureTask.run(Unknown Source) ~[na:na]
java.base/java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(Unknown Source) ~[na:na]
java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source) ~[na:na]
java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source) ~[na:na]
java.base/java.lang.Thread.run(Unknown Source) ~[na:na]
Caused by: java.lang.IllegalStateException: The [bean 'pubSubFlow.channel#1'; defined in: 'class path resource [PubSubRequestIntegration.class]'; from source: 'bean method pubSubFlow'] doesn't have subscribers to accept messages
org.springframework.util.Assert.state(Assert.java:97) ~[spring-core-5.2.12.RELEASE.jar:5.2.12.RELEASE]
org.springframework.integration.channel.FluxMessageChannel.doSend(FluxMessageChannel.java:61) ~[spring-integration-core-5.3.5.RELEASE.jar:5.3.5.RELEASE]
org.springframework.integration.channel.AbstractMessageChannel.send(AbstractMessageChannel.java:570) ~[spring-integration-core-5.3.5.RELEASE.jar:5.3.5.RELEASE]
 12 common frames omitted

以下是我的频道声明,ServiceActivator 的使用如所写是 PubSub 指南(请参阅上面的链接)。

@Bean
public MessageChannel dataChannel() {
    return MessageChannels.publishSubscribe(Executors.newCachedThreadPool()).get();
}

@Bean
public MessageChannel pubSubChannel() {
    return MessageChannels.publishSubscribe(Executors.newCachedThreadPool()).get();
}

@Bean
public IntegrationFlow pubSubFlow(
        MessageChannel dataChannel,
        MessageChannel pubSubChannel) {
    return IntegrationFlows
            .from(dataChannel)
            .fluxTransform(this::toPubSubFormat)
            .channel(pubSubChannel)
            .get();
}

@Bean
@ServiceActivator(inputChannel = "pubSubChannel")
public PubSubMessageHandler sendToPubSub(PubSubTemplate pubSubTemplate) {
    PubSubMessageHandler adapter = new PubSubMessageHandler(pubSubTemplate,
            pubSubIntegrationProperties.getTopic());

    adapter.setPublishCallback(
            new ListenableFutureCallback<>() {
                @Override
                public void onFailure(Throwable throwable) {
                    log.warn("There was the following error sending the message. " + throwable);
                }

                @Override
                public void onSuccess(String result) {
                    log.debug("Message was sent via the outbound channel adapter to {} : {}", pubSubIntegrationProperties.getTopic(), result);
                }
            });
    return adapter;
}

我错过了什么吗?为什么 pubSubChannel 被标记为没有订阅者? 感谢您的帮助

0 个答案:

没有答案