SpringBoot統合Redisメッセージ購読パブリケーション


文書ディレクトリ
  • SpringBoot統合Redisメッセージ購読発行
  • 1. pom.xmlファイル追加依存
  • 2. Redisメッセージ受信機
  • を作成する
  • 3. リスナーを登録し、メッセージを送信する
  • SpringBoot統合Redisメッセージ購読パブリケーション
    1. pom.xmlファイル依存性の追加
    
    	org.springframework.boot
    	spring-boot-starter
    
    
    	org.springframework.boot
    	spring-boot-starter-data-redis
    
    

    2.Redisメッセージ受信機の作成
    package cn.tyrone.springboot.redis.message;
    
    import java.util.concurrent.CountDownLatch;
    
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    import org.springframework.beans.factory.annotation.Autowired;
    
    public class Receiver {
    	private static final Logger LOGGER = LoggerFactory.getLogger(Receiver.class);
    
    	private CountDownLatch latch;
    
    	@Autowired
    	public Receiver(CountDownLatch latch) {
    		this.latch = latch;
    	}
    
    	public void receiveMessage(String message) {
    		LOGGER.info("Received ");
    		latch.countDown();
    	}
    }
    

    Receiverメッセージを受信する方法を定義するクラスです.このクラスをメッセージリスナーとして登録すると、メッセージ受信のメソッド名をカスタマイズできます.この例では、メッセージを受信する方法として「receiveMessage」を用いる.
    3.リスナーを登録し、メッセージを送信
    Spring Data Redisは、Redisを使用してメッセージを送信および受信するすべてのコンポーネントを提供します.以下の構成を行う必要があります.
  • Redis接続ファクトリ(A connection factory)
  • メッセージリスナーのコンテナ(A message listener container)
  • Redisテンプレート(A redis template)
  • Redis templateを使用してメッセージを送信し、Receiverクラスをメッセージリスナーとして登録してメッセージを受信できるようにします.Connection factoryは、Redisサービスへの接続を許可します.この例ではSpringBootのデフォルトのRedisConnectionFactoryを使用します.これはjedis Redisライブラリに基づくJedisConnectionFactoryの例です.メッセージリスナーとredisテンプレートに注入されます.
    SpringBoot起動クラスを作成し、この例に必要なオブジェクトインスタンスを注入します.
    package cn.tyrone.springboot.redis.message;
    
    import java.util.concurrent.CountDownLatch;
    
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    import org.springframework.context.ApplicationContext;
    import org.springframework.context.annotation.Bean;
    import org.springframework.data.redis.connection.RedisConnectionFactory;
    import org.springframework.data.redis.core.StringRedisTemplate;
    import org.springframework.data.redis.listener.PatternTopic;
    import org.springframework.data.redis.listener.RedisMessageListenerContainer;
    import org.springframework.data.redis.listener.adapter.MessageListenerAdapter;
    
    //https://spring.io/guides/gs/messaging-redis/
    
    @SpringBootApplication
    public class Application {
    	public static final Logger LOGGER = LoggerFactory.getLogger(Application.class);
    	
    	/*
    	 * Redis       
    	 *        RedisConnectionFactory      
    	 */
    	@Bean
    	RedisMessageListenerContainer container(RedisConnectionFactory connectionFactory, 
    			MessageListenerAdapter listenerAdapter){
    		RedisMessageListenerContainer container = new RedisMessageListenerContainer();
    		container.setConnectionFactory(connectionFactory);
    		container.addMessageListener(listenerAdapter, new PatternTopic("sprinboot-redis-messaage"));
    		return container;
    	}
    	
    	/*
    	 *  Receiver          ,          (receiveMessage)
    	 *             ,           Receiver  handleMessage             
    	 */
    	@Bean
    	MessageListenerAdapter listenerAdapter(Receiver receiver){
    		return new MessageListenerAdapter(receiver, "receiveMessage");
    	}
    	
    	/*
    	 * Receiver  
    	 */
    	@Bean
    	Receiver receiver(CountDownLatch latch){
    		return new Receiver(latch);
    	}
    	
    	@Bean
    	CountDownLatch latch(){
    		return new CountDownLatch(1);
    	}
    	
    	/*
    	 * Redis Template       
    	 */
    	@Bean
    	StringRedisTemplate template(RedisConnectionFactory connectionFactory){
    		return new StringRedisTemplate(connectionFactory);
    	}
    	
    	/*
    	 *     
    	 */
    	public static void main(String[] args) throws Exception {
    		ApplicationContext ctx = SpringApplication.run(Application.class, args);
    		
    		StringRedisTemplate template = ctx.getBean(StringRedisTemplate.class);
    //		CountDownLatch latch = ctx.getBean(CountDownLatch.class);
    		
    		LOGGER.info("Sending message......");
    		template.convertAndSend("sprinboot-redis-messaage", "Hello, SpringBoot redis message!!!!");
    //		latch.wait();
    		
    		System.exit(0);
    		
    	}
    	
    }
    
    

    この例ではCountDownLatch latchの目的がよく分からないが,テスト中にこのコードを付けると例外が投げ出されるが,メッセージの送信と受信は成功した.例外情報は次のとおりです.
    2017-07-20 10:14:50.909  INFO 7200 --- [           main] c.t.s.redis.message.Application          : Sending message......
    Exception in thread "main" java.lang.IllegalMonitorStateException
    	at java.lang.Object.wait(Native Method)
    	at java.lang.Object.wait(Object.java:502)
    	at cn.tyrone.springboot.redis.message.Application.main(Application.java:77)
    

    このコードを注釈すると、例外もメッセージを表示します.同時に、メッセージのパブリケーションと受信にも影響しません.CountDownLatchは同期の補助クラスにすぎず、テスト中、このクラスがテスト結果に役立つことは発見されなかった.
    参照リンク:https://spring.io/guides/gs/messaging-redis/ソースリンク:https://github.com/myNameIssls/springboot-study