spring-redis实现消息生产者发布和消费者订阅

本文介绍了一种使用Redis作为消息队列的配置方法,包括连接池、哨兵配置及消息生产和消费的具体实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前提是你已经有一个可运行的redis的demo,直接上核心redis配置文件:

<!-- redis服务配置 开始-->
<bean class="redis.clients.jedis.JedisPoolConfig" id="poolConfig">
    <property name="maxTotal" value="${redis.maxTotal}">
    <property name="minIdle" value="${redis.minIdle}">
    <property name="maxWaitMillis" value="${redis.maxWaitTime}">
    <property name="maxIdle" value="${redis.maxIdle}">
    <property name="testOnBorrow" value="${redis.testOnBorrow}">
    <property name="testOnReturn" value="true">
    <property name="testWhileIdle" value="true">
</bean>
 
<bean class="org.springframework.data.redis.connection.RedisSentinelConfiguration" id="sentinelConfiguration">
    <property name="master">
        <bean class="org.springframework.data.redis.connection.RedisNode">
            <property name="name" value="${redis.sentinel.masterName}"></property>
        </bean>
    </property>
    <property name="sentinels">
        <set>
            <bean class="org.springframework.data.redis.connection.RedisNode">
                <constructor-arg name="host" value="${redis.sentinel1.host}"></constructor-arg>
                <constructor-arg name="port" value="${redis.sentinel1.port}"></constructor-arg>
            </bean>
            <bean class="org.springframework.data.redis.connection.RedisNode">
                <constructor-arg name="host" value="${redis.sentinel2.host}"></constructor-arg>
                <constructor-arg name="port" value="${redis.sentinel2.port}"></constructor-arg>
            </bean>
            <bean class="org.springframework.data.redis.connection.RedisNode">
                <constructor-arg name="host" value="${redis.sentinel3.host}"></constructor-arg>
                <constructor-arg name="port" value="${redis.sentinel3.port}"></constructor-arg>
            </bean>
        </set>
    </property>
</bean>
 
<bean class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory" id="connectionFactory" p:password="${redis.sentinel.password}">
    <constructor-arg name="sentinelConfig" ref="sentinelConfiguration"></constructor-arg>
    <constructor-arg name="poolConfig" ref="poolConfig"></constructor-arg>
    <property name="database" value="${redis.database}">
</property></bean>
 
<bean class="org.springframework.data.redis.core.RedisTemplate" id="redisTemplate">
    <property name="connectionFactory" ref="connectionFactory">
</property></bean>
 
<bean class="com.hthl.xxtd.service.redis.RedisService" id="redisService">
    <property name="redisTemplate" ref="redisTemplate"></property>
</bean>
 
<!-- 对象序列化方式 -->    
<bean class="org.springframework.data.redis.serializer.JdkSerializationRedisSerializer" id="jdkSerializer">    
 
<!-- 配置监听器,redis在订阅消息时,会根据 redis:listener标签指定的方法名和通道(topic)调用不同的方法-->  
<bean class="com.hthl.xxtd.web.listen.RedisMessageListenerContainer" id="redisMsgListener">  
 
<redis:listener-container connection-factory="connectionFactory">  
    <!--  topic代表监听的通道,是一个正则匹配 -->  
    <redis:listener method="sendEmail" ref="redisMsgListener" serializer="jdkSerializer" topic="hthl_email">
</redis:listener></redis:listener-container> 
<!-- redis服务配置 结束 -->
</bean>
</bean>
消息生产者:

import java.io.Serializable;
 
import org.springframework.data.redis.core.RedisTemplate;
 
import com.hthl.xxtd.model.email.EmailRecord;
 
/**
 *
 * @see    
 * @date
 * @version  
 * @desc    消息发布者
 */
public class RedisService {
     
    private RedisTemplate<serializable, serializable=""> redisTemplate;
     
    /**
     * 发布者:发送邮件
     * */
    public void sendEmail(EmailRecord emailRecord){
        redisTemplate.convertAndSend("hthl_email",emailRecord);
    }
}
消费者:

import javax.annotation.Resource;
 
import org.apache.log4j.Logger;
 
import com.hthl.xxtd.model.email.EmailRecord;
import com.hthl.xxtd.service.email.EmailChannelService;
 
import net.sf.json.JSONObject;
/**
 * 订阅者
 * */
public class RedisMessageListenerContainer{
    private static final Logger logger = Logger.getLogger(RedisMessageListenerContainer.class);
    @Resource
    private EmailChannelService emailChannelService;
 
    //发送邮件
    public void sendEmail(EmailRecord  emailRecord, String channel) {
	//do something
        logger.info("订阅者"+channel+"收到邮件:"+ JSONObject.fromObject(emailRecord).toString());
    }
 
}
扩展:这里可设置多个频道,,消费者亦可根据不同channel筛选订阅



评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值