`

基于osgi框架采用mina+springdm+hibernate实现的网络服务器

    博客分类:
  • java
阅读更多

背景:系统是一个多级联网的安防平台的网络调度管理部分,主要功能是接受客户端视频请求,分配组播资源,命令设备

         网关打开dvr摄像头,或者命令视频转发服务器负责在动态分配的ip,prot上转发视频流,

         并且在客户端关闭的时候查看是否还有相应的客户端连接,

         无客户端则命令网关/转发服务器关闭视频流。客户端类型有b/s,c/s,录像服务器。

         由于需要兼容不同类型的设备及网关,所以希望做成一个动态扩展的模块化的系统。因此采用的了mina作为网络连接框架,

         主要是简单,基于消息事件的。

 

设计方案:系统提供一个核心的模块,负责提供model及dao服务。其中dao导出为osgi服务,供各个子模块使用。

               系统采用二进制通讯协议,各个decoder&encoder注册动态安装部署为服务。message的消费采用一个

               注册的command服务消费。因此可以做到不同的协议或者协议有变化可以动态添加修改

               主要类与配置如下:

public class DemuxingProtocolDecoder extends CumulativeProtocolDecoder {
                         :
                         :
 @Override
    protected boolean doDecode(IoSession session, IoBuffer in,
            ProtocolDecoderOutput out) throws Exception {
            int undecodables = 0;
            MessageDecoder currentDecoder =null;
            for (MessageDecoder decoder:decoders) {
                int limit = in.limit();
                int pos = in.position();

                MessageDecoderResult result;
                try {
                    result = decoder.decodable(session, in);
                } finally {
                    in.position(pos);
                    in.limit(limit);
                }

                if (result == MessageDecoder.OK) {
                    currentDecoder = decoder;
                    break;
                } else if (result == MessageDecoder.NOT_OK) {
                    undecodables++;
                } else if (result != MessageDecoder.NEED_DATA) {
                    throw new IllegalStateException(
                            "Unexpected decode result (see your decodable()): "
                                    + result);
                }
            }

            if (undecodables == decoders.size()) {
                // Throw an exception if all decoders cannot decode data.
                String dump = in.getHexDump();
                in.position(in.limit()); // Skip data
                ProtocolDecoderException e = new ProtocolDecoderException(
                        "No appropriate message decoder: " + dump);
                e.setHexdump(dump);
                log.error(e.getMessage());
                return false;
            }

            if (currentDecoder == null) {
                // Decoder is not determined yet (i.e. we need more data)
                return false;
            }

        MessageDecoderResult result = currentDecoder.decode(session, in,
                out);
        if (result == MessageDecoder.OK) {
            currentDecoder = null;
            return true;
        } else if (result == MessageDecoder.NEED_DATA) {
            return false;
        } else if (result == MessageDecoder.NOT_OK) {
            currentDecoder = null;
            throw new ProtocolDecoderException(
                    "Message decoder returned NOT_OK.");
        } else {
            currentDecoder = null;
            throw new IllegalStateException(
                    "Unexpected decode result (see your decode()): "
                            + result);
        }
    }



                                   :
                                   :
}
上面这个类是一个改造后的解码器,可以通过动态寻找注册的decoder服务,在这主要是一个通过spring注入的list来实现的。
-----------------------------------------
系统中的encoder类
public class DemuxingProtocolEncoder  implements ProtocolEncoder,BundleContextAware {
	
	private final Logger logger = LoggerFactory.getLogger(getClass());
	
	private BundleContext bundleContext;
	
    public BundleContext getBundleContext() {
		return bundleContext;
	}

	public void setBundleContext(BundleContext bundleContext) {
		this.bundleContext = bundleContext;
	}

	public DemuxingProtocolEncoder() {
    	
    }

    @SuppressWarnings("unchecked")
	public void encode(IoSession session, Object message,
            ProtocolEncoderOutput out) throws Exception {
        MessageEncoder<Object> encoder = (MessageEncoder<Object>)findCommandServiceByBeanName(message.getClass().getName());
        if (encoder != null) {
            encoder.encode(session, message, out);
        } else {
            throw new UnknownMessageTypeException(
                    "No message encoder found for message: " + message);
        }
    }

    public void dispose(IoSession session) throws Exception {    
    }
    
    public Object findCommandServiceByBeanName(String messageTypeClass){
		try {
			ServiceReference[] sefs = bundleContext.getAllServiceReferences("org.apache.mina.filter.codec.demux.MessageEncoder", "(messageTypeClass="+messageTypeCl


ass+")");
			if(sefs!=null&&sefs.length>0){
				return bundleContext.getService(sefs[0]);
			}
		} catch (InvalidSyntaxException e) {
			logger.error(e.getMessage());
		}		
		return null;
	}
}
这个类主要是实现了在osgi注册表中寻找相应的message的encoder,通过osgi服务的fliter查找的。上面标红的部分。
以上就是主要的改造mian的类。其中spring-dm的主要配置如下:
<osgi:list id="decoders" interface="org.apache.mina.filter.codec.demux.MessageDecoder" cardinality="0..N"></osgi:list> 
这个decoders会动态注入到上面的DemuxingProtocolDecoder对象中。每个模块注册decoder与encoder,
command的方式如下:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xmlns:osgi="http://www.springframework.org/schema/osgi"
  xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
                      http://www.springframework.org/schema/osgi http://www.springframework.org/schema/osgi/spring-osgi.xsd"
                      default-autowire="byName" default-lazy-init="false" >

	<bean id="registerExDecoder" class="com.bct.exchange.au.exregister.RegisterExDecoder"></bean>
    <bean id="registerExMessageCommand" class="com.bct.exchange.au.exregister.RegisterExMessageCommand"></bean>
    
    <bean id="registerExEncoder" class="com.bct.exchange.au.exregister.RegisterExEncoder"></bean>
    <bean id="unitAddDeleteEncoder3" class="com.bct.exchange.au.exregister.UnitAddDeleteEncoder3"></bean>
    
    <osgi:service id="registerExDecoderService" 
    	interface="org.apache.mina.filter.codec.demux.MessageDecoder"
    	ref="registerExDecoder">
    </osgi:service>
    
    <osgi:service id="registerExEncoderService" 
    	interface="org.apache.mina.filter.codec.demux.MessageEncoder"
    	ref="registerExEncoder">
    	<osgi:service-properties>
			<entry key="messageTypeClass">
				<value>com.bct.exchange.au.exregister.RegisterExMessage</value>
			</entry>    	
    	</osgi:service-properties>
    </osgi:service>
    
    <osgi:service id="unitAddDeleteEncoder3Service" 
    	interface="org.apache.mina.filter.codec.demux.MessageEncoder"
    	ref="unitAddDeleteEncoder3">
    	<osgi:service-properties>
			<entry key="messageTypeClass">
				<value>com.bct.exchange.au.exregister.UnitAddDeleteMessage3</value>
			</entry>    	
    	</osgi:service-properties>
    </osgi:service>
    
    <osgi:service id="registerExMessageCommandService" 
    	interface="com.bct.commandHandle.Command"
    	ref="registerExMessageCommand">
    	<osgi:service-properties>
			<entry key="messageTypeClass">
				<value>com.bct.exchange.au.exregister.RegisterExMessage</value>
			</entry>    	
    	</osgi:service-properties>
    </osgi:service>
    
</beans> 

目前这种构架基本实现成功,主要功能已经在这个上面实现成功,没有什么大的问题。现在想考虑的问题是,
这个东西怎么做分布式,也就是怎么在一个jvm上的osgi调用另一个jvm上面的osgi服务,第二,这个系统怎么
做成热备或集群的方式。现在主要考虑的是这两个方面,等有好的事项方式在和各位探讨
 

 

分享到:
评论
6 楼 kebo 2008-12-03  
呵呵,等我搞完了这段,在写点想法
5 楼 boyingking 2008-11-27  
楼主主要在哪些方面应用了OSGI呢?能否进行一下更深点的交流?楼主在实际项目中用过了OSGI,能否从宏观上总结一下经验,写给大家分享一下呢?
4 楼 kebo 2008-11-20  
呵,没有来讨论的。那就自己来。这套方式,基本融合了osgi的面向服务和事件驱动的编程方式。
首先。系统是通过一个一个message来驱动的。io产生一个message。注册的command service去消费
。而且灵活就在于一个command service可以注册对多个message感兴趣。所以command service的的执行可以被多种方式驱动。第二一个消息可以被多个command service同时消费处理。所以一个消息可以在系统中产生一连串的反应。
这样可以实现一些细粒度的command service,在系统中组合执行。达到最大的重用与解耦。
3 楼 kebo 2008-11-19  
需要那块的代码?
2 楼 javierhui 2008-11-19  
楼主可否给出更详尽一点的源代码?
1 楼 liuchan7448 2008-11-18  
楼主对OSGi的理解很深,写的很详细,正在学习osgi,向楼主学习。

相关推荐

    OSGi+SpringMVC+Spring+Hibernate企业应用框架

    辛苦研究了一个多月,终于搭建成了一个可用于实际应用开发的OSGI-WEB框架,采用OSGi+SpringMVC+Spring+Hibernate+Virgo技术,鉴于此类技术架构甚少,特提供出来供大家参考。 使用步骤: 一、下载STS搭建Osgi开发...

    OSGI+SpringDM+Hessian

    标题 "OSGI+SpringDM+Hessian" 涉及到三个重要的技术概念,它们分别是OSGI(Open Services Gateway Initiative)、SpringDM(Spring Dynamic Modules)和Hessian。这些技术在Java开发领域中都有其独特的应用和价值。...

    osgi+maven+springdm文档集

    Spring DM(Spring Dynamic Modules)是Spring框架的一个扩展,专门用于OSGI环境中。它提供了一种声明式的方式来配置和管理OSGI服务,使得Spring应用能在OSGI容器中无缝运行。"EclipseMavenSpringDM(译文).pdf...

    SpringMVC+Spring+SpringDataJPA+Hibernate整合登录的效果

    这是整合SpringMVC+Spring+SpringDataJPA+Hibernate简单的实现登录的功能,用的是mysql数据库,这是一个web Project 如果你用的是JavaEE6那么你要注意bean-validator.jar和weld-osgi-bundle.jar与slf4j的jar包冲突。...

    学习SpringDM+OSGI的总结

    ### SpringDM与OSGI概述 #### OSGI概念解析 OSGI(Open Service Gateway Initiative),直译为“开放的服务网关初始化”,它是一系列针对Java动态化模块化系统的规范。OSGI不仅指代一个官方联盟,还代表着由该联盟...

    OSGi与Spring:Spring DM开发

    Spring DM不仅充分利用了Spring框架的强大功能,还实现了与OSGi规范的高度集成,使得开发者可以在OSGi环境下无缝地使用Spring的各种特性。Spring DM框架支持OSGi Specification Release 4及以上版本,同时兼容JDK ...

    基于OSGi和Spring开发Web应用.doc

    4. dm Server:dm Server 是一个完全模块化部署的基于 OSGi 的 Java 服务器,为运行企业 Java 应用和 Spring 应用提供更加强大的灵活性和可靠性。 5. OSGi 服务:OSGi 服务是 OSGi 框架中的一个核心概念,能够提供...

    基于SpringDM的WEB应用开发

    至觉得用这种方式开发基于OSGi WEB应用比使用Spring DM Server更好至少目前你可以获得更好便携性(可以 在多个Spring DM支持OSGi平台上运行)并且Spring DM Server并没有提供更多企业应用支持 不过对于刚 使用Spring ...

    Pro+Spring+Dynamic+Modules+for+OSGi+Service+Platforms

    for OSGi (Spring-DM) fulfills this role. I first learned about OSGi when the Eclipse IDE started using it in its plug-in architecture. At the time, the versioning and modularity features seemed nicer ...

    SpringDM笔记31-Testing with OSGi and SpringDM

    标题 "SpringDM笔记31-Testing with OSGi and SpringDM" 涉及到的是在OSGi环境中使用SpringDM进行测试的相关知识。OSGi(Open Service Gateway Initiative)是一种Java模块化系统,允许动态地发现、加载和卸载服务。...

    基于spring dm server 的osgi 例子

    Spring DM(Dynamic Modules)是Spring框架对OSGi环境的支持,它为OSGi应用提供了强大的依赖注入和管理服务。 本示例是基于Spring DM Server的一个OSGi实践项目,主要展示了一个简单的用户登录功能。这个例子的核心...

    spring-dm-osgi整合jar包

    标题“spring-dm-osgi整合jar包”和描述“spring-dm整合osgi所需所有jar包”提及的核心知识点是Spring Dynamic Modules(简称Spring DM)与OSGi(Open Service Gateway Initiative)框架的集成。这两个技术在Java...

    基于virgo环境的OSGI+Maven的web开发代码下载(spring+hibernate+GWT)

    标题中的“基于virgo环境的OSGI+Maven的web开发代码下载”表明这是一个使用OSGi(模块化Java系统)和Maven构建的Web应用程序项目,运行在Virgo服务器上。Virgo是SpringSource推出的一个OSGi应用服务器,它支持Spring...

    OSGi 入门+进阶+实战

    4. **felix或equinox**:Felix和Equinox是两个常用的OSGi运行时实现,它们提供了API和框架,用于构建和运行OSGi应用。 5. **Blueprint或Declarative Services**:这两种是OSGi中的服务配置方式,Blueprint更接近XML...

    基于OSGi和Spring开发Web应用

    它放弃了传统的Java EE服务器标准,转而采用一套全新的基于OSGi内核的部署和打包系统,从而更加自然地整合了Spring编程模型。这种创新的架构不仅简化了应用服务器的配置和管理,同时也提升了应用的性能和稳定性。 #...

    基于OSGi框架的网络操作工单管理系统的设计与实现论文.doc

    【基于OSGi框架的网络操作工单管理系统设计与实现】 随着网络信息技术的飞速发展,网络规模持续扩大,网络设备的数量呈指数级增长,对网络操作管理的需求也随之提高。现有的网络管理系统虽然具备丰富的管理功能,但...

    基于osgi框架实战源码

    标题"基于osgi框架实战源码"揭示了本次学习的主题,即OSGi框架在实际项目中的应用。"osgi实战源码"这一描述进一步强调了这是一份可以动手实践的源代码,它以一个具体的购物车案例为背景,展示了如何在项目中运用OSGi...

Global site tag (gtag.js) - Google Analytics