当前位置: 首页 > 知识库问答 >
问题:

PubSub与Spring:知道消息是否发布?

白学
2023-03-14

我的发布服务器代码如下所示:

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;
    }

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

如有任何帮助或指导,不胜感激,谢谢。

共有1个答案

戚俊健
2023-03-14

使用函数publish(),您应该能够捕获future,在这里您可以检查消息是否已经发布。

在Google的PubSub文档中有一个例子:

// 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());
 类似资料:
  • 它像发布/订阅一样工作。因此,可以将队列绑定或取消绑定到不同的事件,以便消费者/订阅者只接收他们感兴趣的消息。 当然,生产者/发布者现在使用绑定键(事件名)作为将其传递给pika实现。但是,当它为不存在的绑定发布某些内容时,消息就会丢失,也就是说,当没有人为事件绑定队列时,但是一些发布服务器调用。 所以我的问题是: > 检查pika.basic_publish的返回值。它总是返回。 检查当我们试图

  • 这是一个消息侦听器: 在sender类中调用方法时,订阅此主题的所有侦听器都将异步获得此消息。但是我想知道这个特定的是否从消息发送方接收消息。异步怎么做?我假设,如果我想异步地做的话,就不能像其中一个答案中建议的那样,在发送器和侦听器中使用。我需要在sender和listener类中添加什么才能从listener获得消息接收确认?

  • 问题内容: 我的总体问题是: 使用Redis for PubSub,当发布者将消息推送到频道中的速度比订阅者能够阅读它们的速度快时,消息会如何处理? 例如,假设我有: 一个简单的发布者以2 msg / sec的速度发布消息。 一个简单的订户以1 msg / sec的速率读取消息。 我天真的假设是订户只会看到发布到Redis上的消息的50%。为了验证这一理论,我编写了两个脚本: pub.py 子py

  • 我正在学习如何使用Java Spring框架,并开始尝试Spring集成。我试图使用Spring集成将我的应用程序连接到MQTT代理以发布和订阅消息,但我很难找到将消息手动发布到出站通道的方法。如果可能的话,我想专门使用java代码中的符号来构建它,而不是使用定义bean和其他相关配置的xml文件。 在每个示例中,我都看到手动发布消息的解决方案似乎是使用MessagingGateway接口,然后使

  • 说明 此接口用于向排队的微信用户发送消息,如到号时的叫号信息 请求地址 http://api.dc78.cn/Api/wwnotify 请求方式 GET 请求参数 URL参数 参数名称 必填 描述 范例 id 排队号id msg 要发送的信息 POST参数 参数名称 必填 描述 范例 无 GET参数 参数名称 必填 描述 范例 id 排队号id 是 排队列表协议中的id 223729 msg 通知

  • 线下取的号不能发送通知 请求参数说明 参数 描述 必填 示例值 类型 最大长度 action 接口参数组 是 object └action 需要调用的接口名称 是 wwget string get GET参数组,本组参数需要参与签名 是 object └id 排队号id 否 47302320 number └msg 通知消息 否 38号客人请返回用餐啦 string 请求示例 { "action