- 浏览: 80954 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
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 2904<beans xmlns="http: ... -
《Groovy入门经典》读书笔记
2012-05-22 14:20 1502如果我们把规矩和对称 ... -
还是discuz与j2ee整合的cookie认证
2010-01-22 15:00 1547前一篇已经写了IE跨域认证的问题实际上是个“误会”。 没想到 ... -
由apache整合tomcat调用支付宝(alipay)在linux服务器上引发的乱码大战
2010-01-20 02:27 3870本来一个东西乱码就很折磨人了,这几样东西加在一起。。我觉得我能 ... -
由discuz与j2ee整合引发的IE跨域cookie认证的问题
2010-01-11 13:50 1587近段时间在做网站,论坛就用成熟的discuz,但是我不是php ... -
php+apache+tomcat+spring+dwr配置
2009-12-27 14:59 2654我原来有一个网络应用,现在想上一个论坛,对比了n多java做的 ... -
香锅之最后一锅,其他杂事
2009-08-14 16:18 11551、Groovy:groovy也可以融入Spring DM,我 ... -
香锅之equonix部署
2009-08-14 16:12 1539眼见这个系列快完成了 ... -
香锅之activemq(不爽), ibatis和timer
2009-08-14 15:32 2396上回说到menifest.mf,这回说几个重头的。从轻的说起: ... -
香锅之manifest.mf到底咋降伏
2009-08-14 15:15 1084上回说到哪儿了? 这回说的很单纯,像17、18岁的少女,单纯 ... -
香锅之编码测试环境
2009-08-14 14:38 929上回说到引入springDM和新建项目,这回说说建立测试环境的 ... -
香锅之事前准备以及maven(老三卑微的愿望)
2009-08-14 14:27 1665上回说到,天上掉下个 ... -
OSGI,Spring DM,Equinox,Maven,activemq,ibatis一锅烩
2009-08-14 13:48 3430话说,两个礼拜之前,天上掉下一个任务,任务简报如下:敌人会在丫 ... -
Junit 4 10秒钟
2008-09-19 16:32 910比较丢人的说,近期才看了看Junit 4,以前都是用TestN ... -
给HSQLDB的text table增加对Excel的读取
2008-09-18 12:47 1938HSQLDB是一个非常好的内存数据库,对于处理少量数据的小型数 ...
相关推荐
1.程序功能说明: MATLAB实现多种群遗传算法(完整代码) 逼近C=[9,8,7,6,5,4,3,2,1]的9维向量. 2.代码说明:注释清晰,参数和变量说明清晰,方便更改、方便初学者使用,模块化编程,方便替换目标函数。运行环境Windows7及以上操作系统,MATLAB2014a及以上版本。 3.适用专业:计算机、电子信息工程、数学、物理、机械工程、土木工程等专业的大学生、研究生毕业设计,各类专业的课程设计、海外留学生作业等。 4作者介绍:资深算法工程师, 从事Matlab、Python算法仿真工作15年,专业研究遗传算法、粒子群算法、蚁群算法、鲸鱼算法、狼群算法等. 有问题联系QQ: 1579325979
免费JAVA毕业设计 2024成品源码+论文+数据库+启动教程 启动教程:https://www.bilibili.com/video/BV1SzbFe7EGZ 项目讲解视频:https://www.bilibili.com/video/BV1Tb421n72S 二次开发教程:https://www.bilibili.com/video/BV18i421i7Dx
免费JAVA毕业设计 2024成品源码+论文+录屏+启动教程 启动教程:https://www.bilibili.com/video/BV1SzbFe7EGZ 项目讲解视频:https://www.bilibili.com/video/BV1Tb421n72S 二次开发教程:https://www.bilibili.com/video/BV18i421i7Dx
小学元旦晚会PPT 模版
免费JAVA毕业设计 2024成品源码+论文+数据库+启动教程 启动教程:https://www.bilibili.com/video/BV1SzbFe7EGZ 项目讲解视频:https://www.bilibili.com/video/BV1Tb421n72S 二次开发教程:https://www.bilibili.com/video/BV18i421i7Dx
MATLAB中的语义分割技术探究与应用实践,matlab,语义分割 ,matlab; 语义分割,Matlab语义分割技术解析
免费JAVA毕业设计 2024成品源码+论文+数据库+启动教程 启动教程:https://www.bilibili.com/video/BV1SzbFe7EGZ 项目讲解视频:https://www.bilibili.com/video/BV1Tb421n72S 二次开发教程:https://www.bilibili.com/video/BV18i421i7Dx
1、文件内容:pulseaudio-10.0-6.el7_9.rpm以及相关依赖 2、文件形式:tar.gz压缩包 3、安装指令: #Step1、解压 tar -zxvf /mnt/data/output/pulseaudio-10.0-6.el7_9.tar.gz #Step2、进入解压后的目录,执行安装 sudo rpm -ivh *.rpm 4、安装指导:私信博主,全程指导安装
"基于OpenCV与深度学习的人脸表情识别系统:利用Python与PyQt构建的可视化实时检测工具",基于OpenCV的人脸表情识别系统 相关技术:python,opencv,pyqt,深度学习 (请自行安装向日葵远程软件,以便提供远程帮助) 可编译为.exe文件。 软件说明:摄像头实时检测,加载照片,视频均可。 有基础的同学,可自行修改完善。 第一张和第二张为运行截图。 ,基于OpenCV的人脸表情识别系统; Python; OpenCV; PyQt; 深度学习; 实时检测; 照片和视频支持; 可编译为.exe文件; 运行截图。,"基于OpenCV与深度学习的人脸表情识别系统"
,步进方案,步进源码,两相步进矢量控制,超前角控制两种模式,成熟产品方案 支持特殊功能定制
三相储能PCS双向能量流动与Matlab仿真控制研究——基于SVPWM调制技术的建模与应用,三相储能PCS(Matlab仿真) 1.可实现Grid to Battery,Battery to Grid的能量双向流动。 2.本仿真基于Matlab仿真建立的模型, 3.采用SVPWM进行控制 ,三相储能PCS; 双向能量流动; Matlab仿真; SVPWM控制,三相储能PCS:能量双向流Matlab仿真模型(SVPWM控制)
deepseek部署教程.md
nodejs010-nodejs-ansicolors-0.3.2-1.el6.centos.alt.noarch.rpm
基于三菱PLC的四路抢答器控制系统原理及实践:含带解释的梯形图与IO分配图解,三菱 MCGS 基于PLC的四路抢答器控制系统 带解释的梯形图接线图原理图图纸,io分配,组态画面 ,三菱MCGS; PLC四路抢答器; 控制系统; 梯形图接线图; 原理图图纸; IO分配; 组态画面。,三菱PLC四路抢答器控制系统原理图及组态画面解析
基于运动数据时空特征提取的人类运动片段.pdf
基于机器学习的选股模型及投资组合研究.pdf
ollama安装包。。。。。。。。。。。。。。。。。
nodejs010-nodejs-ansistyles-0.1.3-1.el6.centos.alt.x86_64.rpm
Screenshot_20250201_111207_com_tencent_mm_LauncherUI.jpg
基于时空Transformer的端到端的视频注视目标检测.pdf