`
gh_aiyz
  • 浏览: 39640 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

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>
 

 

 

 

1
0
分享到:
评论
4 楼 gaojin 2014-04-01  
你的教程用到那些jar包?什么版本?
我表示新手有点摸不着头脑
3 楼 小树鹿鸣 2012-08-07  
这是什么问题 ?
2 楼 小树鹿鸣 2012-08-07  
引用
2012-08-07 15:51:54,453 DEBUG [org.apache.mina.core.filterchain.IoFilterEvent] - Firing a EXCEPTION_CAUGHT event for session 3
2012-08-07 15:51:54,453 WARN [org.apache.mina.filter.logging.LoggingFilter] - EXCEPTION :
org.apache.mina.filter.codec.ProtocolDecoderException: java.lang.OutOfMemoryError: Java heap space (Hexdump: 00 00 00 00 05 68 65 6C 6C 6F 00 00 00 1A 48 02 00 43 10 68 65 6C 6C 6F 5F 73 74 72 69 6E 67 5F 69 6E 74 92 02 68 79 AB)
at org.apache.mina.filter.codec.ProtocolCodecFilter.messageReceived(ProtocolCodecFilter.java:251)
at org.apache.mina.core.filterchain.DefaultIoFilterChain.callNextMessageReceived(DefaultIoFilterChain.java:434)
at org.apache.mina.core.filterchain.DefaultIoFilterChain.access$1200(DefaultIoFilterChain.java:46)
at org.apache.mina.core.filterchain.DefaultIoFilterChain$EntryImpl$1.messageReceived(DefaultIoFilterChain.java:796)
at org.apache.mina.core.filterchain.IoFilterAdapter.messageReceived(IoFilterAdapter.java:119)
at org.apache.mina.core.filterchain.DefaultIoFilterChain.callNextMessageReceived(DefaultIoFilterChain.java:434)
at org.apache.mina.core.filterchain.DefaultIoFilterChain.fireMessageReceived(DefaultIoFilterChain.java:426)
at org.apache.mina.core.polling.AbstractPollingIoProcessor.read(AbstractPollingIoProcessor.java:715)
at org.apache.mina.core.polling.AbstractPollingIoProcessor.process(AbstractPollingIoProcessor.java:668)
at org.apache.mina.core.polling.AbstractPollingIoProcessor.process(AbstractPollingIoProcessor.java:657)
at org.apache.mina.core.polling.AbstractPollingIoProcessor.access$600(AbstractPollingIoProcessor.java:68)
at org.apache.mina.core.polling.AbstractPollingIoProcessor$Processor.run(AbstractPollingIoProcessor.java:1141)
at org.apache.mina.util.NamePreservingRunnable.run(NamePreservingRunnable.java:64)
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
at java.lang.Thread.run(Thread.java:662)
Caused by: java.lang.OutOfMemoryError: Java heap space
at java.nio.HeapByteBuffer.<init>(HeapByteBuffer.java:39)
at java.nio.ByteBuffer.allocate(ByteBuffer.java:312)
at org.apache.mina.core.buffer.SimpleBufferAllocator.allocateNioBuffer(SimpleBufferAllocator.java:44)
at org.apache.mina.core.buffer.SimpleBufferAllocator.allocate(SimpleBufferAllocator.java:36)
at org.apache.mina.core.buffer.IoBuffer.allocate(IoBuffer.java:227)
at org.apache.mina.core.buffer.IoBuffer.allocate(IoBuffer.java:210)
at org.apache.mina.filter.codec.statemachine.FixedLengthDecodingState.decode(FixedLengthDecodingState.java:63)
at org.apache.mina.filter.codec.statemachine.DecodingStateMachine.decode(DecodingStateMachine.java:113)
at org.apache.mina.filter.codec.statemachine.DecodingStateProtocolDecoder.decode(DecodingStateProtocolDecoder.java:80)
1 楼 小树鹿鸣 2012-08-07  
引用
2012-08-07 15:51:54,296 DEBUG [com.missian.client.sync.SyncMissianProxy] - Missian[SyncMissianProxy [beanName=hello, port=8080, host=172.16.26.87]] calling hello_string_int

相关推荐

    missian:一个java RPC框架,无模式风格

    弥赛亚 一个java RPC框架,无模式风格

    Spring集成ActiveMQ配置

    Spring 集 成ActiveMQ 配置 异步RPC框架 Missian ActiveMq-JMS简单实例使用tomcat

    Java 员工管理系统项目源代码(可做毕设项目参考)

    Java 员工管理系统项目是一个基于 Java 编程语言开发的桌面应用程序,旨在管理员工的信息、津贴、扣除和薪资等功能。该系统通过提供结构和工具集,使公司能够有效地管理其员工数据和薪资流程。 系统特点 员工管理:管理员可以添加、查看和更新员工信息。 津贴管理:管理员可以添加和管理员工的津贴信息。 扣除管理:管理员可以添加和管理员工的扣除信息。 搜索功能:可以通过员工 ID 搜索员工详细信息。 更新薪资:管理员可以更新员工的薪资信息。 支付管理:处理员工的支付和生成支付记录。 模块介绍 员工管理模块:管理员可以添加、查看和更新员工信息,包括员工 ID、名字、姓氏、年龄、职位和薪资等。 津贴管理模块:管理员可以添加和管理员工的津贴信息,如医疗津贴、奖金和其他津贴。 扣除管理模块:管理员可以添加和管理员工的扣除信息,如税收和其他扣除。 搜索功能模块:可以通过员工 ID 搜索员工详细信息。 更新薪资模块:管理员可以更新员工的薪资信息。 支付管理模块:处理员工的支付和生成支付记录 可以作为毕业设计项目参考

    CAD实验报告:制药车间动力控制系统图、烘烤车间电气控制图、JSJ型晶体管式时间继电器原理图、液位控制器电路图

    CAD实验报告:制药车间动力控制系统图、烘烤车间电气控制图、JSJ型晶体管式时间继电器原理图、液位控制器电路图

    使用 Arduino 和 Python 实时数据绘图的温度监控系统源码(可做毕设项目参考)

    项目简介: 本项目将教您如何使用 Arduino 和 Python 实时数据绘图来构建温度监控系统。通过这个项目,您将学习如何从 Arduino 到 Python 进行串行通信,并实时收集和监控温度数据。 项目目标: 实时监控和绘制温度数据。 提供用户友好的操作界面。 提高用户的编程技能,特别是Arduino和Python的应用能力。 项目功能 实时温度监控: 传感器每秒读取一次温度数据,并通过串行监视器发送到Python程序。 数据保存: Python程序将温度数据保存到CSV文件中。 实时数据绘图: 使用Matplotlib库实时绘制温度数据,温度在Y轴,时间在X轴。 项目优势 高效的数据监控: 实时监控和绘制温度数据,提高数据监控的效率。 用户友好: 界面简洁,操作简单,用户可以轻松使用该应用程序。 提高编程技能: 通过实践项目,提高对Arduino和Python的应用能力。 项目技术细节 项目详情: 项目名:使用 Arduino 和 Python 实时数据绘图的温度监控系统 项目平台:Arduino 和 Python 使用的编程语言:C++(Arduino)、Python ID

    软件测试-软件测试方案pdf

    本测试计划提供给深圳移动公司PMS核心小组成员,对PMS EXPRESS 系统进行功能测试。测试计划主要通过对基站项目管理过程的模拟,从项目的立项开始直至基站的验收交付以及知识沉淀,对基站建设全过程中涉及的管理内容进行模拟测 试。测试计划中设计了两个基站项目一明宁花园、椰风海岸。其中明宁花园按 原计划如期完工,而椰风海岸因为设备没能如期到货导致了个整个项目工期的延误。

    博物馆智能化系统的解决方案.pptx

    博物馆智能化系统的解决方案.pptx

    基于STM32的电子罗盘

    基于STM32的电子罗盘试验

    【matlab GUI仿真】说明:GUI界面设计,四旋翼飞机仿真 VR界面设计

    【matlab GUI仿真】说明:GUI界面设计,四旋翼飞机仿真。VR界面设计。 (GUI interface design, four rotor aircraft simulation. The VR interface design. ) 【matlab GUI仿真】说明:GUI界面设计,四旋翼飞机仿真。VR界面设计。

    基于VHDL的倒车雷达项目(免费提供全部源码)

    项目简介: 本项目实现了一个基于VHDL(VHSIC硬件描述语言)的倒车雷达系统。倒车雷达用于检测车辆后方障碍物的距离,以辅助驾驶员安全倒车。系统通过超声波传感器检测距离,并使用LED显示或蜂鸣器提示障碍物的接近程度。 项目模块: 传感器接口模块: 处理超声波传感器的信号。 发送触发信号,接收回波信号。 计算回波时间,进而计算距离。 距离计算模块: 根据传感器回波时间计算距离。 处理和转换距离数据,准备用于显示和警报。 警报显示模块: 基于计算出的距离提供视觉和听觉警报。 使用LED显示不同的距离范围。 使用蜂鸣器发出不同频率的警报声。 控制模块: 控制各模块的协调工作。 管理超声波传感器的触发和数据采集周期。

    2024年动力电池回收行业市场分析报告.pptx

    行业报告

    ssm框架在线课堂微信小程序源码+项目说明(高分毕设)

    毕业设计ssm框架在线课堂微信小程序源码+项目说明(高分毕设).zip 个人经导师指导并认可通过的高分设计项目,评审分98分。主要针对计算机相关专业的正在做毕设的学生和需要项目实战练习的学习者,也可作为课程设计、期末大作业。 毕业设计ssm框架在线课堂微信小程序源码+项目说明(高分毕设).zip 个人经导师指导并认可通过的高分设计项目,评审分98分。主要针对计算机相关专业的正在做毕设的学生和需要项目实战练习的学习者,也可作为课程设计、期末大作业。 毕业设计ssm框架在线课堂微信小程序源码+项目说明(高分毕设).zip 个人经导师指导并认可通过的高分设计项目,评审分98分。主要针对计算机相关专业的正在做毕设的学生和需要项目实战练习的学习者,也可作为课程设计、期末大作业。 项目主要功能: 该项目是一款针对在线课堂微信小程序的数据管理系统,旨在便捷用户对小程序中的信息进行有效管理。系统设计注重功能完善和用户体验,力求使用户能轻松找到所需信息。采用JAVA技术开发,并结合现有成熟源代码模板,确保了平台的可操作性和实用性。关键词:在线课堂微信小程序;JAVA。

    国内锂矿加速开发,四川锂矿详细梳理

    国内锂矿加速开发,四川锂矿详细梳理

    一个基于react框架的资源文件

    一个基于react框架的资源文件 练习,xiaoyoushop分支是小优后台,screen分支是大屏项目,react分支是基于react框架,使用ts语言,vite构建的一个后台管理系统项目 练习,xiaoyoushop分支是小优后台,screen分支是大屏项目,react分支是基于react框架,使用ts语言,vite构建的一个后台管理系统项目 练习,xiaoyoushop分支是小优后台,screen分支是大屏项目,react分支是基于react框架,使用ts语言,vite构建的一个后台管理系统项目 内容来源于网络分享。仅供学习使用。请勿商用。如有侵权,请联系我。我将立即删除

    MQD企业大学建设思路与年度工作重点.pptx

    MQD企业大学建设思路与年度工作重点.pptx

    Java语言基础入门教程 Java实训教程 13.反射 共38页.pptx

    Java语言基础入门教程 Java实训教程 13.反射 共38页.pptx

    网上购物商城数据库设计报告.docx

    网上购物商城数据库设计报告.docx

    单机成本核算统计表.docx

    单机成本核算统计表.docx

    Swift语言简介.md

    Swift 是由苹果公司推出的一种现代化的编程语言,用于开发 iOS、macOS、watchOS 和 tvOS 应用程序。它结合了安全、高性能和易用性的特点,成为开发苹果平台应用程序的首选语言。

    创建一个简单的PHP页面.pdf

    创建一个简单的PHP页面

Global site tag (gtag.js) - Google Analytics