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

Công Nghệ
Publish message vào Google Pub/Sub topic sử dụng Spring Cloud GCP
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...

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.

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

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

Bài viết liên quan

Ngành IT: Làm việc “trên mây” kiếm nhiều tiền nhất hiện nay

Ngành IT: Làm việc “trên mây” kiếm nhiều tiền nhất hiện nay

Kết quả từ cuộc khảo sát đầu năm của Station D về lương bổng của lập trình viên cho thấy nhiều thay đổi đã và đang diễn ra trong ngành IT – cuộc khảo sát tập trung vào các câu hỏi về khối lượng công việc, triển vọng cũng như...

By stationd
Đâu chỉ mỗi Bitcoin, công nghệ Blockchain còn nhiều ứng dụng hơn thế!

Đâu chỉ mỗi Bitcoin, công nghệ Blockchain còn nhiều ứng dụng hơn thế!

Khi nhắc đến blockchain , lập tức mọi người thường nghĩ ngay đến các loại tiền mã hóa, chẳng hạn như bitcoin. Tuy nhiên, blockchain lại là công nghệ tạo ra tiền mã hóa nhưng bản thân công nghệ này không phải là tiền mã hóa như cách mà chúng...

By stationd
Mock phương thức static trong Unit Test sử dụng PowerMock

Mock phương thức static trong Unit Test sử dụng PowerMock

Bài viết được sự cho phép của tác giả Nguyễn Hữu Khanh Trong bài viết này, mình sẽ hướng dẫn các bạn Mock các phương thức static trong Unit Test các bạn nhé! Nếu bạn nào chưa biết về Mock trong Unit Test thì mình có thể nói sơ qua...

By stationd