@Setter
public final class RedisUserLoginRegisterSubscribe extends JedisPubSub {
private static final Logger log = LoggerFactory.getLogger(REDIS_SUBPUB_LOGGER_NAME);
/**
* 訂閱處理
*/
private final static ExecutorService executorService = Executors.newFixedThreadPool(32);
/**
* Redis 連接池
*/
private JedisPool jedisPool;
/**
* 用戶註冊訂閱處理器
*/
private UserLoginRegisterSubscribeProcessor userRegisterSubscribeProcessor;
private boolean isSubscribe = true;
public void init() {
executorService.execute(() -> {
log.info("初始化用戶註冊訂閱...");
while (isSubscribe) {
try (Jedis jedis = jedisPool.getResource()) {
jedis.subscribe(this, USER_REGISTER_PUBSUB_CHANNEL);
} catch (Exception ex) {
log.error(ex.getMessage(),ex);
}
try {
Thread.sleep(500);
} catch (InterruptedException e) {
}
}
});
}
public void destroy() {
log.info("用戶註冊訂閱開始銷燬處理...");
if (!executorService.isShutdown()) {
executorService.shutdown();
}
log.info("用戶註冊訂閱銷燬處理成功...");
}
@Override
public void onMessage(String channel, String message) {
executorService.execute(() -> {
log.info("收到消息 channel:{}, message:{}", channel, message);
UserLoginRegisterMessage userRegisterMessage = JSONObject.parseObject(message, UserLoginRegisterMessage.class);
userRegisterMessage.setChannel(channel);
userRegisterSubscribeProcessor.process(userRegisterMessage);
});
}
@Override
public void onPUnsubscribe(String pattern, int subscribedChannels) {
isSubscribe = false;
}
@Override
public void onUnsubscribe(String channel, int subscribedChannels) {
isSubscribe = false;
}
}
訂閱處理接口
public interface UserLoginRegisterSubscribeProcessor {
/**
* 訂閱接受到用戶註冊消息的處理
*
* @param message {@link UserLoginRegisterMessage}
*/
void process(UserLoginRegisterMessage message);
}
redis發佈:
rs = jedis.publish(USER_REGISTER_PUBSUB_CHANNEL, JSON.toJSONString(userRegisterMessage));
訂閱:
* <bean id="userRegisterSubscribeProcessor" class="...實現類"/>
*
* <bean id="redisUserRegisterSubscribe" init-method="init" destroy-method="destroy"
* class="com.***.usercore.sdk.pubsub.RedisUserLoginRegisterSubscribe">
* <property name="jedisPool" ref="jedisPool"/>
* <property name="userRegisterSubscribeProcessor" ref="userRegisterSubscribeProcessor"/>
* </bean>