`
stevezheng
  • 浏览: 80539 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

香锅之spring DM的相互调用以及osgi namespace

    博客分类:
  • java
阅读更多

上回说到,测试环境的搭建,这回说点儿正经事: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,这里面都是接口,而且对外不提供任何的服务,也不引用任何的别人。

分享到:
评论

相关推荐

    学习SpringDM+OSGI的总结

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

    spring-dm-osgi整合jar包

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

    基于spring dm server 的osgi 例子

    【标题】:“基于Spring DM Server的OSGi实例” 在IT领域,OSGi(Open Services Gateway Initiative)是一种模块化系统和Java...对于学习和理解OSGi以及Spring DM Server的开发者来说,这是一个非常有价值的参考案例。

    SpringDM笔记31-Testing with OSGi and SpringDM

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

    SpringDM笔记13-OSGi服务注册与引用

    在SpringDM(Spring Dynamic Modules)框架中,OSGi(Open Service Gateway Initiative)服务注册与引用是核心功能之一,它使得模块化系统中的组件能够互相发现并交互。本篇笔记将探讨如何在OSGi环境中注册服务以及...

    OSGi与Spring:Spring DM开发

    ### OSGi与Spring:Spring DM开发环境配置详解 #### 一、引言 随着软件架构的不断发展,模块化和微服务化的趋势日益明显。在Java领域,OSGi(Open Service Gateway Initiative)作为一套成熟的技术标准,为实现模块...

    spring osgi相关资源

    Spring OSGi是Spring框架与OSGi(Open Service Gateway Initiative)规范相结合的一种技术,它...通过学习和掌握Spring DM Server的使用以及Spring OSGi的相关库,开发者可以更好地在OSGi环境中构建和管理Spring应用。

    osgi+maven+springdm文档集

    这个文档集主要涵盖了三个关键的Java开发技术:OSGI(Open Service Gateway Initiative)、Maven以及Spring Dynamic Modules(Spring DM)。这些技术都是现代Java开发中的重要组成部分,特别是在模块化系统和企业级...

    SpringDM笔记7-开发SpringDM Bundle

    标签提到的“源码”可能指的是查看和学习SpringDM以及相关OSGi库的源代码,这对于理解其工作原理和实现细节非常有帮助。同时,“工具”可能是指像Eclipse PDE或SpringSource Tool Suite这样的集成开发环境,它们提供...

    spring DM英文版

    Spring DM,全称为Spring Dynamic Modules,是Spring框架的一个扩展,主要设计用于开发在OSGi(Open Service Gateway Initiative)环境下的应用程序。OSGi是一种模块化系统,允许Java应用程序以组件的形式进行构建、...

    osgi选型比较 实例Equinox、Apache Felix与Spring DM

    在选择OSGi实现时,通常会考虑Equinox、Apache Felix和Spring DM(现在称为Spring OSGi),这三种流行的实现各有特点和优势。 1. **Equinox**:由Eclipse基金会维护,是OSGi R4规范的核心框架实现。Equinox以其稳定...

    osgi-SpringDM

    Spring-DM指的是 Spring ...Spring-DM 的主要目的是能够方便地将 Spring 框架和OSGi框架结合在一起,使得使用Spring的应用程序可以方便简单地部署在OSGi环境中,利用OSGi框架提供的服务,将应用变得 更加模块化。

    SpringDM开发文档

    《SpringDM开发文档》是关于SpringDM框架的详细技术指南,该框架是在OSGi环境中运行Spring应用程序的关键组件。SpringDM,全称为Spring Dynamic Modules,是Spring框架针对OSGi(Open Service Gateway Initiative)...

    osgi spring实例

    其中的jar包可能包括了OSGi运行时环境如Apache Felix或Equinox,Spring框架的核心库,以及可能的Spring DM(Dependency Manager,已被Spring OSGi替代)等组件。 标签"osgi springDM"进一步明确了关键技术和关注点...

    基于SpringDM的WEB应用开发

    Spring DM 1.1.x最大特性便...在多个Spring DM支持OSGi平台上运行)并且Spring DM Server并没有提供更多企业应用支持 不过对于刚 使用Spring DM进行WEB应用开发人来说成功地配置却不是件容易事,文档详细讲解了相关配置

    springDM+felix

    2. **Spring DM工作原理**:学习如何在OSGi环境中使用Spring DM配置服务,包括元数据描述、服务的声明式管理以及依赖注入。 3. **Apache Felix的使用**:掌握创建、部署和管理OSGi bundle的基本步骤,以及如何在...

    SpringDM笔记28-Spring And OSGi:Layers of Integration

    标题中的"SpringDM笔记28-Spring And OSGi:Layers of Integration"表明这是一篇关于Spring框架与OSGi(Open Service Gateway Initiative)集成的详细笔记。OSGi是一种模块化系统,它允许Java应用程序以模块化的方式...

    springDM开发指南(英文)

    《Spring Dynamic Modules (Spring DM) 开发指南》深入解析 ...通过深入理解Spring DM的核心概念、新特性以及打包部署的技巧,开发者能够充分利用OSGi的模块化优势,构建出更加健壮、灵活和可扩展的应用系统。

Global site tag (gtag.js) - Google Analytics