这里在开始搭建环境之前请搭建先熟悉了解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"> 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相关依赖如下:
下面我们来构建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
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
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需要避免单点问题。。。