以下是目前的代码,不知道是否可以有更好的写法封装优化以下代码,让调用者只关注逻辑实现就好。配置自动订阅所有的实现,当前代码是封装成一个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!");}
以下是一些建议,可以帮助您在 Spring Boot 中更好地封装 Redisson 的发布订阅功能:
创建一个专门的服务类
定义接口
publishMessage
和 subscribeToTopic
等。异常处理
配置管理
消息类型封装
异步处理
日志记录
单元测试
以下是一个简单的示例服务类:
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上下文中注册/取消注册。 我有一个在动态创建的主流中使用