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 thư viện Pub/Sub Java client các bạn nhé!
Đầu tiên, mình sẽ tạo mới một Maven project:
để làm ví dụ.
Google Pub/Sub client dependency như sau:
1 2 3 4 5 6 7 |
<dependencies> <dependency> <groupId>com.google.cloud</groupId> <artifactId>google-cloud-pubsub</artifactId> <version>1.116.0</version> </dependency> </dependencies> |
Mình sẽ tạo mới một class với main() method để làm ví dụ:
1 2 3 4 5 6 7 |
package com.huongdanjava.gcppubsub; public class Application { public static void main(String[] args) { } } |
Để 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:
1 2 |
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 client. Các bạn khởi tạo đối tượng này từ project ID và topic ID như sau:
1 |
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:
1 |
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:
1 2 3 4 5 6 7 |
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:
1 |
publisher.publish(pubsubMessage); |
Toàn bộ code như sau:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
package com.huongdanjava.gcppubsub; 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; import java.io.IOException; import java.util.concurrent.ExecutionException; public class Application { public static void main(String[] args) throws IOException, ExecutionException, InterruptedException { 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.
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.
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:
Như các bạn thấy, một message đã được publish vào topic của chúng ta!