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

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

@Data
public class Subscription<T> {
    private final String topic;
    private final Class<T> messageType;
    private final Consumer<T> consumer;
}

@FunctionalInterface
public interface SubscriptionCustomizer<T> {
    Subscription<T> customize();
}

@Component
public 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);
    }
}

以下是目前的调用方法

@Component
public class MySubscriber1 implements SubscriptionCustomizer<String> {

    @Override
    public Subscription<String> customize() {
        return new Subscription<>("mySubscriber1", String.class, message -> {
            System.out.println("message = "+ message + " from mySubscriber1");
        });
    }
}

@Component
public class MySubscriber2 implements SubscriptionCustomizer<String> {

    @Override
    public Subscription<String> customize() {
        return new Subscription<>("mySubscriber2", String.class, message -> {
            System.out.println("message = "+ message + " from mySubscriber2");
        });
    }
}

@Test
public void test_redisson_subscribe(){
    RedissonHelper.publish("mySubscriber1", "Hello Redis!");
    RedissonHelper.publish("mySubscriber2", "Hello Redis!");
}
阅读 1k
1 个回答

以下是一些建议,可以帮助您在 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;

@Service
public 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 应用中更易于使用、管理和维护。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏