使用spring支持redis实现消息队列,参考官方样例:https://spring.io/guides/gs/messaging-redis/
实现后在运行过程中发现消费者在接收消息时会出现乱码的情况。经排查是由于序列化工具不同导致的。
生产者的配置
<bean id="redisTemplate" class="org.springframework.data.redis.core.StringRedisTemplate"> <property name="connectionFactory" ref="connectionFactory"/> <!-- 如果不配置Serializer,那么存储的时候只能使用String,如果用对象类型存储,那么会提示错误 can't cast to String!!!--> <property name="keySerializer"> <bean class="org.springframework.data.redis.serializer.StringRedisSerializer"/> </property> <property name="valueSerializer"> <bean class="org.springframework.data.redis.serializer.JdkSerializationRedisSerializer"/> </property> <!--开启事务--> <property name="enableTransactionSupport" value="true"/> </bean>
template默认是使用stringSerializer的,这里配置了JdkSerializationRedisSerializer来做一些对象的存储。
这就导致了消费端接受消息时反序列化会出现问题,解决方法可以在消费者配置监听器中注入生产者使用的序列化工具。
注意Serializer属性。
<bean id="listener" class="org.springframework.data.redis.listener.adapter.MessageListenerAdapter"> <constructor-arg index="0" ref= "receiver"/> <constructor-arg index="1" value="receive" /> <property name="serializer" > <bean class="org.springframework.data.redis.serializer.JdkSerializationRedisSerializer"/> </property> </bean>