Spring-redis:公開/購読を実現(親測有効、質問歓迎)


原理:Springとredisが統合されると、構成されたリスナーはプロジェクトをリスニングし、RedisTemplateというクラスのconvertAndSend(java.lang.String channel,java.lang.Object message)メソッドを呼び出すたびに、指定されたチャンネル(プロファイル内)のようにメッセージを送信し、このメッセージはリスナーにリスニングされ、サブスクリプションの発行機能を実現する.

一、maven依存のインポート


Spring統合redisでインポートするmaven依存性は、次の2つです.
        
            org.springframework.data
            spring-data-redis
            1.6.2.RELEASE
        
        
            redis.clients
            jedis
            2.8.2
        

二、redisプロファイルの新規作成、redisサーバ関連情報の構成


ファイル名:redis.properties
redis.host=localhost
redis.port=6379
redis.password=
redis.database=0
redis.timeout=1000
#session valid time
redis.maxInactiveIntervalInSeconds=1800

#redis pool config
redis.pool.maxTotal=300
redis.pool.maxIdle=5
redis.pool.minIdle=1
redis.pool.maxWaitMillis=6000
redis.pool.testWhileIdle=true
redis.testOnBorrow=true

三、新しいredisプロファイルredis-context.xmlファイル、redis関連構成情報の登録




    
    

    

    
    

    
    

    
        
        
        
    

    
    
        
        
        
        
        
        
        
    
    
    
        
        
        
        
        
    

    
    
    
    
    

    
    
    
    
        
        
        
    

    
    
        
        
        
    


四、spring-mvc.xml構成は次のとおりです。




    
    
    
    
    
    
    

    
    
        
        
        
    

    
    


五、web.xml構成は以下の通りです(実際の構成を参照)。



  
  
    contextConfigLocation
    classpath:spring-mybatis.xml
  

  
  
    encodingFilter
    org.springframework.web.filter.CharacterEncodingFilter
    true
    
      encoding
      UTF-8
    
  
  
    encodingFilter
    /*
  

  
  
    org.springframework.web.context.ContextLoaderListener
  
  
  
    org.springframework.web.util.IntrospectorCleanupListener
  

  
  
    SpringMVC
    org.springframework.web.servlet.DispatcherServlet
    
      contextConfigLocation
      classpath:spring-mvc.xml
    
    1
    true
  
  
    SpringMVC
    
    /
  

  
    /index.jsp
  


六、新しい情報を発表するクラス:発表したメッセージはnullにしてはいけなくて、さもなくばredisはsetメッセージの時にNull PointerExceptionを報告する

package xin.shenwan.redis;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Component;

/**
 * @author 12450
 */
@Component
public class SendMessage {

    @Autowired
    private RedisTemplate redisTemplate;

    /**
     *      redisTemplate    ,
     * @param channel          
     * @param message       
     */
    public synchronized void sendMessage(String channel, String message) {
        redisTemplate.convertAndSend(channel, message);
    }


}

七、redisのパブリケーションを傍受し、パブリケーション情報を取得するためのリスニングクラスを新規作成する(このクラスはredisリスニングインタフェースを実現する)


ここで注意したいのは、実際にどのシーケンス化方式が適切なのかを選択し、選択時にプロファイル内の関連構成も変更する必要があることです.
package xin.shenwan.redis;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.connection.Message;
import org.springframework.data.redis.connection.MessageListener;
import org.springframework.data.redis.serializer.JdkSerializationRedisSerializer;
import org.springframework.data.redis.serializer.RedisSerializer;
import xin.shenwan.socket.RsSocket;

/**
 * @author 12450
 */
public class DataSyncEventListener implements MessageListener {
    @Autowired
    private RedisSerializer stringRedisSerializer;
    @Autowired
    private JdkSerializationRedisSerializer jdkSerializationRedisSerializer;

    /**
     *     MessageListener   
     *
     * @param message
     * @param bytes
     */
    @Override
    public void onMessage(Message message, byte[] bytes) {
        String channel = stringRedisSerializer.deserialize(message.getChannel());
        Object object = stringRedisSerializer.deserialize(message.getBody());
        //  jdk       
        /*Object channel = jdkSerializationRedisSerializer.deserialize(message.getChannel());
        Object object = jdkSerializationRedisSerializer.deserialize(message.getBody());*/
        System.out.println("channel is :" + channel);
        //         
        String messageToUser = object.toString();
        System.out.println("message is :" + messageToUser);
    }
}

八、テストクラス

package xin.shenwan.controller;


import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import xin.shenwan.redis.SendMessage;

@Controller
@RequestMapping(value = "/test")
public class RedisTest {
    @Autowired
    SendMessage sendMessage;

    @RequestMapping(value = "/sendMsg")
    public void redis() {
        for (int i = 0; i < 10; i++) {
            sendMessage.sendMessage("channel1.0", " " + i + "     ");
        }
    }
}

プロジェクトアクセスリンクを起動し、コンソール出力を参照してください.
ただ基礎的な入門総括で、皆さんの改善意見を歓迎します.