I have written the following method inside a maven package:
public static void publishMessage(Publisher publisher, String message) throws ExecutionException, InterruptedException, TimeoutException {
ByteString data = ByteString.copyFromUtf8(message);
PubsubMessage pubsubMessage = PubsubMessage.newBuilder().setData(data).build();
ApiFuture<String> messageIdFuture = publisher.publish(pubsubMessage);
String messageId = messageIdFuture.get(10L, TimeUnit.SECONDS);
LOG.info("Message Published! ID: {} Message: {}", messageId, message);
}
When I call this method from a Runner main class within the maven package, I am able to publish messages to the Pub/Sub without any issues. When I load this maven project as a dependency within an SBT project and try calling this method, the execution gets timed out at the line: messageIdFuture.get(10L, TimeUnit.SECONDS);
or gets stuck indefinitely if I use the statement without a timeout config.
I am building the publisher in this fashion:
public static Publisher getPublisher(String projectId, String topicId) throws IOException {
TopicName topicName = TopicName.of(projectId, topicId);
return Publisher.newBuilder(topicName).build();
}
I have a hunch that the issue is related to executors and thread pools, wherein the control is not flowing in a way that I intend it to.
Other Experiments: I've tried avoiding the future.get()
by running publisher.publish(pubsubMessage);
followed by publisher.shutdown();
as the shutdown publishes all locally queued messages. Even then, the message is published via the Runner class and the SBT application execution gets stuck indefinitely at publisher.shutdown();
which internally uses a wait()
inside the messagesWaiter.waitComplete();
Please note:
JAVA Client Version being used: 1.108.1
I have majorly followed the JAVA Client documentation itself. Link: https://cloud.google.com/pubsub/docs/samples/pubsub-quickstart-publisher
Upgrading to the latest version of the Java Client Library for Cloud Pub/Sub worked.