Missian指南三:创建一个Missian服务器(使用spring)
在使用Missian时,spring是可选的,但是作者本人强烈推荐和Spring配合使用。Spring是一个伟大的项目,并且它不会对程序在运行时的效率带来任何损耗。
Missian在服务器端依赖与Mina,Missian只是提供一个Codec(协议编码解码,兼容TCP和HTTP)和一个Handler(调用Hessian序列化机制来反序列化数据、使用BeanLocator来定位这次调用的Bean)。熟悉Mina的朋友会很清楚Codec和Handler的概念;不熟悉的朋友也没关系,按照这个教程一样可以创建一个高效的服务来。对Mina没有兴趣的朋友可以直接跳到第七步:)
步骤一:创建一个spring配置文件。
- <?xml version="1.0" encoding="UTF-8"?>
- <beans xmlns="http://www.springframework.org/schema/beans"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">
- </beans>
步骤二:配置文件中加入:
- <bean class="org.springframework.beans.factory.config.CustomEditorConfigurer">
- <property name="customEditors">
- <map>
- <entry key="java.net.SocketAddress">
- <bean class="org.apache.mina.integration.beans.InetSocketAddressEditor" />
- </entry>
- </map>
- </property>
- </bean>
这个是最后绑定端口时,用来将10.1.23.1:125转换成SocketAddress的,不用太关注。
步骤三:配置各个Mina的Filter
注意ExecutorFitler是使用的默认构造函数,要指定线程数,或者将已有的线程池传入,可以使用其它的构造函数;LoggingFilter中除了Exception之外的时间的Log级别已经全部设为DEBUG;CodecFilter是关键,这里引入了Missian的编码解码器。
- <bean id="executorFilter" class="org.apache.mina.filter.executor.ExecutorFilter" />
- <bean id="codecFilter" class="org.apache.mina.filter.codec.ProtocolCodecFilter">
- <constructor-arg>
- <bean class="com.missian.server.codec.MissianCodecFactory" />
- </constructor-arg>
- </bean>
- <bean id="loggingFilter" class="org.apache.mina.filter.logging.LoggingFilter">
- <property name="messageReceivedLogLevel" value="DEBUG"/>
- <property name="messageSentLogLevel" value="DEBUG"/>
- <property name="sessionCreatedLogLevel" value="DEBUG"/>
- <property name="sessionClosedLogLevel" value="DEBUG"/>
- <property name="sessionIdleLogLevel" value="DEBUG"/>
- <property name="sessionOpenedLogLevel" value="DEBUG"/>
- </bean>
步骤四:构建FilterChian
这里我把Codec放在线程池之前,因为编码解码是CPU密集型的操作,使用线程池并不能提高效率。当然了,有兴趣的朋友可以自己调整顺序做一下测试。
- <bean id="filterChainBuilder"
- class="org.apache.mina.core.filterchain.DefaultIoFilterChainBuilder">
- <property name="filters">
- <map>
- <entry key="codecFilter" value-ref="codecFilter" />
- <entry key="executor" value-ref="executorFilter" />
- <entry key="loggingFilter" value-ref="loggingFilter" />
- </map>
- </property>
- </bean>
步骤五:创建IoHandler。
这一步也很重要,引入了Missian的处理器,就是在这里调用了Hessian的序列化机制,并完成对相应的Bean的调用。
- <bean id="minaHandler" class="com.missian.server.handler.MissianHandler">
- <constructor-arg>
- <bean class="com.missian.common.beanlocate.SpringLocator" />
- </constructor-arg>
- </bean>
MissianHandler接受一个BeanLocator的构造菜熟,注意这里直接给MissianHandler注入了一个SpringLocator,使得Missian有能力去Spring去寻找相应的Bean。
这里是一个很好的扩展点,有需要的话可以在BeanLocator上做做文章。
步骤六:创建一个Acceptor,监听端口
- <bean id="minaAcceptor" class="org.apache.mina.transport.socket.nio.NioSocketAcceptor"
- init-method="bind" destroy-method="unbind">
- <property name="defaultLocalAddress" value=":1235" />
- <property name="handler" ref="minaHandler" />
- <property name="reuseAddress" value="true" />
- <property name="filterChainBuilder" ref="filterChainBuilder" />
- </bean>
到此位置,missian服务配置完毕。接下来配置一下业务逻辑的Bean。
步骤七:配置一个业务逻辑Bean,供Missian客户端调用
- <bean id="hello" class="com.missian.example.bean.HelloImpl"></bean>
上一篇指南里面创建的这个类第一次出境了,鼓掌……
注意bean的id叫做‘hello’,missian客户端就是通过‘hello’这个名称找到这个bean的,例如:http://www.abc.cn/hello。
值得一提的是如果客户端想通过http://www.abc.cn/p/hello来访问这个bean,那么这个bean的配置应该如此:
- <bean name="p/hello" class="com.missian.example.bean.HelloImpl"></bean>
ID属性是不能出现斜杠的,所以通过name来定义这个bean。
步骤八:启动服务器
- public class ServerWithSpring {
- /**
- * @param args
- */
- public static void main(String[] args) {
- new ClassPathXmlApplicationContext("com/missian/example/server/withspring/applicationContext-*.xml");
- }
- }
运行ServerWithSpring即启动了整个服务了。服务将监听1235端口,接受HTTP协议和TCP协议格式的请求。
步骤九:用Hessian来调用此服务
由于Missian服务器是兼容Hessian的,所以,在创建Missian客户端之前,让我们用Hessian客户端来测试一下这个服务吧。
- HessianProxyFactory factory = new HessianProxyFactory();
- Hello hello = (Hello) factory.create(Hello.class, "http://localhost:1235/hello");
- System.out.println(hello.hello("test", 27));
是的,你会发现调用成功了。
完整的配置文件如下 :
- <?xml version="1.0" encoding="UTF-8"?>
- <beans xmlns="http://www.springframework.org/schema/beans"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">
- <bean class="org.springframework.beans.factory.config.CustomEditorConfigurer">
- <property name="customEditors">
- <map>
- <entry key="java.net.SocketAddress">
- <bean class="org.apache.mina.integration.beans.InetSocketAddressEditor" />
- </entry>
- </map>
- </property>
- </bean>
- <!-- The IoHandler implementation -->
- <bean id="minaHandler" class="com.missian.server.handler.MissianHandler">
- <constructor-arg>
- <bean class="com.missian.common.beanlocate.SpringLocator" />
- </constructor-arg>
- </bean>
- <!-- the IoFilters -->
- <bean id="executorFilter" class="org.apache.mina.filter.executor.ExecutorFilter" />
- <bean id="codecFilter" class="org.apache.mina.filter.codec.ProtocolCodecFilter">
- <constructor-arg>
- <bean class="com.missian.server.codec.MissianCodecFactory" />
- </constructor-arg>
- </bean>
- <bean id="loggingFilter" class="org.apache.mina.filter.logging.LoggingFilter">
- <property name="messageReceivedLogLevel" value="DEBUG"/>
- <property name="messageSentLogLevel" value="DEBUG"/>
- <property name="sessionCreatedLogLevel" value="DEBUG"/>
- <property name="sessionClosedLogLevel" value="DEBUG"/>
- <property name="sessionIdleLogLevel" value="DEBUG"/>
- <property name="sessionOpenedLogLevel" value="DEBUG"/>
- </bean>
- <!-- The non-SSL filter chain. -->
- <bean id="filterChainBuilder"
- class="org.apache.mina.core.filterchain.DefaultIoFilterChainBuilder">
- <property name="filters">
- <map>
- <entry key="codecFilter" value-ref="codecFilter" />
- <entry key="executor" value-ref="executorFilter" />
- <entry key="loggingFilter" value-ref="loggingFilter" />
- </map>
- </property>
- </bean>
- <!-- The IoAcceptor which binds to port 1235 server side -->
- <bean id="minaAcceptor" class="org.apache.mina.transport.socket.nio.NioSocketAcceptor"
- init-method="bind" destroy-method="unbind">
- <property name="defaultLocalAddress" value=":1235" />
- <property name="handler" ref="minaHandler" />
- <property name="reuseAddress" value="true" />
- <property name="filterChainBuilder" ref="filterChainBuilder" />
- </bean>
- <!-- your business bean, missian client will call this bean by 'hello' -->
- <bean id="hello" class="com.missian.example.bean.HelloImpl"></bean>
- </beans>
Missian指南三:创建一个Missian服务器(使用spring)的更多相关文章
- 【重点突破】——使用Express创建一个web服务器
一.引言 在自学node.js的过程中有一个非常重要的框架,那就是Express.它是一个基于NodeJs http模块而编写的高层模块,弥补http模块的繁琐和不方便,能够快速开发http服务器.这 ...
- 十七、创建一个 WEB 服务器(一)
1.Node.js 创建的第一个应用 var http=require("http") http.createServer(function (req,res) { res.wri ...
- nodejs创建一个HTTP服务器 简单入门级
const http = require('http');//请求http.createServer(function(request, response){ /*createServer该函数 ...
- 用NodeJS创建一个聊天服务器
Node 是专注于创建网络应用的,网络应用就需要许多I/O(输入/输出)操作.让我们用Node实现有多么简单,并且还能轻松扩展. 创建一个TCP服务器 var net = require('net') ...
- Delphi for iOS开发指南(3):创建一个FireMonkey iOS应用程序
http://cache.baiducontent.com/c?m=9d78d513d9d431a94f9d92697d60c015134381132ba1d0020fa48449e3732b4b50 ...
- [AirFlow]AirFlow使用指南三 第一个DAG示例
经过前两篇文章的简单介绍之后,我们安装了自己的AirFlow以及简单了解了DAG的定义文件.现在我们要实现自己的一个DAG. 1. 启动Web服务器 使用如下命令启用: airflow webserv ...
- [git 学习篇]自己在github创建一个远程服务器创库
现在的情景是,你已经在本地创建了一个Git仓库后,又想在GitHub创建一个Git仓库,并且让这两个仓库进行远程同步,这样,GitHub上的仓库既可以作为备份,又可以让其他人通过该仓库来协作,真是一举 ...
- 用 eclipse 创建一个简单的 meaven spring springMvc mybatis 项目
下面是整体步骤: 1: 先创建一个Maven 项目: 选择跳过骨架: 因为要搭建的是 web 项目 所以这个地方选择 war 包; 点击完成 这样就完成 Maven项目的搭建: 接下俩 先把 Mav ...
- python web编程 创建一个web服务器
这里就介绍几个底层的用于创建web服务器的模块,其中最为主要的就是BaseHTTPServer,很多框架和web服务器就是在他们的基础上创建的 基础知识 要建立一个Web 服务,一个基本的服务器和一个 ...
随机推荐
- 《Head First 设计模式》之迭代器与组合模式——遍历合并的菜单
迭代器与组合模式(Iterator & Composite) 迭代器:提供一种方法顺序访问一个聚合对象中的各个元素,而又不暴露其内部的表示. 组合:允许你将对象组成树形结构来表现“整体.部分” ...
- 如何进行大规模在线数据迁移(来自Stripe公司的经验)
首发于笔者的微信公众号:技术心流FollowFlows 原文地址:Stripe Engineering Blog 各工程团队常面临一项共同挑战:重新设计数据模型以支持清晰准确的抽象和更复杂的功能. ...
- 工控图表控件ProEssentials创建3D柱状图示例代码
使用ProEssentials可以创建3D柱状图,柱状图的形式包括线框.实体和阴影. 类似于Graph control,3D柱状图只需要YData. Subsets定义沿z轴有多少行,Points定义 ...
- 构建第一个Spring Boot2.0应用之Controller(三)
Controller控制器主要是接收浏览器请求.下面说一说@Controller注解和@RestController的区别: (1)@Controller类中的方法可以直接通过返回String跳转到j ...
- EF ObjectQuery查询及方法
string esql = "select value c from NorthwindEntities.Customers as c order by c.CustomerID lim ...
- python3基础07(进程操作及执行系统级命令等)
#subprocess 创建子进程 连接输入 输出 管道错误,及获取他们的状态,可执行操作系统级的命令# subprocess.run(args, *, stdin=None, input=None, ...
- mif文件生成方法
mif文件就是存储器初始化文件,即memory initialization file,用来配置RAM或ROM中的数据.常见生成方法: Quartus自带的mif编辑器生成 mif软件生成 高级编程语 ...
- python内存泄露的诊断(转)
本篇文章非原创,转载自:http://rstevens.iteye.com/blog/828565 . 对于一个用 python 实现的,长期运行的后台服务进程来说,如果内存持续增长,那么很可能是有了 ...
- innobackupex 全备、增备脚本
全备脚本:innobackupex --defaults-file=/etc/my.cnf --user root --password mypasswd /mydata/fullbak/ 增备脚本: ...
- POJ 3280 Cheapest Palindrome(区间dp)
dp[i][j]表示处理完i到j的花费,如果s[i] == s[j] 则不需要处理,否则处理s[i]或s[j], 对一个字符ch,加上ch或删掉ch对区间转移来说效果是一样的,两者取min. #inc ...