如何在Spring中使用Google Cloud Pub/Sub发送和接收消息

495 阅读3分钟

在这篇文章中,我们将创建一个应用程序来接收由发送方应用程序发送的消息。我们将使用Google Cloud Pub/Sub作为底层消息系统。为了将Google Cloud Pub/Sub与我们的应用程序集成,我们将使用Spring。

作为这个文章的一部分,我们必须下载基本的接收方应用程序和它的依赖关系到GCP。

现在,我们将复制相同的配置,从Spring Initializr下载一个项目到我们的本地机器上,为它能够接收消息做必要的修改。然后,我们将把代码复制到GCP中的接收器应用程序中,并运行它。

创建接收程序

首先,从Spring Initializr下载初始应用程序。请参考下面的图片作为参考。

Spring Initializr ConfigurationSpring Initializr Configuration

在你的本地机器上下载项目文件后,在你选择的IDE中打开它。

现在,在IDE中导航到你的主应用程序类。

我们需要做的第一件事是创建一个消息通道,我们将在那里接收传入的消息。添加下面这段代码。

import org.springframework.context.annotation.Bean;

import org.springframework.integration.channel.DirectChannel;

import org.springframework.messaging.MessageChannel;

@SpringBootApplication

public class SpringCloudMessagingReceiverApplication {

  ...

  @Bean

  public MessageChannel pubsubInputChannel() {

    return new DirectChannel();
  }
}

接下来,我们需要入站通道适配器来接收来自Cloud Pub/Sub的消息并将其发送到pubsubInputChannel 。在该类中添加以下代码。

import com.google.cloud.spring.pubsub.core.PubSubTemplate;

import com.google.cloud.spring.pubsub.integration.inbound.PubSubInboundChannelAdapter;

import org.springframework.beans.factory.annotation.Qualifier;

@SpringBootApplication

public class SpringCloudMessagingReceiverApplication {

  ...

  @Bean

  public PubSubInboundChannelAdapter messageChannelAdapter(

      @Qualifier("pubsubInputChannel") MessageChannel inputChannel,

      PubSubTemplate pubSubTemplate) {

    PubSubInboundChannelAdapter adapter =

      new PubSubInboundChannelAdapter(pubSubTemplate, "my-first-topic-sub");

    adapter.setOutputChannel(inputChannel);

    return adapter;

  }
}

这个适配器将自己绑定到pubsubInputChannel ,并监听来自my-first-topic-sub 订阅的新消息。

触发消息

在上一步中,我们已经创建了一个通道,用来发送传入的消息。现在,让我们用一个@ServiceActivator 来处理它们,当新的消息到达pubsubInputChannel ,它就会被触发。然后,我们将使用一个记录器来打印出有效载荷中的消息。

请将下面这段代码添加到类中。

import org.apache.commons.logging.Log;

import org.apache.commons.logging.LogFactory;

import org.springframework.integration.annotation.ServiceActivator;

@SpringBootApplication

public class SpringCloudMessagingReceiverApplication {

  ...

  private static final Log LOGGER = 

LogFactory.getLog(SpringCloudMessagingReceiverApplication.class);

  @ServiceActivator(inputChannel = "pubsubInputChannel")

  public void messageReceiver(String payload) {

    LOGGER.info("Message arrived! Payload: " + payload);

  }

}

最后,我们完成了这个应用终于到了运行和测试的时候了。

把这整段代码复制到GCP环境对应的接收者应用程序中。

注意:GCP环境的主类名称为DemoApplication,如果需要,请重新命名该类。

然后使用GCP Cloud Shell运行该应用程序。

./mvnw spring-boot:run -Dspring-boot.run.jvmArguments="-Dserver.port=8081"

现在,你从发送方应用程序发送的信息将在接收方应用程序上收到。让我们来验证这一点。

点击当前标签旁边的小加号按钮,打开一个新的Cloud Shell标签。向发送方应用程序发送一个HTTP POST请求。

curl --data "message=First Message" localhost:8080/postMessage

然后,你应该能够在接收方应用程序运行的另一个标签中看到信息被记录下来。

INFO: Message arrived! Payload: First Message

如果没有,请重新检查这两个代码,以及这两个应用程序是否在GCP云端外壳上正常运行,然后再试一次。

总结

在这篇文章中,我们试图了解如何在Spring项目中使用Google Cloud Pub/Sub发送和接收消息。这只是一个基本的发送者-接收者系统,用于学习,你可以尝试在你现有的Spring-Kafka项目中实现Cloud Pub/Sub消息传递。