我的发布者代码如下:
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块。
最终,我想知道如果代码没有将消息推送到主题中,那么我必须将其记录下来并将该错误抛出给客户端,这对于我当前的代码进行了适当的异常处理是不会发生的。
感谢任何帮助或指导,谢谢。
答案 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());