Spring Spring-data-redis 实现的消息队列

来源:互联网 发布:在线学编程的网站 编辑:程序博客网 时间:2024/05/29 10:53

配置环境

版本信息:

Spring 4.2.8.RELEASE(其中囊括tx、webmvc、context、aop之类的)
Spring-data-jpa 1.10.5.RELEASE
Spring-data-redis 1.8.0.RELEASE
Spring-data-commons 1.12.5.RELEASE
MySQL 5.7
JDK 1.8

Maven依赖:

<!-- spring begin -->        <dependency>            <groupId>org.springframework</groupId>            <artifactId>spring-webmvc</artifactId>            <version>4.2.8.RELEASE</version>        </dependency>        <dependency>            <groupId>org.springframework</groupId>            <artifactId>spring-aop</artifactId>            <version>4.2.8.RELEASE</version>        </dependency><dependency>            <groupId>org.springframework</groupId>            <artifactId>spring-jms</artifactId>            <version>4.2.8.RELEASE</version>        </dependency>        <dependency>            <groupId>org.aspectj</groupId>            <artifactId>aspectjrt</artifactId>            <version>1.8.9</version>        </dependency>        <dependency>            <groupId>org.springframework.data</groupId>            <artifactId>spring-data-jpa</artifactId>            <version>1.10.5.RELEASE</version>        </dependency>        <!-- spring end -->        <!-- redis start-->        <dependency>            <groupId>org.springframework.data</groupId>            <artifactId>spring-data-redis</artifactId>            <version>1.8.0.RELEASE</version>        </dependency>        <dependency>            <groupId>redis.clients</groupId>            <artifactId>jedis</artifactId>            <version>2.9.0</version>        </dependency>        <!--redis end-->

ApplicationContext.xml 配置

这里就只添加 Redis 相关的信息了。

<!-- 事务管理器 -->    <bean id="MytransactionManager"          class="org.springframework.orm.jpa.JpaTransactionManager">        <property name="entityManagerFactory" ref="MyentityManagerFactory" />        <property name="dataSource" ref="MydataSource"/>    </bean>    <!-- 注解式事务 -->    <tx:annotation-driven transaction-manager="MytransactionManager" />    <!--MessageQueue Start-->    <bean id="MQConnectionFactory" class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory"          p:hostName="127.0.0.1" p:port="6379" p:password="password" p:usePool="true">    </bean>    <bean id="redisTemplate" class="org.springframework.data.redis.core.RedisTemplate"          p:connectionFactory-ref="MQConnectionFactory"/>    <!--JDK序列化工具-->    <bean id="Serialization" class="org.springframework.data.redis.serializer.JdkSerializationRedisSerializer" />    <!--文本序列化工具-->    <bean id="Stringserialization" class="org.springframework.data.redis.serializer.StringRedisSerializer" />    <!--订阅者-->    <bean id="Listener" class="com.MuNineyi.messagequeue.Listener"/>    <!--订阅者适配器-->    <bean id="MessageListenerAdapter" class="org.springframework.data.redis.listener.adapter.MessageListenerAdapter">        <property name="serializer" ref="Serialization" />        <property name="stringSerializer" ref="Stringserialization"/>        <property name="delegate" ref="Listener" /> <!--订阅者/目的地-->        <property name="defaultListenerMethod" value="receiveMessage"/> <!--默认接收方法-->    </bean>    <!--channelPattern 通道设置器,这里和老版本是不同的-->    <bean id="Topic" class="org.springframework.data.redis.listener.PatternTopic" beans:pattern="identity"/>    <!--装箱,这里和老版本是不同的-->    <bean id="RedisMessageListenerContainer" class="org.springframework.data.redis.listener.RedisMessageListenerContainer">        <property name="connectionFactory" ref="MQConnectionFactory"/>        <property name="topicSerializer" ref="Stringserialization"/> <!--通道序列化-->        <property name="messageListeners">            <map key-type="org.springframework.data.redis.connection.MessageListener" value-type="org.springframework.data.redis.listener.PatternTopic">                <entry key-ref="MessageListenerAdapter"  value-ref="Topic"/>            </map>        </property>    </bean>    <!--MessageQueue End-->

代码实现

消息传递类(消息实体)

public class Message{    private String name;    private String age;    private String liveCity;    //相关的 get、set 方法}

Sender 发送者

这里可以写成接口的形式,方便调用

@Service("Service")public class Sender{    @Qualifier(value = "redisTemplate")    private RedisTemplate redisTemplate;    public void sendMessage(String channel, Serializable message) {        redisTemplate.convertAndSend(channel, message);    }    public RedisTemplate getRedisTemplate() {        return redisTemplate;    }    public void setRedisTemplate(RedisTemplate redisTemplate) {        this.redisTemplate = redisTemplate;    }    public void getInformationFromOtherAPI(String name, String age, String liveCity) throws InterruptedException {        Message message = new Message();        message.setName(name);        message.setAge(age);        message.setLiveCity(liveCity);        sendMessage("identity ", message);    }}

Listener 订阅者

@Service("Listener")public class Listener{    @Autowired    private MiddleService middleService;    /**     * 订阅者     * @param message     */    public void receiveMessage(Serializable message) {       if (message instanceof Message){           Message message = (Message) message;        System.out.println(message.getName()+message.getAge()+message.getLiveCity());       }    }}

简单的代码实现已经完成了

调用 getInformationFromOtherAPI(), 就可以实现将信息填入消息队列中。

下一篇会说一下由于JPA提交事务慢,导致消息队列找不到刚提交到数据库的信息的问题。

原创粉丝点击