Dubbox+Redis3.0+Spring+Hibernate+zookeeper实现消息推送核心搭建

阅读更多

这里在开始搭建环境之前请搭建先熟悉了解Dubbox、Redis、Zookeeper.... 并且安装Redis、Zookeeper

     下面进入主题首先我们需要下载Dubbox相关代码链接地址:https://github.com/dangdangdotcom/dubbox这里使用Eclipse git工具下载源代码 这里我们具体使用的是 dubbo-demo-provider这个项目 就是服务提供者 这个项目是maven项目在构建war包的时候需要依赖 dubbo、dubbo-demo-api(这个api项目为什么需要依赖我还没找到原因有朋友知道请告知) 好了 我们来编译dubbo-demo-provider这个项目 主要最好把这个项目单独拷出来引入Eclipse工程中 加入我们已经安装maven环境 。首先进入cmd  到项目所在路径下 比如我的:G:\WokerSpace\dubbo-demo-provider   然后 mvn clean compile 然后 mvn clean install  如果项目没有错误会直接打包成war既可以放到tomcat下部署 注意:tomcat环境需要搭建好。当然我们也可以通过Eclipse来编译和安装 。这里Eclipse还提供直接运行maven项目到 tomcat 右击项目 run as   Run on Server或者 Debug  on Server 启动项目这样启动项目好处是可以断点调试。当然我们需要安装Zookeeper 具体安装参照:http://blog.csdn.net/laoge121/article/details/16359637 这篇文章讲述了Zookeeper  dubbox 、spring集成重点看Zookeeper  安装

    集成Spring 、Hibernate

        首先在WEB-INF下面新建 

               appConfig.properties 配置如下 是jdbc和redis相关配置

              ########################\u6570\u636E\u5E93\u8FDE\u63A5\u4FE1\u606F#############

jdbc.username = root

jdbc.password = 123456

jdbc.url = jdbc:mysql://localhost:3306/tcwyonline?useUnicode=true&characterEncoding=UTF-8

jdbc.driver = com.mysql.jdbc.Driver

 

#\u6700\u5927\u5206\u914D\u7684\u5BF9\u8C61\u6570  

redis.pool.maxActive=1024

#\u6700\u5927\u80FD\u591F\u4FDD\u6301idel\u72B6\u6001\u7684\u5BF9\u8C61\u6570  

redis.pool.maxIdle=200

#\u5F53\u6C60\u5185\u6CA1\u6709\u8FD4\u56DE\u5BF9\u8C61\u65F6\uFF0C\u6700\u5927\u7B49\u5F85\u65F6\u95F4  

redis.pool.maxWait=1000

#\u5F53\u8C03\u7528borrow Object\u65B9\u6CD5\u65F6\uFF0C\u662F\u5426\u8FDB\u884C\u6709\u6548\u6027\u68C0\u67E5  

redis.pool.testOnBorrow=true

  

#IP  

redis.ip=192.168.1.195

#Port  

redis.port=6379

 

    applicationContext.xml配置如下 相关配置用途已加以说明

 

    

    xmlns="http://www.springframework.org/schema/beans" xmlns:aop="http://www.springframework.org/schema/aop"

    xmlns:context="http://www.springframework.org/schema/context" xmlns:tx="http://www.springframework.org/schema/tx"

    xmlns:cache="http://www.springframework.org/schema/cache" xmlns:p="http://www.springframework.org/schema/p"

    xsi:schemaLocation="http://www.springframework.org/schema/beans 

       http://www.springframework.org/schema/beans/spring-beans-4.0.xsd

       http://www.springframework.org/schema/aop

       http://www.springframework.org/schema/aop/spring-aop-4.0.xsd

       http://www.springframework.org/schema/context

       http://www.springframework.org/schema/context/spring-context-4.0.xsd

       http://www.springframework.org/schema/tx

       http://www.springframework.org/schema/tx/spring-tx-4.0.xsd

       http://www.springframework.org/schema/cache http://www.springframework.org/schema/cache/spring-cache-4.0.xsd">

   

      

   

    

   

   

        destroy-method="close">

       

       

       

       

       

       

       

       

       

       

   

 

   

   

        class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">

       

       

 

       

       

           

               

                hibernate.dialect=org.hibernate.dialect.MySQLDialect

               

                hibernate.hbm2ddl.auto=update

               

                hibernate.show_sql=true

               

                hibernate.format_sql=true

               

                hibernate.cache.use_second_level_cache=false

               

                hibernate.cache.use_query_cache=false

               

                hibernate.jdbc.fetch_size=50

               

                hibernate.jdbc.batch_size=50

               

                hibernate.connection.autocommit=true

               

                hibernate.connection.release_mode=auto

               

                hibernate.current_session_context_class=org.springframework.orm.hibernate4.SpringSessionContext

               

                javax.persistence.validation.mode=none

           

       

       

       

   

   

   

        class="org.springframework.orm.hibernate4.HibernateTransactionManager">

       

   

    

   

     

    

   

   

    

   

       

           

           

           

           

           

           

           

           

           

           

           

       

   

 

   

   

       

       

   

       

     

    

    

    

   

     

   

 

     

 

 

 

 

 

 

 

 

*/5 * * * * ?      

      

 

 

  

 

 

 

  

 

id="jedisPoolConfig"

class="redis.clients.jedis.JedisPoolConfig">

 

id="jedisConnectionFactory"

class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory">

name="hostName"

value="${redis.ip}" />

name="port"

value="${redis.port}" />

name="poolConfig"

ref="jedisPoolConfig" />

       

   

    

       

         

      

    

 

   

 

 

 项目的pom.xml redis相关依赖如下:

   

org.springframework.data

spring-data-redis

1.6.2.RELEASE

org.springframework.data

spring-data-jpa

1.6.2.RELEASE

org.springframework.data

spring-data-mongodb

1.8.2.RELEASE

org.springframework.data

spring-data-hadoop

0.9.0.RELEASE

   org.apache.commons

   commons-pool2

   2.2

       redis.clients

       jedis

       2.5.2

       jar

       compile

   

 

   下面我们来构建provider相关配置

        在META-INF下面新建 Spring文件夹 下面就放我们的provider配置文件比如我创建两个文件

               dubbo-demo-provider.xml  项目自带

               dubbo-message-provider.xml  消息推送

                消息推送配置如下:

                

                      

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"

xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd

http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd">

   

 

    

           

     下面就是怎样编写消息提供者服务接口  具体可以参照 http://blog.csdn.net/laoge121/article/details/16359637 这里就不在一一贴出代码

     在我的消息推送系统中我是这样实现大致流程

      项目中定义一个监听器当项目启动的时候就开始执行从redis获取消息然后推送(各种场景消息推送) 这个监听里面使用了spring 线程池  然后通过spring的定时任务 每个5秒钟就从数据库中获取一定量消息放入到redis中 这样就构成了一个完整的生产者和消费者流程。

     Redis实现消息队列和堆载 这里都是基于对象操作

      package com.tcwy.utils;

 

import java.util.List;

 

import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.data.redis.core.RedisTemplate;

import org.springframework.data.redis.core.StringRedisTemplate;

import org.springframework.stereotype.Component;

 

//redis操作类

@Component("redisList")  

public class RedisList {

 

@Autowired  

protected RedisTemplate redisTemplate;  

 

/** 

     * 压栈 

     *  

     * @param key 

     * @param value 

     * @return 

     */  

    public Long push(Object key, Object value) {  

        return redisTemplate.opsForList().leftPush(key, value);  

    }  

  

    /** 

     * 出栈 

     *  

     * @param key 

     * @return 

     */  

    public Object pop(Object key) {  

        return redisTemplate.opsForList().leftPop(key);  

    }  

  

    /** 

     * 入队 

     *  

     * @param key 

     * @param value 

     * @return 

     */  

    public Long in(Object key, Object value) {  

 

    return redisTemplate.opsForList().rightPush(key, value);

    }  

  

    /** 

     * 出队 

     *  

     * @param key 

     * @return 

     */  

    public Object out(Object key) {  

        return redisTemplate.opsForList().leftPop(key);  

    }  

  

    /** 

     * 栈/队列长 

     *  

     * @param key 

     * @return 

     */  

    public Long length(Object key) {  

        return redisTemplate.opsForList().size(key);  

    }  

  

    /** 

     * 范围检索 

     *  

     * @param key 

     * @param start 

     * @param end 

     * @return 

     */  

    public List range(Object key, int start, int end) {  

        return redisTemplate.opsForList().range(key, start, end);  

    }  

  

    /** 

     * 移除 

     *  

     * @param key 

     * @param i 

     * @param value 

     */  

    public void remove(Object key, long i, Object value) {  

    redisTemplate.opsForList().remove(key, i, value);  

    }  

  

    /** 

     * 检索 

     *  

     * @param key 

     * @param index 

     * @return 

     */  

    public Object index(Object key, long index) {  

        return redisTemplate.opsForList().index(key, index);  

    }  

  

    /** 

     * 置值 

     *  

     * @param key 

     * @param index 

     * @param value 

     */  

    public void set(Object key, long index, Object value) {  

    redisTemplate.opsForList().set(key, index, value);  

    }  

  

    /** 

     * 裁剪 

     *  

     * @param key 

     * @param start 

     * @param end 

     */  

    public void trim(Object key, long start, int end) {  

    redisTemplate.opsForList().trim(key, start, end);  

    } 

 

}

下面是应用层使用 Redis工具类

   package com.tcwy.utils;

 

import java.util.List;

 

import javax.transaction.Transactional;

 

import org.hibernate.Query;

import org.hibernate.Session;

import org.hibernate.Transaction;

import org.slf4j.Logger;

import org.slf4j.LoggerFactory;

import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.stereotype.Component;

 

import com.tcwy.po.message.Message;

import com.tcwy.service.basedao.BaseDao;

 

//工具类

@Component("redisUtils")  

public class RedisUtils extends BaseDao{

 

private static Logger logger = LoggerFactory.getLogger(RedisUtils.class);

 

@Autowired

protected RedisList redisList;

 

public RedisList getRedisList() {

return redisList;

}

 

public void setRedisList(RedisList redisList) {

this.redisList = redisList;

}

 

//写入 队列

@SuppressWarnings("unchecked")

@Transactional

public void inqueue(String queueName,List list) throws Exception{

 

for(Message message:list){

logger.debug("消息入队列:"+message.getTarget());

redisList.in(queueName,message);

//修改消息状态

message.setRedisstatus(1);

}

if(list!=null&&list.size()>0){

//批量更新

String updateSql = "update Message set redisstatus = 1 where id = :id";

 

Session session=getHibernateTemplate().getSessionFactory().openSession();

Transaction transaction=session.beginTransaction();

 

Query query=null;

 

for(int i=0;i

query=session.createQuery(updateSql);

query.setParameter("id", list.get(i).getId());

query.executeUpdate();

}

transaction.commit();

}

 

}

 

//出列

@SuppressWarnings("unchecked")

public Message outqueue(String queueName)throws Exception{

 

Message message=(Message)redisList.out(queueName);

if(message!=null)logger.debug("消息出队列:"+message.getTarget());

 

return message;

}

 

}

好了差不多了 下面附近我把代码上传 实在不好描述呀!_!  当然在实际应用中 zookeeper 和Redis需要避免单点问题。。。

  • dubbo-demo-provider.zip (53.9 KB)
  • 下载次数: 244

你可能感兴趣的:(dubbox,zookeeper,Redis,消息推送系统)