redis消息发布与订阅

一、spring boot+maven环境:

1.pom.xml:

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</artifactId>
        </dependency>

2.application.properties:

    # database name
    spring.redis.database=9
    # server host1
    spring.redis.host=#####
    # server password
    spring.redis.password=#####
    #connection port
    spring.redis.port=#####
    # pool settings ...
    spring.redis.pool.max-idle=100
    spring.redis.pool.min-idle=0
    spring.redis.pool.max-active=300
    spring.redis.pool.max-wait=1000

3.消息发布:

@SpringBootApplication
public class Application extends SpringBootServletInitializer{
    
     @Bean
     StringRedisTemplate template(RedisConnectionFactory connectionFactory) {
            return new StringRedisTemplate(connectionFactory);
     }
     
    /** 
     * 启动入口
     * May 9, 2017
     */
    public static void main(String[] args) {
        ApplicationContext ctx = SpringApplication.run(Application.class, args);
        
        StringRedisTemplate template = ctx.getBean(StringRedisTemplate.class);
        // 组装数据
        JSONObject data = new JSONObject();
        data.put("content", "本地测试");
        // 推送消息(sync_message为发送的消息通道)
        template.convertAndSend("sync_message", data.toString()); 
        System.out.println("  消息 发送完毕   "); 
    }
}

4.监听器(订阅者)配置:

@Configuration
public class RedisConfig {
   
    @Bean
    RedisMessageListenerContainer container(RedisConnectionFactory connectionFactory,
                                            MessageListenerAdapter listenerAdapter) {

        RedisMessageListenerContainer container = new RedisMessageListenerContainer();
        container.setConnectionFactory(connectionFactory);
        //订阅了一个叫 sync_message  的通道
        container.addMessageListener(listenerAdapter, new PatternTopic("sdk_sync_message"));
        //这个container 可以添加多个 messageListener
        return container;
    }

    @Bean
    MessageListenerAdapter listenerAdapter(MessageReceiver receiver) {
        //这个地方 是给messageListenerAdapter 传入一个消息接受的处理器,利用反射的方法调用“receiveMessage”
        return new MessageListenerAdapter(receiver, "receiveMessage");
    }
}

5.处理订阅的信息:

@Component
public class MessageReceiver {
     /**接收消息的方法*/
    public void receiveMessage(String message){
        System.out.println(" 接收消息  ==================" + message);
    }
}

二、没有使用spring boot的maven环境:

1.pom.xml:

    <!-- redis -->
        <dependency>
          <groupId>redis.clients</groupId>
          <artifactId>jedis</artifactId>
          <version>2.9.0</version>
        </dependency>
        <dependency>
          <groupId>org.springframework.data</groupId>
          <artifactId>spring-data-redis</artifactId>
          <version>1.8.8.RELEASE</version>
        </dependency>

2.redis.properties:

    redis.host=####
    redis.port=####
    redis.pass=####
    redis.timeout=5000
    redis.maxActive=300
    redis.maxIdle=100
    redis.maxWait=1000
    redis.testOnBorrow=true
    redis.default.db=9

3.applicationContext.xml(订阅者配置):

<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
        <property name="locations">
            <list>
                <value>classpath:redis.properties</value>
            </list>
        </property>
    </bean>

<!-- jedis pool配置 -->
    <bean id="jedisPoolConfig" class="redis.clients.jedis.JedisPoolConfig">
        <property name="maxTotal"       value="${redis.maxActive}" />  
        <property name="maxIdle"        value="${redis.maxIdle}" />  
        <property name="maxWaitMillis"  value="${redis.maxWait}" />  
        <property name="testOnBorrow"   value="${redis.testOnBorrow}" /> 
    </bean>
    <!-- spring data redis -->
<bean id="jedisConnectionFactory" class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory">
        <property name="usePool"   value="true"></property>  
        <property name="hostName"  value="${redis.host}" />  
        <property name="port"      value="${redis.port}" />  
        <property name="password"  value="${redis.pass}" />  
        <property name="timeout"   value="${redis.timeout}" />  
        <property name="database"  value="${redis.default.db}" />
        <constructor-arg index="0" ref="jedisPoolConfig" />  
    </bean>
<bean id="stringRedisTemplate" class="org.springframework.data.redis.core.StringRedisTemplate">  
        <property name="connectionFactory"   ref="jedisConnectionFactory" />  
    </bean> 
    <!-- 定义redis监听类 -->
    <bean id="sdkListener" class="com.jf.service.api.sdkMessage.SdkRedisMessageHandler" />

    <!-- 定义redis监听器 -->
    <redis:listener-container connection-factory="jedisConnectionFactory">
        <!-- the method attribute can be skipped as the default method name is "handleMessage" -->
            <!-- topic代表监听的通道,是一个正规匹配 -->
        <redis:listener ref="sdkListener" method="sdkMessage" topic="sync_message" />
    </redis:listener-container>

4.SdkRedisMessageHandler.java(处理订阅的信息)

@Component
public class SdkRedisMessageHandler {

    public void sdkMessage(String message) {
        System.out.println(" 公会助手接收sdk的redis消息  ==================" + message);
    }

}

猜你喜欢

转载自my.oschina.net/u/3409876/blog/1570564