- 浏览: 80539 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
ybj316:
文章很不错,也很愁加密问题。不想别人看到数据库的设计和数据。您 ...
一次数据库的选型,FireBird胜出 -
lliiqiang:
最好提前设计好程序,可以未雨绸缪,不然是无法从根本解决问题,框 ...
OpenLaszlo简介 -
stevezheng:
xmind
《德鲁克谈自我管理》读书笔记 -
刘宇斌:
大哥 你这些读后感 要使用什么程序 才能打开
《德鲁克谈自我管理》读书笔记 -
stevezheng:
haohao-xuexi02 写道还有什么好书推荐下。。最近在 ...
《it创业疯魔史》读后有感
上回说到,测试环境的搭建,这回说点儿正经事:bnudle之间的bean相互调用。
总结一个字,贼简单。
用广东话说就是:贼拉拉的简单。
<bean id="fileProbe" class="com.monitor.bundle.probe.file.FileProbeImpl"> <property name="folder" value="r:/testdata/" /> <property name="ext" value="txt" /> <property name="messageSender"> <osgi:reference interface="com.monitor.bundle.interfaces.MessageSenderIF" /> </property> </bean> <osgi:service id="fileProbeService" interface="com.monitor.bundle.interfaces.ProbeIF" ref="fileProbe" />
fileProbe这个bean定义了一个bean,与标准spring不同的是,定义了messageSender,里面用了osgi:reference,表示你要引用别人了,interface属性定义了你要引用的接口,至于到底引用的是哪个实现呢?答案是:爱谁谁,谁在容器中定义的服务实现了这个接口,就是说,如果有多个,就看谁的rank大,具体的机制自己看spring dm的文档吧。另外,也可以定义destroy-method="stop" init-method="start",以便spring-osgi-extender能在加载这个bean的时候自动引用start()方法和卸载bean的时候引用stop(),比如,我们的mq这个bundle就是这么配置的
<bean id="listener" class="com.monitor.bundle.amq.Listener" destroy-method="stop" init-method="start"> <property name="mqUrl" value="tcp://localhost:61616" /> <property name="userName" value="system" /> <property name="password" value="manager" /> <property name="qName" value="steveq" /> <property name="persisHandler"> <osgi:reference interface="com.monitor.bundle.interfaces.PersistanceIF" /> </property> <property name="stradgy"> <osgi:reference interface="com.monitor.bundle.interfaces.StradgyIF" /> </property> </bean>
代码如下:
package com.zeromonitor.bundle.amq; import javax.jms.Connection; import javax.jms.DeliveryMode; import javax.jms.ExceptionListener; import javax.jms.JMSException; import javax.jms.Message; import javax.jms.MessageConsumer; import javax.jms.MessageListener; import javax.jms.MessageProducer; import javax.jms.ObjectMessage; import javax.jms.Queue; import javax.jms.Session; import javax.jms.TextMessage; import org.apache.activemq.ActiveMQConnectionFactory; import org.eclipse.core.runtime.adaptor.EclipseStarter; import org.osgi.framework.Bundle; import org.osgi.framework.BundleContext; import org.osgi.framework.BundleException; import com.monitor.bundle.beans.ZmBean; import com.monitor.bundle.interfaces.PersistanceIF; import com.monitor.bundle.interfaces.StradgyIF; /** * User: steve * Date: 2009-7-21 12:02:35 */ public class Listener implements MessageListener, ExceptionListener { String mqUrl = ""; String userName = ""; String password = ""; String qName = ""; PersistanceIF persisHandler = null; StradgyIF stradgy = null; Connection connection = null; BundleContext equinoxContext = null; public void onException(JMSException e) { System.out.println("JMS Exception occured. Shutting down client."); } public void stop() { try { this.connection.stop(); } catch (JMSException e) { e.printStackTrace(); } } public void start() { try { //ActiveMQConnectionFactory connectionFactory = new ActiveMQConnectionFactory("system", "manager", "tcp://localhost:61616"); ActiveMQConnectionFactory connectionFactory = new ActiveMQConnectionFactory(this.userName, this.password, this.mqUrl); this.connection = connectionFactory.createConnection(); connection.setExceptionListener(this); connection.start(); Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE); Queue destination = session.createQueue(this.qName); MessageProducer replyProducer = session.createProducer(null); replyProducer.setDeliveryMode(DeliveryMode.NON_PERSISTENT); MessageConsumer consumer = session.createConsumer(destination); consumer.setMessageListener(this); this.equinoxContext = EclipseStarter.getSystemBundleContext(); } catch (Exception e) { //System.out.println("Caught: " + e); // do nothing } } public void onMessage(Message message) { try { if (message instanceof TextMessage) { //表示操作Bundle,!暂时方案! TextMessage txtMsg = (TextMessage) message; String msg = txtMsg.getText(); if(msg.startsWith("i")) { // 安装 this.equinoxContext.installBundle("file:" + msg.substring(1)); } if(msg.startsWith("list")) { for(int i=0;i<this.equinoxContext.getBundles().length;i++) { System.out.println(this.equinoxContext.getBundles()[i].getSymbolicName()); } } else { //更新 for(int i=0;i<this.equinoxContext.getBundles().length;i++) { Bundle tmp = this.equinoxContext.getBundles()[i]; String bundleName = msg.substring(1); if(bundleName.equalsIgnoreCase(tmp.getSymbolicName())) { if(msg.startsWith("s")) { tmp.start(); } else if(msg.startsWith("t")) { tmp.stop(); } else if(msg.startsWith("d")) { tmp.update(); } else if(msg.startsWith("u")) { tmp.uninstall(); } } } } } else { //表示是一个ZMBean ZmBean zmBean = (ZmBean)((ObjectMessage) message).getObject(); this.persisHandler.persist(this.stradgy.doStradgy(zmBean)); } /* if (message.getJMSReplyTo() != null) { replyProducer.send(message.getJMSReplyTo(), session.createTextMessage("Reply: " + message.getJMSMessageID())); } */ } catch (JMSException e) { System.out.println("Caught: " + e); e.printStackTrace(); } catch (BundleException e) { // TODO Auto-generated catch block e.printStackTrace(); } } public String getMqUrl() { return mqUrl; } public void setMqUrl(String mqUrl) { this.mqUrl = mqUrl; } public String getUserName() { return userName; } public void setUserName(String userName) { this.userName = userName; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } public String getqName() { return qName; } public void setqName(String qName) { this.qName = qName; } public PersistanceIF getPersisHandler() { return persisHandler; } public void setPersisHandler(PersistanceIF persisHandler) { this.persisHandler = persisHandler; } public StradgyIF getStradgy() { return stradgy; } public void setStradgy(StradgyIF stradgy) { this.stradgy = stradgy; } }
其中:
1、start()里面开启监听;
2、stop()里面停止;
3、至于onmessage方法,是听到以后怎么办(以后的章节会讲用api怎么操作equinox)
在这个bean的定义下面,是定义了一个osgi:service,表示这个bundle提供什么样的服务,就是说,“我能干什么,或者说,我实现了什么接口”,定义好了以后,别人就可以用osgi:reference引用自己了。
这里有一个好的实践经验:为了让你整个工程提供的接口不至于分散在各个bundle里面,最好建一个interfaces的bundle,这里面都是接口,而且对外不提供任何的服务,也不引用任何的别人。
发表评论
-
Active MQ的配置和使用
2013-05-03 13:33 2900<beans xmlns="http: ... -
《Groovy入门经典》读书笔记
2012-05-22 14:20 1496如果我们把规矩和对称 ... -
还是discuz与j2ee整合的cookie认证
2010-01-22 15:00 1535前一篇已经写了IE跨域认证的问题实际上是个“误会”。 没想到 ... -
由apache整合tomcat调用支付宝(alipay)在linux服务器上引发的乱码大战
2010-01-20 02:27 3864本来一个东西乱码就很折磨人了,这几样东西加在一起。。我觉得我能 ... -
由discuz与j2ee整合引发的IE跨域cookie认证的问题
2010-01-11 13:50 1583近段时间在做网站,论坛就用成熟的discuz,但是我不是php ... -
php+apache+tomcat+spring+dwr配置
2009-12-27 14:59 2649我原来有一个网络应用,现在想上一个论坛,对比了n多java做的 ... -
香锅之最后一锅,其他杂事
2009-08-14 16:18 11491、Groovy:groovy也可以融入Spring DM,我 ... -
香锅之equonix部署
2009-08-14 16:12 1533眼见这个系列快完成了 ... -
香锅之activemq(不爽), ibatis和timer
2009-08-14 15:32 2387上回说到menifest.mf,这回说几个重头的。从轻的说起: ... -
香锅之manifest.mf到底咋降伏
2009-08-14 15:15 1073上回说到哪儿了? 这回说的很单纯,像17、18岁的少女,单纯 ... -
香锅之编码测试环境
2009-08-14 14:38 914上回说到引入springDM和新建项目,这回说说建立测试环境的 ... -
香锅之事前准备以及maven(老三卑微的愿望)
2009-08-14 14:27 1663上回说到,天上掉下个 ... -
OSGI,Spring DM,Equinox,Maven,activemq,ibatis一锅烩
2009-08-14 13:48 3418话说,两个礼拜之前,天上掉下一个任务,任务简报如下:敌人会在丫 ... -
Junit 4 10秒钟
2008-09-19 16:32 900比较丢人的说,近期才看了看Junit 4,以前都是用TestN ... -
给HSQLDB的text table增加对Excel的读取
2008-09-18 12:47 1932HSQLDB是一个非常好的内存数据库,对于处理少量数据的小型数 ...
相关推荐
### SpringDM与OSGI概述 #### OSGI概念解析 OSGI(Open Service Gateway Initiative),直译为“开放的服务网关初始化”,它是一系列针对Java动态化模块化系统的规范。OSGI不仅指代一个官方联盟,还代表着由该联盟...
标题“spring-dm-osgi整合jar包”和描述“spring-dm整合osgi所需所有jar包”提及的核心知识点是Spring Dynamic Modules(简称Spring DM)与OSGi(Open Service Gateway Initiative)框架的集成。这两个技术在Java...
【标题】:“基于Spring DM Server的OSGi实例” 在IT领域,OSGi(Open Services Gateway Initiative)是一种模块化系统和Java...对于学习和理解OSGi以及Spring DM Server的开发者来说,这是一个非常有价值的参考案例。
标题 "SpringDM笔记31-Testing with OSGi and SpringDM" 涉及到的是在OSGi环境中使用SpringDM进行测试的相关知识。OSGi(Open Service Gateway Initiative)是一种Java模块化系统,允许动态地发现、加载和卸载服务。...
在SpringDM(Spring Dynamic Modules)框架中,OSGi(Open Service Gateway Initiative)服务注册与引用是核心功能之一,它使得模块化系统中的组件能够互相发现并交互。本篇笔记将探讨如何在OSGi环境中注册服务以及...
### OSGi与Spring:Spring DM开发环境配置详解 #### 一、引言 随着软件架构的不断发展,模块化和微服务化的趋势日益明显。在Java领域,OSGi(Open Service Gateway Initiative)作为一套成熟的技术标准,为实现模块...
Spring OSGi是Spring框架与OSGi(Open Service Gateway Initiative)规范相结合的一种技术,它...通过学习和掌握Spring DM Server的使用以及Spring OSGi的相关库,开发者可以更好地在OSGi环境中构建和管理Spring应用。
这个文档集主要涵盖了三个关键的Java开发技术:OSGI(Open Service Gateway Initiative)、Maven以及Spring Dynamic Modules(Spring DM)。这些技术都是现代Java开发中的重要组成部分,特别是在模块化系统和企业级...
标签提到的“源码”可能指的是查看和学习SpringDM以及相关OSGi库的源代码,这对于理解其工作原理和实现细节非常有帮助。同时,“工具”可能是指像Eclipse PDE或SpringSource Tool Suite这样的集成开发环境,它们提供...
Spring DM,全称为Spring Dynamic Modules,是Spring框架的一个扩展,主要设计用于开发在OSGi(Open Service Gateway Initiative)环境下的应用程序。OSGi是一种模块化系统,允许Java应用程序以组件的形式进行构建、...
在选择OSGi实现时,通常会考虑Equinox、Apache Felix和Spring DM(现在称为Spring OSGi),这三种流行的实现各有特点和优势。 1. **Equinox**:由Eclipse基金会维护,是OSGi R4规范的核心框架实现。Equinox以其稳定...
Spring-DM指的是 Spring ...Spring-DM 的主要目的是能够方便地将 Spring 框架和OSGi框架结合在一起,使得使用Spring的应用程序可以方便简单地部署在OSGi环境中,利用OSGi框架提供的服务,将应用变得 更加模块化。
《SpringDM开发文档》是关于SpringDM框架的详细技术指南,该框架是在OSGi环境中运行Spring应用程序的关键组件。SpringDM,全称为Spring Dynamic Modules,是Spring框架针对OSGi(Open Service Gateway Initiative)...
其中的jar包可能包括了OSGi运行时环境如Apache Felix或Equinox,Spring框架的核心库,以及可能的Spring DM(Dependency Manager,已被Spring OSGi替代)等组件。 标签"osgi springDM"进一步明确了关键技术和关注点...
Spring DM 1.1.x最大特性便...在多个Spring DM支持OSGi平台上运行)并且Spring DM Server并没有提供更多企业应用支持 不过对于刚 使用Spring DM进行WEB应用开发人来说成功地配置却不是件容易事,文档详细讲解了相关配置
2. **Spring DM工作原理**:学习如何在OSGi环境中使用Spring DM配置服务,包括元数据描述、服务的声明式管理以及依赖注入。 3. **Apache Felix的使用**:掌握创建、部署和管理OSGi bundle的基本步骤,以及如何在...
标题中的"SpringDM笔记28-Spring And OSGi:Layers of Integration"表明这是一篇关于Spring框架与OSGi(Open Service Gateway Initiative)集成的详细笔记。OSGi是一种模块化系统,它允许Java应用程序以模块化的方式...
《Spring Dynamic Modules (Spring DM) 开发指南》深入解析 ...通过深入理解Spring DM的核心概念、新特性以及打包部署的技巧,开发者能够充分利用OSGi的模块化优势,构建出更加健壮、灵活和可扩展的应用系统。