Redis服务器可以实现简单的消息“发布/订阅”服务,下面对spring-redis实现做一个说明
spring-redis使用RedisMessageListenerContainer进行消息监听,客户程序需要自己实现MessageListener,并以指定的topic注册到RedisMessageListenerContainer,
这样,在指定的topic上如果有消息,RedisMessageListenerContainer便会通知该MessageListener。
下面是在spring配置文件中配置spring-redis:
<bean id="jedisPoolConfig" class="redis.clients.jedis.JedisPoolConfig">
<property name="maxTotal" value="600"></property>
<property name="maxIdle" value="300"></property>
<property name="minIdle" value="10"></property>
<property name="maxWaitMillis" value="2000"></property>
<property name="testOnBorrow" value="true"></property>
<property name="testOnReturn" value="true"></property>
</bean>
<bean id="jedisConnectionFactory" class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory">
<property name="hostName" value="127.0.0.1"/>
<property name="port" value="6379"/>
<property name="poolConfig" ref="jedisPoolConfig"></property>
<property name="timeout" value="5000"></property>
<property name="usePool" value="true"></property>
</bean>
<!-- Redis Template -->
<bean id="redisTemplate" class="org.springframework.data.redis.core.RedisTemplate">
<property name="connectionFactory" ref="jedisConnectionFactory"/>
</bean>
<bean id="redisMsgListener" class="my.test.listener.RedisMessageListener">
<property name="redisTemplate" ref="redisTemplate"/>
</bean>
上面例子中,最后两个bean的配置是实现发布/订阅服务的关键,RedisMessageListener是自己写的实现了org.springframework.data.redis.connection.MessageListener的业务类,
并以“topic123” 这个topic注册到RedisMessageListenerContainer。RedisMessageListenerContainer在消息到达后负责通知MessageListener。下面是RedisMessageListener的代码:
class RedisMessageListener implements MessageListener {
@Autowired
RedisTemplate redisTemplate;
RedisSerializer serializer
@Override
void onMessage(Message message, byte[] pattern) {
serializer = redisTemplate.getValueSerializer()
String messageStr = serializer.deserialize(message.body)
println("message received:" + messageStr)
}
}
这样,应用启动时,消息的订阅方(subscriber),就注册好了。这时候只要使用一个简单的程序,模拟publisher,向指定topic发布消息,RedisMessageListener就可以接收到消息,
spring-redis的写法是这样:
redisTemplate.convertAndSend("topic123","hello there!")