背景:系统是一个多级联网的安防平台的网络调度管理部分,主要功能是接受客户端视频请求,分配组播资源,命令设备
网关打开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服务,第二,这个系统怎么
做成热备或集群的方式。现在主要考虑的是这两个方面,等有好的事项方式在和各位探讨
分享到:
相关推荐
辛苦研究了一个多月,终于搭建成了一个可用于实际应用开发的OSGI-WEB框架,采用OSGi+SpringMVC+Spring+Hibernate+Virgo技术,鉴于此类技术架构甚少,特提供出来供大家参考。 使用步骤: 一、下载STS搭建Osgi开发...
标题 "OSGI+SpringDM+Hessian" 涉及到三个重要的技术概念,它们分别是OSGI(Open Services Gateway Initiative)、SpringDM(Spring Dynamic Modules)和Hessian。这些技术在Java开发领域中都有其独特的应用和价值。...
Spring DM(Spring Dynamic Modules)是Spring框架的一个扩展,专门用于OSGI环境中。它提供了一种声明式的方式来配置和管理OSGI服务,使得Spring应用能在OSGI容器中无缝运行。"EclipseMavenSpringDM(译文).pdf...
这是整合SpringMVC+Spring+SpringDataJPA+Hibernate简单的实现登录的功能,用的是mysql数据库,这是一个web Project 如果你用的是JavaEE6那么你要注意bean-validator.jar和weld-osgi-bundle.jar与slf4j的jar包冲突。...
### SpringDM与OSGI概述 #### OSGI概念解析 OSGI(Open Service Gateway Initiative),直译为“开放的服务网关初始化”,它是一系列针对Java动态化模块化系统的规范。OSGI不仅指代一个官方联盟,还代表着由该联盟...
Spring DM不仅充分利用了Spring框架的强大功能,还实现了与OSGi规范的高度集成,使得开发者可以在OSGi环境下无缝地使用Spring的各种特性。Spring DM框架支持OSGi Specification Release 4及以上版本,同时兼容JDK ...
4. dm Server:dm Server 是一个完全模块化部署的基于 OSGi 的 Java 服务器,为运行企业 Java 应用和 Spring 应用提供更加强大的灵活性和可靠性。 5. OSGi 服务:OSGi 服务是 OSGi 框架中的一个核心概念,能够提供...
至觉得用这种方式开发基于OSGi WEB应用比使用Spring DM Server更好至少目前你可以获得更好便携性(可以 在多个Spring DM支持OSGi平台上运行)并且Spring DM Server并没有提供更多企业应用支持 不过对于刚 使用Spring ...
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" 涉及到的是在OSGi环境中使用SpringDM进行测试的相关知识。OSGi(Open Service Gateway Initiative)是一种Java模块化系统,允许动态地发现、加载和卸载服务。...
Spring DM(Dynamic Modules)是Spring框架对OSGi环境的支持,它为OSGi应用提供了强大的依赖注入和管理服务。 本示例是基于Spring DM Server的一个OSGi实践项目,主要展示了一个简单的用户登录功能。这个例子的核心...
标题“spring-dm-osgi整合jar包”和描述“spring-dm整合osgi所需所有jar包”提及的核心知识点是Spring Dynamic Modules(简称Spring DM)与OSGi(Open Service Gateway Initiative)框架的集成。这两个技术在Java...
标题中的“基于virgo环境的OSGI+Maven的web开发代码下载”表明这是一个使用OSGi(模块化Java系统)和Maven构建的Web应用程序项目,运行在Virgo服务器上。Virgo是SpringSource推出的一个OSGi应用服务器,它支持Spring...
4. **felix或equinox**:Felix和Equinox是两个常用的OSGi运行时实现,它们提供了API和框架,用于构建和运行OSGi应用。 5. **Blueprint或Declarative Services**:这两种是OSGi中的服务配置方式,Blueprint更接近XML...
它放弃了传统的Java EE服务器标准,转而采用一套全新的基于OSGi内核的部署和打包系统,从而更加自然地整合了Spring编程模型。这种创新的架构不仅简化了应用服务器的配置和管理,同时也提升了应用的性能和稳定性。 #...
【基于OSGi框架的网络操作工单管理系统设计与实现】 随着网络信息技术的飞速发展,网络规模持续扩大,网络设备的数量呈指数级增长,对网络操作管理的需求也随之提高。现有的网络管理系统虽然具备丰富的管理功能,但...
标题"基于osgi框架实战源码"揭示了本次学习的主题,即OSGi框架在实际项目中的应用。"osgi实战源码"这一描述进一步强调了这是一份可以动手实践的源代码,它以一个具体的购物车案例为背景,展示了如何在项目中运用OSGi...