1. 程式人生 > >Spring Spring-data-redis 實現的訊息佇列

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提交事務慢,導致訊息佇列找不到剛提交到資料庫的資訊的問題。

相關推薦

第八篇:Spring Boot使用Redis實現訊息佇列

目前常用的訊息佇列大概有三種類型,RabbitMQ等AMQP系列, Kafka, Redis等key-value系列,它們的使用場景分別是: 1.RabbitMQ:相對重量級高併發的情況,比如資料的非同步處理,任務的序列執行等. 2.Kafka:基於Pull的模式來處理,具體

Spring+Redis實現訊息佇列

一、概述 針對Redis,我們知道有String、List、Hash、Set、sorted Set等資料結構,而List資料結構就是一個簡單的字串列表,我們可以向列表的首部或者尾部新增或者移除元素。並且當列表中沒有元素的時候會發生阻塞或者等待超時。因此我們就可以使用Redi

Spring Session Data Redis實現session共享

web.xml odi 數據庫 tails spool ima 配置步驟 配置文件 work 1.前言   在開發中遇到一個關於用戶體驗的問題,每次當運維進行更新重啟服務器時,都會導致會員平臺中已登錄的用戶掉線。這是因為每個用戶的會話信息及狀態都是由session來保存的,

spring-session-data-redis 實現session共享

1.新增依賴 <dependency>             <groupId>redis.clients</groupId>             <

Qt應用Redis實現訊息佇列

    類似BS模式,客戶端傳送任務請求給服務端,服務端將處理結果返回給客戶端。 redis負責訊息的儲存和轉發。 模擬病人掛號看病,Patient程序進行掛號,Doctor程序進行看病 ,程式程式碼如下: /////////////

springboot整合redis實現訊息佇列

在java中直接使用redis的時候,直接使用簡單的兩個指令lpush和rpop或者rpush和lpop就可以實現訊息佇列的操作。當與spring結合時,可以使用RedisTemplate和StringRedisTemplate;這兩個Template是spring封裝了對Redis的一些常用的

第 21 講 在Springboot使用Redis實現訊息佇列

第二十一講 在Springboot使用Redis實現訊息佇列 1.引入依賴:pom.xml <dependency> <groupId>org.springframew

SpringBoot中使用redis實現訊息佇列

在pom中加入redis依賴: <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-r

Redis實現訊息佇列

個人理解在專案中使用訊息佇列一般是有如下幾個原因:    把瞬間伺服器的請求處理換成非同步處理,緩解伺服器的壓力    實現資料順序排列獲取 ​redis實現訊息佇列步驟如下:1).redis函式rpush,lpop2).建議定時任務入佇列3)建立定時任務出佇列 檔案:dem

springboot使用redis實現訊息佇列

一、概念訊息佇列分為兩種模式,一種是釋出訂閱模式,一種是生產者消費者模式。生產者消費者模式:生產者生產訊息放到佇列裡,多個消費者同時監聽佇列,誰先搶到訊息誰就會從佇列中取走訊息;即對於每個訊息只能被最多一個消費者擁有。釋出者訂閱者模式:釋出者生產訊息放到佇列裡,多個監聽佇列的

PHP中利用redis實現訊息佇列處理高併發請求

將請求存入redis 為了模擬多個使用者的請求,使用一個for迴圈替代 //redis資料入隊操作 $redis = new Redis(); $redis->connect('127.0.0.1',6379); for($i=0;$i<50;$i++){

PHP中利用redis實現訊息佇列處理高併發請求--簡潔程式碼實現效果

將請求存入redis 為了模擬多個使用者的請求,使用一個for迴圈替代 //redis資料入隊操作 $redis = new Redis(); $redis->connect('127.0.

利用Redis 實現訊息佇列

1.用redis中的List可以實現佇列,這樣可以用來做訊息處理和任務排程的佇列 2.程式碼模擬 程式碼結構 生產者模擬程式 /**   *    */ package scheduleTest;   import java.util.Ra

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

Redisredis非同步訊息佇列+Spring自定義註解+AOP方式實現系統日誌持久化

說明:   SSM專案中的每一個請求都需要進行日誌記錄操作。一般操作做的思路是:使用springAOP思想,對指定的方法進行攔截。拼裝日誌資訊實體,然後持久化到資料庫中。可是仔細想一下會發現:每次的客戶端的每一次請求,伺服器都會處理兩件事情。一個是正常的業務操作;另一個就是我們額外要做的日誌資料記錄。這樣的

springboot2整合spring-session-data-redis實現session共享

1.新增Maven依賴 <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-pool2</artifactId>

spring-data-redis實現redis釋出訂閱

maven 依賴包 <properties> <spring.version>5.1.0.RELEASE</spring.version> </properties> <dependencies

spring整合rabbitmq實現訊息佇列

RabbitTemplate概念瞭解 RabbitMQ是由Erlang(愛立信公司)語言開發,實現Advanced Message Queuing Protocol (AMQP高階訊息佇列協議)的訊息中介軟體。訊息中介軟體主要用於元件之間的解耦,訊息的傳送者無需知道

spring整合kfka實現訊息佇列

1.搭建kafka執行環境 ,下載地址:http://kafka.apache.org/downloads 下載完修改安裝檔案config裡面的server.properties檔案,將listeners=PLAINTEXT://IP:9092改成伺服器的IP,修改

shiro+cas+spring-data-redis實現多系統單點登入和分散式專案的session同步

CSDN開通很久了,但是一直沒寫東西,2018年了,這是我CSDN的第一篇文章,歡迎各位評論探討和指點。   一、背景: 現在公司的業務系統要做多臺分散式叢集,由於是web專案,要做session同步,想到的方案是用目前火熱的redis資料庫儲存session,還有業