Spring-redis:公開/購読を実現(親測有効、質問歓迎)
原理:Springとredisが統合されると、構成されたリスナーはプロジェクトをリスニングし、RedisTemplateというクラスのconvertAndSend(java.lang.String channel,java.lang.Object message)メソッドを呼び出すたびに、指定されたチャンネル(プロファイル内)のようにメッセージを送信し、このメッセージはリスナーにリスニングされ、サブスクリプションの発行機能を実現する.
Spring統合redisでインポートするmaven依存性は、次の2つです.
ファイル名:redis.properties
ここで注意したいのは、実際にどのシーケンス化方式が適切なのかを選択し、選択時にプロファイル内の関連構成も変更する必要があることです.
プロジェクトアクセスリンクを起動し、コンソール出力を参照してください.
ただ基礎的な入門総括で、皆さんの改善意見を歓迎します.
一、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 + " ");
}
}
}
プロジェクトアクセスリンクを起動し、コンソール出力を参照してください.
ただ基礎的な入門総括で、皆さんの改善意見を歓迎します.