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

spring - Springboot如何更好的封装Redisson的发布订阅?

桓高澹
2024-06-20

以下是目前的代码,不知道是否可以有更好的写法封装优化以下代码,让调用者只关注逻辑实现就好。配置自动订阅所有的实现,当前代码是封装成一个starter

@Datapublic class Subscription<T> {    private final String topic;    private final Class<T> messageType;    private final Consumer<T> consumer;}@FunctionalInterfacepublic interface SubscriptionCustomizer<T> {    Subscription<T> customize();}@Componentpublic class SubscriptionInitializer {    @Autowired    private List<SubscriptionCustomizer<?>> customizers;    public <T> void registerSubscriber(SubscriptionCustomizer<T> subscriber) {        Subscription<T> customize = subscriber.customize();        RedisUtil.subscribe(customize.getTopic(), customize.getMessageType(), customize.getConsumer());    }    @PostConstruct    public void registerAllSubscribers() {        customizers.forEach(this::registerSubscriber);    }}public class RedisUtil {    public static <T> void publish(String topic, T message, Consumer<T> consumer) {        publish(topic, message);        consumer.accept(message);    }}

以下是目前的调用方法

@Componentpublic class MySubscriber1 implements SubscriptionCustomizer<String> {    @Override    public Subscription<String> customize() {        return new Subscription<>("mySubscriber1", String.class, message -> {            System.out.println("message = "+ message + " from mySubscriber1");        });    }}@Componentpublic class MySubscriber2 implements SubscriptionCustomizer<String> {    @Override    public Subscription<String> customize() {        return new Subscription<>("mySubscriber2", String.class, message -> {            System.out.println("message = "+ message + " from mySubscriber2");        });    }}@Testpublic void test_redisson_subscribe(){    RedissonHelper.publish("mySubscriber1", "Hello Redis!");    RedissonHelper.publish("mySubscriber2", "Hello Redis!");}

共有1个答案

寿和通
2024-06-20

以下是一些建议,可以帮助您在 Spring Boot 中更好地封装 Redisson 的发布订阅功能:

  1. 创建一个专门的服务类

    • 定义一个服务类来处理与 Redisson 发布订阅相关的操作。
    • 在类中注入 Redisson 客户端实例。
  2. 定义接口

    • 为发布和订阅操作定义明确的接口方法,例如 publishMessagesubscribeToTopic 等。
  3. 异常处理

    • 在封装的方法中添加适当的异常处理,以处理可能出现的 Redisson 操作异常。
  4. 配置管理

    • 将 Redisson 的相关配置(如连接参数、线程池配置等)集中管理,可以通过配置文件或环境变量进行配置。
  5. 消息类型封装

    • 为发布和订阅的消息定义专门的类,以确保消息的结构清晰和类型安全。
  6. 异步处理

    • 如果可能,对于发布和订阅操作,可以考虑使用异步方式,以提高性能和响应性。
  7. 日志记录

    • 在关键操作处添加日志记录,以便于跟踪和调试发布订阅的流程。
  8. 单元测试

    • 为封装的服务类编写单元测试,确保其功能的正确性和稳定性。

以下是一个简单的示例服务类:

import org.redisson.api.RTopic;import org.redisson.api.RedissonClient;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.stereotype.Service;@Servicepublic class RedissonPubSubService {    @Autowired    private RedissonClient redissonClient;    public void publishMessage(String topic, String message) {        RTopic<String> rTopic = redissonClient.getTopic(topic);        rTopic.publish(message);    }    public void subscribeToTopic(String topic, Consumer<String> messageConsumer) {        RTopic<String> rTopic = redissonClient.getTopic(topic);        rTopic.addListener((charSequence, message) -> {            messageConsumer.accept(message);        });    }}

在上述示例中,publishMessage 方法用于发布消息,subscribeToTopic 方法用于订阅主题并处理接收到的消息。

这样的封装可以使 Redisson 的发布订阅功能在 Spring Boot 应用中更易于使用、管理和维护。

 类似资料:
  • 其实这一小节完全可以放到上一个小节,只是这里用了完全不同的玩法,所以我还是决定单拿出来分享一下这方面的小细节。 上一小节有关订阅部分的代码,请看: function _M.subscribe( self, channel ) local redis, err = redis_c:new() if not redis then return nil, err

  • 我使用Java创建Redis Pub/Sub,其中包含单个主题和单个侦听器,如thank: 这是我在MVCConfiguer中的bean: 这就是我接收消息的地方,请不要使用这个RedisMsghandler类来MvcConfigrer 我的主要目标是创建多个主题和多个听众,如RedisMsgHandler,请告诉我如何做。 我不喜欢创建大量在MessageListener上实现的类,也不喜欢为每

  • 问题内容: 我有一个项目,我们经常在其中将String转换为int。当出现问题时(例如,不是数字,而是字母,等等),此方法将引发异常。但是,如果我必须到处都处理代码中的异常,这很快就会变得非常难看。我想将其放在一个方法中,但是,我不知道如何返回一个干净的值以表明转换出错。 在C ++中,我可以创建一个方法,该方法接受一个指向int的指针,并让该方法本身返回true或false。但是,据我所知,这在

  • 问题内容: 当前,我正在使用node.js和redis来构建应用程序,使用redis的原因是由于发布/订阅功能。该应用程序只是在用户进入用户或不在房间时通知管理员。 由于我想听join和disjoin事件,我的问题是我是否应该使用两个redisclient来听这两个事件,例如 或者只是使用一个redisclient来监听和分离回调中的逻辑 我知道这两种方式都是可行的,但是我不知道人们在哪种情况下会

  • 简介 Redis 的列表类型键可以用来实现队列,并且支持阻塞式读取,所以 Redis 能够非常容易的实现一个高性能的优先队列。同时在更高层面上,Redis 还支持“发布/订阅”的消息模式,可以基于此构建一个聊天系统。 发布示例 发布(Publish)即将消息发布到频道中。示例代码: // 发送消息 Redis::publish('chan-1', 'Hello, World!'); // 发送消息

  • 当使用Spring Integration DSL builder模式时,它通常会“自动”填充元素之间所需的通道。然而,有时情况并非如此。 在高层次上,包装应用程序将元数据保存在数据库中,以便根据需要动态创建和销毁我们(可能)从未见过的跨平台流。因此,流不适合使用静态符号(如@Bean)实例化,而是必须动态创建和销毁,并在运行时在Spring上下文中注册/取消注册。 我有一个在动态创建的主流中使用