spring的PubSub:知​​道消息是否发布?

时间:2019-12-10 11:53:36

标签: spring-boot google-cloud-pubsub

我的发布者代码如下:

public abstract class PubSubPublisher {

    private static final Logger LOGGER = LoggerFactory.getLogger(PubSubPublisher.class);

    private final PubSubTemplate pubSubTemplate;

    protected PubSubPublisher(PubSubTemplate pubSubTemplate) {
        this.pubSubTemplate = pubSubTemplate;
    }

    protected abstract String topic(String topicName);

    public void publish(String topicName, String message) throws StatusRuntimeException {
        LOGGER.info("Publishing to topic [{}]. Message: [{}]", topicName, message);
        pubSubTemplate.publish(topicName, message);
    }

}

我的组件

@Component
public class HelloPubSubPublisher extends PubSubPublisher {

    @Autowired
    public HelloPubSubPublisher(PubSubTemplate pubSubTemplate) throws StatusRuntimeException{
        super(pubSubTemplate);
    }

    @Override
    protected String topic(String topicName) {
        return topicName;
    }

}

现在在我的服务层上,如何获取天气,我是否成功将消息发布到主题中,否则请注意,我正在使用的所有Google api都是异步的。

try {
    publisher.publish(topicName, payload);
}catch (Exception e) {
    LOGGER.error("ioException occured: "+e);
    throw new TopicNotFoundException();
}

不幸的是,我无法捕获任何错误,程序光标没有进入catch块。

最终,我想知道如果代码没有将消息推送到主题中,那么我必须将其记录下来并将该错误抛出给客户端,这对于我当前的代码进行了适当的异常处理是不会发生的。

感谢任何帮助或指导,谢谢。

1 个答案:

答案 0 :(得分:0)

使用功能publish(),您应该能够捕获future,您可以在其中检查消息是否已发布。

Google's PubSub documentation上有一个示例:

// Once published, returns a server-assigned message id (unique within the topic)
ApiFuture<String> future = publisher.publish(pubsubMessage);

// Add an asynchronous callback to handle success / failure
ApiFutures.addCallback(
    future,
    new ApiFutureCallback<String>() {

      @Override
      public void onFailure(Throwable throwable) {
        if (throwable instanceof ApiException) {
          ApiException apiException = ((ApiException) throwable);
          // details on the API exception
          System.out.println(apiException.getStatusCode().getCode());
          System.out.println(apiException.isRetryable());
        }
        System.out.println("Error publishing message : " + message);
      }

      @Override
      public void onSuccess(String messageId) {
        // Once published, returns server-assigned message ids (unique within the topic)
        System.out.println(messageId);
      }
    },
    MoreExecutors.directExecutor());