`
ssxxjjii
  • 浏览: 948453 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

netty里集成spring注入jedis

 
阅读更多

Jedis是官方推荐的连接redius的客户端,之所以没有使用redisjdbc的原因是:

1) redisjdbcset方法有问题,set字符串,但是取出来的却是字符串长度

2)redisjdbc的性能低并且不稳定,网上有人做测试证明过。

1.准备好需要的jar

 

  1. spring.jar            //spring包  
  2. netty-3.2.4.Final.jar   // netty库  
  3. commons-dbcp.jar    // dbcp数据库连接池  
  4. mysql-connector-java-5.1.6.jar // dbcp数据库连接池需要依赖  
  5. commons-logging.jar  //spring.jar需要依赖  
  6. commons-pool.jar   // dbcp数据库连接池需要依赖  
  7. jedis-2.0.0.jar  //jedis包  

2.新建java工程TestNettyServer并添加spring

详情见《netty里集成spring注入mysq连接池

3.注入jedis

 

3.1构建访问redis通用类

RedisUtil.java里加入

 

  1. import redis.clients.jedis.ShardedJedis;  
  2. import redis.clients.jedis.ShardedJedisPool;  
  3.  
  4.  
  5. /**  
  6.  * 连接和使用数据库资源的工具类  
  7.  *   
  8.  * @author yifangyou  
  9.  * @version IAM 2011-07-27  
  10.  */ 
  11. public class RedisUtil {  
  12.  
  13.     /**  
  14.      * 数据源  
  15.      */ 
  16.     private ShardedJedisPool shardedJedisPool;  
  17.       
  18.     
  19.       
  20.     /**  
  21.      * 获取数据库连接  
  22.      * @return conn  
  23.      */ 
  24.     public ShardedJedis getConnection() {  
  25.         ShardedJedis jedis=null;  
  26.         try {  
  27.             jedis=shardedJedisPool.getResource();  
  28.         } catch (Exception e) {  
  29.             e.printStackTrace();  
  30.         }  
  31.         return jedis;  
  32.     }  
  33.       
  34.     /**  
  35.      * 关闭数据库连接  
  36.      * @param conn  
  37.      */ 
  38.     public void closeConnection(ShardedJedis jedis) {  
  39.         if (null != jedis) {  
  40.             try {  
  41.                 shardedJedisPool.returnResource(jedis);  
  42.             } catch (Exception e) {  
  43.                 e.printStackTrace();  
  44.             }  
  45.         }  
  46.     }  
  47.  
  48.     /**  
  49.      * 设置数据  
  50.      * @param conn  
  51.      */ 
  52.     public boolean setData(String key,String value) {  
  53.             try {  
  54.                 ShardedJedis jedis=shardedJedisPool.getResource();  
  55.                 jedis.set(key,value);  
  56.                 shardedJedisPool.returnResource(jedis);  
  57.                 return true;  
  58.             } catch (Exception e) {  
  59.                 e.printStackTrace();  
  60.                   
  61.             }  
  62.         return false;  
  63.     }  
  64.       
  65.     /**  
  66.      * 获取数据  
  67.      * @param conn  
  68.      */ 
  69.     public String getData(String key) {  
  70.         String value=null;  
  71.             try {  
  72.                 ShardedJedis jedis=shardedJedisPool.getResource();  
  73.                 value=jedis.get(key);  
  74.                 shardedJedisPool.returnResource(jedis);  
  75.                 return value;  
  76.             } catch (Exception e) {  
  77.                 e.printStackTrace();  
  78.                   
  79.             }  
  80.         return value;  
  81.     }  
  82.       
  83.     /**  
  84.      * 设置连接池  
  85.      * @return 数据源  
  86.      */ 
  87.     public void setShardedJedisPool(ShardedJedisPool shardedJedisPool) {  
  88.         this.shardedJedisPool = shardedJedisPool;  
  89.     }  
  90.  
  91.     /**  
  92.      * 获取连接池  
  93.      * @return 数据源  
  94.      */ 
  95.     public ShardedJedisPool getShardedJedisPool() {  
  96.         return shardedJedisPool;  
  97.     }     
  98. }  

3.2HttpRequestHandler注入jedis

applicationContext.xml里加入

 

  1.  <!-- POOL配置 --> 
  2. <bean id="jedisPoolConfig" class="redis.clients.jedis.JedisPoolConfig"> 
  3.     <property name="maxActive"  value="20" /> 
  4.     <property name="maxIdle" value="10" /> 
  5.     <property name="maxWait" value="1000" /> 
  6.     <property name="testOnBorrow"  value="true"/> 
  7. </bean> 
  8.  
  9. <!-- jedis shard信息配置 --> 
  10. <bean id="jedis.shardInfo" class="redis.clients.jedis.JedisShardInfo"> 
  11.     <constructor-arg index="0" value="122.49.26.60" /> 
  12.     <constructor-arg index="1" value="6379" /> 
  13. </bean> 
  14.  
  15. <!-- jedis shard pool配置 --> 
  16. <bean id="shardedJedisPool" class="redis.clients.jedis.ShardedJedisPool"> 
  17.     <constructor-arg index="0" ref="jedisPoolConfig" /> 
  18.     <constructor-arg index="1"> 
  19.         <list> 
  20.             <ref bean="jedis.shardInfo" /> 
  21.         </list> 
  22.     </constructor-arg> 
  23. </bean> 
  24.  <bean id="redisUtil" class="org.jboss.netty.example.http.snoop.RedisUtil"> 
  25.     <property name="shardedJedisPool" ref="shardedJedisPool" /> 
  26. </bean> 
  27.  <bean id="httpServerPipelineFactory" class="org.jboss.netty.example.http.snoop.HttpServerPipelineFactory" scope="prototype"> 
  28.     <property name="httpRequestHandler" ref="httpRequestHandler" /> 
  29.  </bean> 
  30.  <bean id="httpRequestHandler" class="org.jboss.netty.example.http.snoop.HttpRequestHandler" scope="prototype"> 
  31.     <property name="databaseUtil" ref="databaseUtil" /> 
  32.     <property name="redisUtil" ref="redisUtil" /> 
  33.  </bean> 

4.测试

访问

http://127.0.0.1:8081/sfds?username=yifangyou

 

 

 

源码下载:http://down.51cto.com/data/229434

 

修改HttpRequestHandler.java

 

  1. package org.jboss.netty.example.http.snoop;  
  2.     
  3.   import static org.jboss.netty.handler.codec.http.HttpHeaders.*;  
  4.   import static org.jboss.netty.handler.codec.http.HttpHeaders.Names.*;  
  5.   import static org.jboss.netty.handler.codec.http.HttpResponseStatus.*;  
  6.   import static org.jboss.netty.handler.codec.http.HttpVersion.*;  
  7.     
  8. import java.sql.Connection;  
  9. import java.sql.PreparedStatement;  
  10. import java.sql.ResultSet;  
  11.   import java.util.List;  
  12.   import java.util.Map;  
  13.   import java.util.Map.Entry;  
  14.   import java.util.Set;  
  15.     
  16.   import org.jboss.netty.buffer.ChannelBuffer;  
  17.   import org.jboss.netty.buffer.ChannelBuffers;  
  18.   import org.jboss.netty.channel.ChannelFuture;  
  19.   import org.jboss.netty.channel.ChannelFutureListener;  
  20.   import org.jboss.netty.channel.ChannelHandlerContext;  
  21.   import org.jboss.netty.channel.ExceptionEvent;  
  22.   import org.jboss.netty.channel.MessageEvent;  
  23.   import org.jboss.netty.channel.SimpleChannelUpstreamHandler;  
  24.   import org.jboss.netty.handler.codec.http.Cookie;  
  25.   import org.jboss.netty.handler.codec.http.CookieDecoder;  
  26.   import org.jboss.netty.handler.codec.http.CookieEncoder;  
  27.   import org.jboss.netty.handler.codec.http.DefaultHttpResponse;  
  28.   import org.jboss.netty.handler.codec.http.HttpChunk;  
  29.   import org.jboss.netty.handler.codec.http.HttpChunkTrailer;  
  30.   import org.jboss.netty.handler.codec.http.HttpRequest;  
  31.   import org.jboss.netty.handler.codec.http.HttpResponse;  
  32. import org.jboss.netty.handler.codec.http.HttpResponseStatus;  
  33.   import org.jboss.netty.handler.codec.http.QueryStringDecoder;  
  34. import org.jboss.netty.util.CharsetUtil;  
  35.     
  36.   /**  
  37.    * @author <a href="http://www.jboss.org/netty/">The Netty Project</a>  
  38.    * @author Andy Taylor (andy.taylor@jboss.org)  
  39.    * @author <a href="http://gleamynode.net/">Trustin Lee</a>  
  40.    *  
  41.    * @version $Rev: 2368 $, $Date: 2010-10-18 17:19:03 +0900 (Mon, 18 Oct 2010) $  
  42.    */ 
  43.   public class HttpRequestHandler extends SimpleChannelUpstreamHandler {  
  44.     
  45.       private DatabaseUtil databaseUtil;  
  46.       private RedisUtil redisUtil;  
  47.       private HttpRequest request;  
  48.       /** Buffer that stores the response content */ 
  49.       private final StringBuilder buf = new StringBuilder();  
  50.     
  51.       @Override 
  52.       public void messageReceived(ChannelHandlerContext ctx, MessageEvent e) throws Exception {  
  53.               HttpRequest request = this.request = (HttpRequest) e.getMessage();  
  54.               redisUtil.setData("yifangyou""testpassword");  
  55.               buf.setLength(0);  
  56.               QueryStringDecoder queryStringDecoder = new QueryStringDecoder(request.getUri());  
  57.               Map<String, List<String>> params = queryStringDecoder.getParameters();       
  58.               if (!params.isEmpty()) {  
  59.                   HttpResponseStatus httpResponseStatus=HttpResponseStatus.OK;             
  60.                   if(params.containsKey("username")){  
  61.                       List<String> values=params.get("username");  
  62.                       String username="";  
  63.                       if(values.size()>0){  
  64.                           username=values.get(0);  
  65.                       }  
  66.                       String password=redisUtil.getData(username);  
  67.                       if(password==null){  
  68.                           buf.append("not found ");  
  69.                       }else{  
  70.                           buf.append(username+"'s password is:"+password);  
  71.                       }  
  72.                   }else{  
  73.                       buf.append("miss username");  
  74.                   }         
  75.                   writeResponse(e,httpResponseStatus,buf);  
  76.               }else{  
  77.                   buf.append("miss username");  
  78.                   writeResponse(e,OK,buf);  
  79.               }  
  80.      }  
  81.    
  82.      private void writeResponse(MessageEvent e,HttpResponseStatus httpResponseStatus,StringBuilder buf) {  
  83.          // Decide whether to close the connection or not.  
  84.          boolean keepAlive = isKeepAlive(request);  
  85.    
  86.          // Build the response object.  
  87.          HttpResponse response = new DefaultHttpResponse(HTTP_1_1, httpResponseStatus);  
  88.          response.setContent(ChannelBuffers.copiedBuffer(buf.toString(), CharsetUtil.UTF_8));  
  89.          response.setHeader(CONTENT_TYPE, "text/plain; charset=UTF-8");  
  90.    
  91.          // Write the response.  
  92.          ChannelFuture future = e.getChannel().write(response);  
  93.    
  94.          // Close the non-keep-alive connection after the write operation is done.  
  95.          future.addListener(ChannelFutureListener.CLOSE);  
  96.      }  
  97.    
  98.      private void send100Continue(MessageEvent e) {  
  99.          HttpResponse response = new DefaultHttpResponse(HTTP_1_1, CONTINUE);  
  100.          e.getChannel().write(response);  
  101.      }  
  102.    
  103.      @Override 
  104.      public void exceptionCaught(ChannelHandlerContext ctx, ExceptionEvent e)  
  105.              throws Exception {  
  106.          e.getCause().printStackTrace();  
  107.          e.getChannel().close();  
  108.      }  
  109.  
  110.     public void setDatabaseUtil(DatabaseUtil databaseUtil) {  
  111.         this.databaseUtil = databaseUtil;  
  112.     }  
  113.  
  114.     public DatabaseUtil getDatabaseUtil() {  
  115.         return databaseUtil;  
  116.     }  
  117.  
  118.     public void setRedisUtil(RedisUtil redisUtil) {  
  119.         this.redisUtil = redisUtil;  
  120.     }  
  121.  
  122.     public RedisUtil getRedisUtil() {  
  123.         return redisUtil;  
  124.     }  
  125.  }  

本文出自 “一方有” 博客,请务必保留此出处http://yifangyou.blog.51cto.com/900206/628163

分享到:
评论

相关推荐

    netty4与spring集成

    将 Netty 与 Spring 集成,可以利用 Netty 的高性能网络通信能力,同时享受 Spring 提供的便捷的组件管理和应用结构。 在 Netty 和 Spring 集成的过程中,通常涉及以下几个关键知识点: 1. **Spring 上下文**: 在...

    netty-spring-mvc-master.rar_netty_netty spring_netty4 spring_s

    集成Netty和Spring MVC的关键在于将Spring的依赖注入(DI)特性引入到Netty的生命周期中。这通常可以通过实现Spring的ApplicationContextAware接口来实现,这样可以在Netty的启动过程中获取到Spring的...

    Spring+Netty+WebSocket实例

    4. **Spring与Netty的集成**:通过Spring的`WebSocketMessageBrokerConfigurer`接口,将Spring的消息传递系统与Netty的WebSocket服务器连接起来。这通常涉及设置WebSocket消息的订阅者和发布者。 5. **客户端支持**...

    netty和spring结合

    5. **异常处理**:集成Netty和Spring时,需要确保两者的异常处理机制兼容,以保证系统的健壮性。 6. **测试和监控**:可能包含单元测试代码以及日志和监控配置,以帮助开发者调试和优化系统性能。 7. **部署配置**...

    Netty+Spring Boot仿微信 全栈开发高性能后台及客户端

    综上所述,"Netty+Spring Boot仿微信 全栈开发高性能后台及客户端"项目是一个综合性的学习和实践平台,涵盖了网络编程、后端开发、全栈集成以及性能优化等多个领域。通过这个项目,开发者不仅可以提升自己的技术能力...

    springboot整合netty的demo

    在SpringBoot项目中,我们可以通过添加对应的依赖来引入Netty,例如在`pom.xml`中加入`spring-boot-starter-webflux`,这个依赖集成了Reactor Netty,它是Spring Framework 5.x对响应式编程的支持,底层就是基于...

    netty+spring服务端-omen-1.1

    omen-1.1 自己基于netty开发的服务端,支持spring配置服务器启动模式:http,tcp,websocket等,并支持NIO和OIO方式,项目已应用于生产,可以通过jar形式加入其它项目,业务类实现业务service,启动不依赖于其他应用...

    netty源码+Spring源码视频教程.txt

    - **集成示例**:如何将Spring的业务逻辑嵌入到Netty的事件处理流程中。 - **最佳实践**:在实际项目中如何合理地利用Netty和Spring的优势。 #### 2. 性能优化技巧 - **代码层面**:针对Netty的性能瓶颈进行优化,...

    netty_spring

    Netty 是一个高性能、异步事件驱动的网络应用程序框架,用于快速开发可维护的高性能协议服务器和客户端。...通过学习和理解这些内容,开发者可以更好地掌握 Netty 和 Spring 集成的技巧,从而在实际项目中灵活运用。

    spring+netty+mybatis整合实例

    在IT行业中,Spring、Netty和MyBatis是三个非常重要的框架,它们分别在不同的领域发挥着关键作用。Spring是一个全面的Java应用框架,提供强大的依赖注入、AOP(面向切面编程)以及丰富的功能模块;Netty则是一个高...

    netty springmvc dubbo 集成实例

    总之,Netty、SpringMVC和Dubbo的集成可以构建出强大、高效的分布式系统。通过合理的配置和优化,我们可以充分利用每个框架的优势,为应用程序提供卓越的性能和可扩展性。在实际开发中,需根据项目需求,灵活运用...

    netty4.x 与 spring 集成

    Netty4.x与Spring的集成是现代Java应用中常见的技术结合,主要用于构建高性能、异步的网络应用程序。Netty是一个高性能、异步事件驱动的网络应用程序框架,它为开发自定义网络协议和服务提供了高效率和灵活性。而...

    spring boot 整合的netty 实现的socket的服务端和客户端

    Spring Boot 是一个流行的Java开发框架,它简化了创建独立、生产级别的基于Spring的应用程序的流程。Netty 是一个高性能、异步...同时,利用Spring Boot的自动配置和管理特性,可以使整个系统的集成更加简洁、高效。

    spring netty 整合 源代码

    4. **启动Netty服务器**:在Spring的启动类或者配置类中,使用Spring注入的Netty服务器配置启动服务器,监听指定端口。 5. **客户端交互**:创建Netty客户端,同样利用Spring管理的bean进行通信,也可以使用Spring...

    基于java的springboot和dubbo、netty的集成模板

    通过以上步骤,我们可以构建出一个强大的基于Java的后端服务架构,集成了Spring Boot的易用性、Dubbo的分布式服务治理和Netty的高性能网络通信能力。这种架构适用于大型、复杂的企业级应用,能够提供高效、稳定的...

    netty-spring-boot-starter:Netty与Spring Boot集成

    netty-spring-boot-starter 基于Netty的Spring Boot Starter工程。 介绍 支持TCP长连接消息转发到Spring容器 支持自定义消息枚举类( CommandController , CommandMapping ) 支持自定义通信协议解析( ...

    使用netty+spring搭建游戏框架

    - **依赖注入(DI)**:Spring通过XML配置或注解实现对象间的依赖关系,简化了对象的创建和管理。 - **AOP(面向切面编程)**:提供事务管理、日志记录等通用功能,无需侵入业务代码。 - **Spring Boot**:简化...

    spring-netty.zip

    Spring Netty项目是一个整合了Netty 4和Spring 5框架的应用示例,它展示了如何在Netty服务器中使用Spring的特性,特别是针对UDP通信、MyBatis持久化以及通过Netty Handler访问Spring Bean来实现数据库操作。...

    spring-boot-protocol:springboot功能扩展-netty动态协议,可以支持各种网络协议的动态切换(单端口支持多个网络协议)。支持mmap,sendfile零拷贝,http请求批量聚合

    用Netty实现的Spring-boot-protocol将springboot的WebServer更改为NettyTcpServer,为用户扩展了网络编程的能力。多协议服务器,Springboot协议扩展包,允许单端口提供多协议服务。其中内置多个网络传输(标准与规范...

    springboot+netty实现mqtt协议的broken

    3. Spring Boot整合:将Netty服务器集成到Spring Boot应用中,使其成为服务的一部分,可以通过Spring的依赖注入管理和配置。 4. 错误处理和恢复机制:设计处理连接中断和重连的策略,保证服务的稳定性。 5. 自定义...

Global site tag (gtag.js) - Google Analytics