Publish message vào Google Pub/Sub topic sử dụng Spring Cloud GCP

626

Bài viết được sự cho phép của tác giả Nguyễn Hữu Khanh

Google Pub/Sub là một trong những cloud messaging service mà chúng ta có thể sử dụng nếu ứng dụng của các bạn có những tính năng cần sử dụng messaging technology. Trong bài viết này, mình sẽ hướng dẫn các bạn cách publish một message vào Google Pub/Sub topic sử dụng Spring Cloud GCP các bạn nhé!

Đầu tiên, mình sẽ tạo mới một Spring Boot project với GCP Messaging dependency:

để làm ví dụ.

Kết quả:

 

Mình sẽ implement interface CommandLineRunner cho class SpringGcpPubsubPublishApplication để chạy ứng dụng Spring Boot này ở chế độ console. Các bạn có thể tham khảo thêm bài viết này các bạn nhé!

package com.huongdanjava.springgcppubsub.publish;

import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class SpringGcpPubsubPublishApplication implements CommandLineRunner {

public static void main(String[] args) {
SpringApplication.run(SpringGcpPubsubPublishApplication.class, args);
}

@Override
public void run(String... args) throws Exception {
// TODO Auto-generated method stub

}

}

Để làm ví dụ, mình cũng sẽ tạo mới một topic trên Google Pub/Sub với thông tin về project ID và topic ID như sau:

Để bắt đầu, chúng ta sẽ khai báo những thông tin này trong code như sau:

String projectId = "crested-trainer-341707";
String topicId = "huongdanjava";

Để publish message vào topic, chúng ta cần có đối tượng TopicName của thư viện Google Pub/Sub. Các bạn khởi tạo đối tượng này từ project ID và topic ID như sau:

TopicName topicName = TopicName.of(projectId, topicId);

Sau khi đã có TopicName, chúng ta sẽ khởi tạo đối tượng Publisher để chuẩn bị publish message:

Publisher publisher = Publisher.newBuilder(topicName).build();

Phương thức publish() của đối tượng Publisher sẽ giúp chúng ta publish message. Tham số của phương thức này là một đối tượng PubsubMessage, được tạo từ message mà chúng ta muốn publish như sau:

String message = "Hello";
ByteString data = ByteString.copyFromUtf8(message);
// @formatter:off
PubsubMessage pubsubMessage = PubsubMessage.newBuilder()
.setData(data)
.build();
// @formatter:on

Bây giờ thì các bạn có thể publish message rồi:

publisher.publish(pubsubMessage);

Toàn bộ code như sau:

package com.huongdanjava.springgcppubsub.publish;

import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import com.google.api.core.ApiFuture;
import com.google.cloud.pubsub.v1.Publisher;
import com.google.protobuf.ByteString;
import com.google.pubsub.v1.PubsubMessage;
import com.google.pubsub.v1.TopicName;

@SpringBootApplication
public class SpringGcpPubsubPublishApplication implements CommandLineRunner {

public static void main(String[] args) {
SpringApplication.run(SpringGcpPubsubPublishApplication.class, args);
}

@Override
public void run(String... args) throws Exception {
String projectId = "crested-trainer-341707";
String topicId = "huongdanjava";

TopicName topicName = TopicName.of(projectId, topicId);

Publisher publisher = Publisher.newBuilder(topicName).build();

String message = "Hello";
ByteString data = ByteString.copyFromUtf8(message);
// @formatter:off
PubsubMessage pubsubMessage = PubsubMessage.newBuilder()
.setData(data)
.build();
// @formatter:on

ApiFuture<String> publish = publisher.publish(pubsubMessage);

String messageId = publish.get();
System.out.println("Published message ID: " + messageId);
}

}

Ở đây, như các bạn thấy, mình còn thêm code để lấy kết quả của việc publish message có thành công hay không? Sử dụng interface ApiFuture của Google Pub/Sub extends từ interface Future của Java.

Trước khi chạy ví dụ này, chúng ta cần làm thêm một bước nữa là cấu hình phần authentication cho ứng dụng với Google Pub/Sub.

Google Pub/Sub hỗ trợ chúng ta 2 loại authentication đó là sử dụng Service Account hoặc Access Control với IAM. Thông thường, chúng ta sẽ sử dụng Service Account để làm việc này.

  10 Add-on Google Sheets phải có dành cho các Recruiters
  Cách Google tạo ra frameworks cho Web

Xem thêm các việc làm Product Manager hấp dẫn trên TopDev

Các bạn có thể sử dụng một Service Account với Role Pub/Sub Admin để publish message vào Pub/Sub topic như sau:

Có một Role khác là Pub/Sub Publisher chỉ để publish message nhưng mình không hiểu sao nó không work, không gửi message được với Role này. Nếu các bạn biết nguyên nhân thì hãy chia sẻ nhé!

Sau khi Add key cho Service Account này với type JSON hoặc P12, tập tin private key này sẽ được lưu về máy của các bạn.

Bây giờ thì các bạn chỉ cần set một biến môi trường trong máy của mình hoặc trong phần cấu hình chạy ứng dụng của IDE với tên là GOOGLE_APPLICATION_CREDENTIALS. Giá trị của biến môi trường này trỏ đến đường dẫn của tập tin private key trên.

Ví dụ của mình như sau:

Bây giờ nếu chạy ứng dụng và kiểm tra topic, các bạn sẽ thấy kết quả như sau:

Bài viết gốc được đăng tải tại huongdanjava.com