Netty实战手册(四)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/aiyoyoyo/article/details/78831083

这次我在介绍Netty的使用时,会带入JDBS的数据处理,没有了解JDBS的可以在这里看JDBS的实际使用方式。

另外我对JSTS部分接口进行了重新命名,具体内容请对比 Netty实战手册(三)中的部分,当然可以以示例代码为准。

使用JDBS时,需要先下载JDBS的项目到本地,然后添加到本地maven库里。关于Maven和Git的用法,这里不做描述。

首先在项目中的Pom.xml中加入以下内容导入JDBS:

<dependency>
	<groupId>com.jees</groupId>
	<artifactId>jees-jdbs</artifactId>
	<version>0.0.1-SNAPSHOT</version>
</dependency>
然后,参考JDBS中的数据库配置文件,加入我们自己的配置文件,参考如下:

jees-core-dispatcher.xml: 加入数据库配置

<import resource="jees-core-database.xml"/>
jees-core-database.xml:数据库相关配置

<!-- 以下为项目配置参考 -->
<context:component-scan base-package="com.jees.demo.*" />
<import resource="jees-database-test.xml"/>

<!-- 数据库池,程序通过关键字sessionFactoryMap获取对应的数据库session。ID为固定值,不可修改。 -->
<!-- 
Example:
dao.executeByHQL( _dbKey, _hql );
-->
<util:map id="sessionFactoryMap" >
	<!-- _dbmap_key为查询的数据标识关键字 -->
	<entry key="default" value-ref="defaultSF"/>
</util:map>
其实这些配置内容和SpringMVC+Hibernate的框架基本一致,完全可以用在Web项目 中,为了方便理解,有些命名我也是参考Web项目来命名的。

数据库的用法,可以定一个DaoService,并实现JDBS中的AbsSupportDao进行封装:

DaoService.java

@Service
public class DaoService extends AbsSupportDao {
	final static String		DB_DEFAULT	= "default";
	
	// Common 数据库通用方法 ==========================================
	// 调用AbsSupportDao的公共方法,也可以通过其他方式自己实现,例如
	// Session sess = _get_session( DB_DEFAULT );
	
	public void insert( Object _entity ) {
		insert( DB_DEFAULT , _entity );
	}
	
	public < T > T selectById( Class< T > _cls , Serializable _id ) {
		return selectById( DB_DEFAULT , _cls , _id );
	}
}
然后可以提供类似Controller的类来对客户端命令做行为分解,这里我叫DemoModel:

DemoModel.java:

@Component
public class DemoModel {
	
	@Autowired
	DaoService			daoService;
	/**
	 * 假设这里是处理登陆等命令,加入@Transactional保证事务生效
	 * @param _request
	 * @param _response
	 */
	@Transactional
	public void requestLogin( ByteBuf _request, ByteBuf _response ) {
		// 如果需要字符串,建议使用ProtoBuff,否则需要知道截取字符串的长度,参考如下:
		//int len = _request.readInt();
		//byte[] dst = new byte[len];
		//_request.readBytes( dst );
		//String account = new String( dst );
		//下面我仅作示意代码来当作用户登陆
		
		int id = _request.readInt();
		
		TabA a = daoService.selectById( TabA.class , id );
		
		_response.writeInt( a == null ? -1 : a.getId() );
	}
	
	/**
	 * 假设这里处理注册
	 * @param _request
	 * @param _response
	 */
	@Transactional
	public void requestRegist( ByteBuf _request, ByteBuf _response ){
		TabA a = new TabA();
		daoService.insert( a );
		_response.writeInt( a.getId() );
	}
}
参考实战手册三,我这里修改了CommandService的请求处理内容:
@Service
public class CommandService implements ISupportService< ChannelHandlerContext , ByteBuf > {
	private static Logger logger		= LogManager.getLogger( CommandService.class );
	
	@Autowired
	DemoModel	demoModel;
	
	@Override
	public void request( ChannelHandlerContext _ctx , ByteBuf _request ) {
		final int		UserLogin = 1;
		final int		UserRegist = 2;
		int cmd = _request.readInt();
		logger.info( "CommandService do command: CMD=[" + cmd + "]" );
		ByteBuf response = _ctx.alloc().buffer();
		
		//根据cmd来识别使用哪个模块来处理,
		switch( cmd ){
			case UserLogin:
				demoModel.requestLogin( _request, response );
				break;
			case UserRegist:
				demoModel.requestRegist( _request, response );
				break;
		}
		
		response( _ctx, response );
	}
	
	@Override
	public void response( ChannelHandlerContext _ctx , ByteBuf _msg ) {
		_ctx.writeAndFlush( _msg );
	}
}
基本上从网络请求到数据处理,现在已经形成了一个完整环境了,熟悉客户端开发的人,可以使用这套环境来做服务器。

由于最近事情比较多,本篇写的比较仓促,无法很好的理解的,可以加群咨询我。

Netty实战篇暂时到这里了,后面有时间会在示例代码中更新粘包的处理和Protobuff的使用。

接下来我会找时间把JEES或者JEESJS的使用完善和发文章做介绍。希望各位多多支持。

完整的代码下载地址如下:

https://github.com/aiyoyoyo/jeesupport/tree/master/demo/JSTSDemo

欢迎各位关注:JEES系列
也可以加QQ群讨论:8802330


猜你喜欢

转载自blog.csdn.net/aiyoyoyo/article/details/78831083