懒人服务器 - 教程三、了解如何应用(服务器端)

正如上一篇的“了解配置文件”一样,本篇也只是对懒人服务器的应用做一个简单的概述。
本篇与上一篇的目的,其实都只是想让大家对懒人服务器的运作与应用有一个大体上的认知,
并不是说,就通过这一两篇的文章就要让大家完全掌握整个框架的配置和原理。

从上一篇教程里,我们知道懒人服务器在总体上可分为三个大的模块:数据库模块、网络模块和Action模块。
由于网络通信服务不一定要用到数据库,所以“数据库模块”是可选的,
也就是说,只有网络模块和Action模块才是必不可少的。

在懒人服务器里面,负责处理网络通信和 Action 的两个核心的类,
分别是 NetMessageManagerNetActionManager
这两个类在配置文件中都是需要进行单独配置的,具体可参考上一篇里列出的 conf.xml 文件。

由于懒人服务器的框架已经封装好底层网络通信的功能,
所以对于负责网络通信处理的 NetMessageManager 来说,
通常我们只需关心给它设置一些什么样的网络连接参数(比如监听端口、网络IO缓冲区大小等)就可以的了,
其他的地方一般不需要去深入了解。

下面需要展开来说的是 NetActionManager 。
或者更准确的说,应该是 NetActionManager 所管辖的 NetAction (org.lazyboots.svr.net.NetAction)。
因为,对于每个使用懒人服务器的开发人员来说,他必须要知道的,
就是如何在这个框架中搭建起他想要的应用功能。
这些应用功能通常就是为了响应从客户端发出的请求而编写的;
而响应从客户端发出的请求就是 Action 要做的事情(这个概念也基本上跟 Struts 里的 Action 是一致的)。

使用懒人服务器的框架做开发,实际上就是一个如何编写和配置 NetAction 的过程。

下面我们就通过一个例子来看一下,到底要怎样去编写一个 NetAction 。

假设我们现在要做一个字符串加工服务,由客户端发一个字符串,
当服务器端收到字符串后就进行加工处理(比如小写转大写),
然后再把结果发回给客户端。下面就是这个服务所对应的 Action 类:

package org.lazyboots.svr.sample.biz.test.action;

import org.lazyboots.svr.act.BaseAction;

public class SimpleStringAction extends BaseAction {

	public void uppercase(String input) throws Exception {
            Thread.sleep(1000 * 1); // make it a bit slow ... 
            String str = input.toUpperCase();
            send(str);
	}
}

这里我们要注意的是,所有的 Action 类必须继承于
BaseAction (org.lazyboots.svr.act.BaseAction)。
框架会调用 Action 类里面的某一个函数来处理具体的用户请求,
这个函数的名字可以随便定义,函数名跟具体请求的对应关系可以在配置文件中设置。
以上这些都是跟 Struts 相似的。
但是,这个用于处理具体用户请求的函数只能有一个参数,这个唯一的输入项就是由客户端发过来的“东西”。
这个“东西”可以是一个字符串,也可以是一个POJO,也可以是一个 Map 或者 List<Map> 。
总之,只要这个“东西”是可以被序列化成 JSON 字符串的,都可以作为函数的唯一参数
(当前版本也支持接收原始的 ByteArray)。

说回例子中的 Action 类 “SimpleStringAction” ,它只有一个函数 “void uppercase(String input)” ,
是用于把字符从小写转为大写。
而这个函数里的代码也非常简单,唯一需要说明一下就是最后一句 “send(str);” ,
这一句就是把转换后的字符串发送给客户端。
对于 “send()” 这个被定义在 BaseAction 里的函数,它有许多重载,
它所支持的参数,也基本上是所有能被序列化成 JSON 字符串的“东西”
(当前版本也支持直接发送 ByteArray)。

写完这个 Action 类以后,我们还需要配置它,就是把 “SimpleStringAction” 里面的某个函数名,
跟用户发送过来的请求绑定在一起。
在 Struts 里面,类似的绑定一般就是把一个用户请求的 URL 跟 Action 里的某个函数名绑定在一起。
而在懒人服务器的框架中,我们使用的是把一个用户请求的号码 跟 Action 里的某个函数名绑定在一起。
而对于这个“用户请求的号码”,具体还要划分为两个部分:
第一部分是 “Action 请求号”;第二部分是 “Function 请求号”。
框架会根据 “Action 请求号”,找到对应的 Action 类;
然后再根据 “Function 请求号”,在 Action 类中找到对应的函数名,然后调用它。

下面就是例子中的配置情况(以下的两段 XML 内容均可写在 conf.xml 文件中):

首先是 “Action 请求号” 绑定 Action 类 (注意 高亮 部分)

 
 
<!-- 这是所有 Action 的处理类的一些配置 -->
<bean id= "netActionManager" scope= "prototype" 
class= "org.lazyboots.svr.net.NetActionManager" >
<!-- 每个 Action 都会用一个线程来处理,这跟 Web Server 用一个线程来处理一个页面的做法一致 -->
<!-- 所以这里需要设置一些与线程池相关的参数 -->
<!-- 首先是线程池在初始化时就会创建的最少线程数 -->
<property name= "minThreadPoolSize" value= "256" />
<!-- 接着是线程池能使用的最多的线程数 -->
<property name= "maxThreadPoolSize" value= "2048" />
<!-- 这是线程池队列的大小 -->
<property name= "threadQueueSize" value= "8192" />
<!-- 这是线程发呆时间的设置,单位为秒 -->
<property name= "threadIdleTime" value= "180" />
<!-- 在 Struts 中,一个 Action 对应一个URL;而我们这里则是一个 Action 对应一个请求号码-->
<property name= "actionMap" >
<map>
<!-- 请求号为 1000 的请求会被分配给名为 calculateAction 的 Action Bean 做处理 -->
<entry key= "1000" value= "calculateAction" />
<!-- 请求号为 1001 的请求会被分配给名为 simpleFileAction 的 Action Bean 做处理 -->
<entry key= "1001" value= "simpleFileAction" />
<!-- 请求号为 1002 的请求会被分配给名为 simpleStringAction 的 Action Bean 做处理 -->
<entry key="1002" value="simpleStringAction" />
<!-- 请求号为 1003 的请求会被分配给名为 studentAction 的 Action Bean 做处理 -->
<entry key= "1003" value= "studentAction" />
</map>
</property>
</bean>

然后是 “Function 请求号” 绑定 Action 类中的函数名 (注意 高亮 部分)

 
 
<!-- 这是一个对字符串进行加工处理的 ActionBean ,之前已设置了它所对应的请求号为 1002 -->
<bean id= "simpleStringAction" parent= "baseAction" 
class= "org.lazyboots.svr.sample.biz.test.action.SimpleStringAction" >
<property name= "encryption" value= "1" />
<property name= "compression" value= "1" />
<!-- 在配置 Action Bean 时, 同时配置 “函数号” 与 函数名 的对应关系 -->
<property name= "functionMap" >
<map>
<!-- 函数号 为 1 的请求会调用 SimpleStringAction 的 uppercase 函数 -->
<entry key="1" value="uppercase" />
</map>
</property>
</bean>


写完这些配置后,重启一下服务器程序,我们在服务器端的工作就算完成了。

接下来要看一下客户端这边要做哪些开发工作,才能调用得到我们新完成的“字符串加工服务”。



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值