Como gravar e responder a mensagens do Pub/Sub

O Cloud Pub/Sub fornece mensagens assíncronas confiáveis, de muitos para muitos, entre os aplicativos. Os aplicativos do editor podem enviar mensagens para um tópico, e outros aplicativos podem se inscrever nele para receber as mensagens.

Neste documento, descrevemos como usar a biblioteca de cliente do Google Cloud para enviar e receber mensagens do Cloud Pub/Sub em um aplicativo em execução no ambiente flexível.

Pré-requisitos

  • Siga as instruções em "Hello, World!" para Java no App Engine para configurar o ambiente e o projeto, além de compreender como aplicativos Java do App Engine são estruturados
  • Anote e guarde o código do projeto. Você precisará dele para executar o aplicativo de amostra descrito neste documento.

Como clonar o aplicativo de amostra

Copie os aplicativos de amostra para sua máquina local e navegue até o diretório do pubsub:

git clone https://github.com/GoogleCloudPlatform/java-docs-samples
cd java-docs-samples/flexible/pubsub

Como criar um tópico e uma assinatura

Ao criar um tópico e uma assinatura, especifique o endpoint que receberá as solicitações do servidor do Pub/Sub:

gcloud pubsub topics create YOUR_TOPIC_NAME
gcloud pubsub subscriptions create YOUR_SUBSCRIPTION_NAME \
    --topic YOUR_TOPIC_NAME \
    --push-endpoint \
    https://YOUR_PROJECT_ID.appspot.com/pubsub/push?token=YOUR_TOKEN \
    --ack-deadline 10

Substitua YOUR_TOKEN por um token aleatório secreto. Ele é usado pelo endpoint do push para verificar as solicitações.

Como definir variáveis de ambiente

Edite o arquivo app.yaml para definir as variáveis de ambiente para o tópico e o token de verificação:

env_variables:
  PUBSUB_TOPIC: <your-topic-name>
  # This token is used to verify that requests originate from your
  # application. It can be any sufficiently random string.
  PUBSUB_VERIFICATION_TOKEN: <your-verification-token>

Análise do código

O aplicativo de amostra usa as bibliotecas de cliente do Google Cloud.

O aplicativo de amostra utiliza os valores definidos no arquivo app.yaml para configurar as variáveis do ambiente. O gerenciador da solicitação de push usa esses valores para confirmar que a solicitação veio do Pub/Sub e foi originada de uma fonte confiável:

String pubsubVerificationToken = System.getenv("PUBSUB_VERIFICATION_TOKEN");

O aplicativo de amostra mantém uma instância de banco de dados do Cloud Datastore para armazenar mensagens. O servlet PubSubPush recebe mensagens enviadas e as adiciona à instância do banco de dados messageRepository:

@WebServlet(value = "/pubsub/push")
public class PubSubPush extends HttpServlet {

  @Override
  public void doPost(HttpServletRequest req, HttpServletResponse resp)
      throws IOException, ServletException {
    String pubsubVerificationToken = System.getenv("PUBSUB_VERIFICATION_TOKEN");
    // Do not process message if request token does not match pubsubVerificationToken
    if (req.getParameter("token").compareTo(pubsubVerificationToken) != 0) {
      resp.setStatus(HttpServletResponse.SC_BAD_REQUEST);
      return;
    }
    // parse message object from "message" field in the request body json
    // decode message data from base64
    Message message = getMessage(req);
    try {
      messageRepository.save(message);
      // 200, 201, 204, 102 status codes are interpreted as success by the Pub/Sub system
      resp.setStatus(HttpServletResponse.SC_OK);
    } catch (Exception e) {
      resp.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
    }
  }

O servlet PubSubPublish interage com o aplicativo da Web do App Engine para publicar novas mensagens e exibir as mensagens recebidas:

@WebServlet(name = "Publish with PubSub", value = "/pubsub/publish")
public class PubSubPublish extends HttpServlet {

  @Override
  public void doPost(HttpServletRequest req, HttpServletResponse resp)
      throws IOException, ServletException {
    Publisher publisher = this.publisher;
    try {
      String topicId = System.getenv("PUBSUB_TOPIC");
      // create a publisher on the topic
      if (publisher == null) {
        publisher = Publisher.newBuilder(
            ProjectTopicName.of(ServiceOptions.getDefaultProjectId(), topicId))
            .build();
      }
      // construct a pubsub message from the payload
      final String payload = req.getParameter("payload");
      PubsubMessage pubsubMessage =
          PubsubMessage.newBuilder().setData(ByteString.copyFromUtf8(payload)).build();

      publisher.publish(pubsubMessage);
      // redirect to home page
      resp.sendRedirect("/");
    } catch (Exception e) {
      resp.sendError(HttpStatus.SC_INTERNAL_SERVER_ERROR, e.getMessage());
    }
  }

Como executar a amostra no local

Durante uma execução local, é possível usar o SDK do Cloud com o objetivo de fornecer autenticação para usar as APIs do Google Cloud. Se o ambiente tiver sido configurado conforme descrito em Pré-requisitos, o comando gcloud init, que fornece essa autenticação, já terá sido executado.

mvn clean package

Defina as variáveis de ambiente antes de iniciar o aplicativo:

export PUBSUB_VERIFICATION_TOKEN=[your-verification-token]
export PUBSUB_TOPIC=[your-topic]
mvn jetty:run

Como simular notificações push

Pelo aplicativo, é possível enviar mensagens localmente, mas não é possível receber mensagens push localmente. É possível simular uma mensagem de push com uma solicitação HTTP para o endpoint da notificação local. A amostra inclui o arquivo sample_message.json.

Use curl ou httpie (em inglês) para enviar uma solicitação HTTP POST:

curl -H "Content-Type: application/json" -i --data @sample_message.json "localhost:8080/pubsub/push?token=[your-token]"

Ou

http POST ":8080/pubsub/push?token=[your-token]" < sample_message.json

Resposta:

HTTP/1.1 200 OK
Date: Wed, 26 Apr 2017 00:03:28 GMT
Content-Length: 0
Server: Jetty(9.3.8.v20160314)

Após a conclusão da solicitação, atualize localhost:8080 e veja a mensagem na lista de mensagens recebidas.

Como executar no App Engine

Para implantar o aplicativo de demonstração no App Engine usando a ferramenta de linha de comando gcloud, execute o seguinte comando no diretório em que o arquivo app.yaml está localizado:

mvn appengine:deploy

Agora, acesse o aplicativo em https://[YOUR_PROJECT_ID].appspot.com. Você pode usar o formulário para enviar mensagens. No entanto, não há garantias sobre qual instância do seu aplicativo receberá a notificação. É possível enviar várias mensagens e atualizar a página para ver a mensagem recebida.

Esta página foi útil? Conte sua opinião sobre:

Enviar comentários sobre…

Ambiente flexível do App Engine para documentos Java