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

配置环境

版本信息:

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提交事务慢,导致消息队列找不到刚提交到数据库的信息的问题。
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值