`
wyuxiao729
  • 浏览: 34565 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

osgi实战项目(osmp)一步一步玩转osgi之第一个服务(7)

    博客分类:
  • osgi
阅读更多

前面几篇文章已经讲了一些组件了,今天我们就开始实实在在的动手三分钟完成我们的第一个业务bundle,写一个服务提供对数据的CRUD功能。

 

我们写一个demo完成学生信息的crud功能。

 

1、进入osmp下载目录,复制粘贴osmp-utils 并改名为 osmp-demo

2、进入osmp-demo目录,修改pom.xml为以下内容

 

 

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>
	<parent>
		<groupId>com.osmp.baseweb</groupId>
		<artifactId>osmp-parent</artifactId>
		<version>1.0.0</version>
	</parent>

	<artifactId>osmp-demo</artifactId>
	<packaging>bundle</packaging>
	<name>osmp-demo</name>

	<build>
		<plugins>
			<plugin>
				<groupId>org.apache.felix</groupId>
				<artifactId>maven-bundle-plugin</artifactId>
				<extensions>true</extensions>
				<configuration>
					<instructions>
						<Bundle-SymbolicName>${project.artifactId}</Bundle-SymbolicName>
						<Export-Package></Export-Package>
						<Import-Package>
							org.springframework.aop,
							org.springframework.aop.framework,
							org.springframework.cglib,
							org.springframework.cglib.proxy,
							org.springframework.cglib.core,
							org.springframework.cglib.reflect,
							org.aopalliance.aop,
							org.aopalliance.intercept,
							*;resolution:=optional
						</Import-Package>
					</instructions>
				</configuration>
			</plugin>
		</plugins>
	</build>

	<dependencies>
		<dependency>
			<groupId>com.osmp.baseweb</groupId>
			<artifactId>osmp-intf-define</artifactId>
			<version>${osmp.version}</version>
		</dependency>
		<dependency>
			<groupId>com.osmp.baseweb</groupId>
			<artifactId>osmp-jdbc</artifactId>
			<version>${osmp.version}</version>
		</dependency>
		
		<dependency>
			<groupId>org.springframework.osgi</groupId>
			<artifactId>spring-osgi-core</artifactId>
		</dependency>
		
		<dependency>
			<groupId>org.osgi</groupId>
			<artifactId>org.osgi.core</artifactId>
		</dependency>
		
	</dependencies>
</project>

 

 

  • osmp-inf-define 组件是我们基础服务定义接口,业务开发需要实现里面的BaseDataService接口
  • osmp-jdbc 是我们需要用到OSMP提供的数据源和封装好的dao模板功能。
  • spring-osgi-core,org.osgi.core 照抄,springDM必须依赖。
  • maven-bundle-plugin 插件是maven提供的在osgi环境下编译bundle的插件。先暂时照抄,以后再解释。

3、删除utils组件里类和配置,并修改包名,最后包结构如下:

osmp-demo    

          |src  |main | java | com/osmp/demo/service

                           | resources  | META-INF/spring

                  |test  | java

                           | resources

          |pom.xml

 

4、在osmp根目录下的父 pom.xml里 <modules></modules> 新增 <module>osmp-demo</module>

5、打开 eclipse 右键 import -> Existing Maven Projects -> Browse... 选择 osmp 目录后。在下面的 Projects: 把osmp-demo勾取起后点 Finish

  


 

6、数据库新建表 demo_user 

 

CREATE TABLE `demo` (
  `id` varchar(50) NOT NULL,
  `name` varchar(255) DEFAULT NULL,
  `age` int(11) DEFAULT NULL,
  `remark` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

 

7、新建实体对象User.java

 

 /*   
 * Project: OSMP
 * FileName: User.java
 * version: V1.0
 */
package com.osmp.demo.service.user.entity;

import com.osmp.jdbc.define.Column;

/**
 * Description:
 * @author: wangkaiping
 * @date: 2016年8月25日 下午8:32:47上午10:51:30
 */
public class User {
	@Column(mapField="id",name="id")
	private String id;
	@Column(mapField="name",name="name")
	private String name;
	@Column(mapField="age",name="age")
	private int age;
	@Column(mapField="remark",name="remark")
	private String remark;

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public String getId() {
		return id;
	}

	public void setId(String id) {
		this.id = id;
	}

	public int getAge() {
		return age;
	}

	public void setAge(int age) {
		this.age = age;
	}

	public String getRemark() {
		return remark;
	}

	public void setRemark(String remark) {
		this.remark = remark;
	}

}

 

@Column( mapField=数据库字段名称,name=实体对象名称)如果两者一致的话可以省略括号内的内容

 

8、新建用户接口和实现类(UserService.java,UserServiceImpl)

 

/*   
 * Project: OSMP
 * FileName: UserService.java
 * version: V1.0
 */
package com.osmp.demo.service.user;

import java.util.List;
import java.util.Map;

import com.osmp.demo.service.user.entity.User;
import com.osmp.jdbc.define.Page;

/**
 * Description:
 * 
 * @author: wangkaiping
 * @date: 2014年11月28日 下午5:27:33
 */
public interface UserService {

	public String getUserName(String name);

	public int getUserAge(int age);
	
	public int cudUser(Map<String,Object> map);
	
	public List<User> queryList(Map<String, Object> map);
	
	public Page<User> queryListByPage(Map<String, Object> map);

}

 

/*   
 * Project: OSMP
 * FileName: UserServiceImpl.java
 * version: V1.0
 */
package com.osmp.demo.service.user.impl;

import java.util.Date;
import java.util.List;
import java.util.Map;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import com.osmp.jdbc.define.Page;
import com.osmp.jdbc.support.JdbcDao;
import com.osmp.cache.define.annotation.Cacheable;
import com.osmp.demo.service.user.UserService;
import com.osmp.demo.service.user.entity.User;

/**
 * Description:
 * 
 * @author: wangkaiping
 * @date: 2014年11月28日 下午5:28:39
 */
@Service
public class UserServiceImpl implements UserService {

	private Logger logger = LoggerFactory.getLogger(UserServiceImpl.class);

	@Autowired
	private JdbcDao jdbcDao;
	
	@Override
	public String getUserName(String name) {
		logger.info("==============demo test =========="+name);
		 //jdbcDao.update("jwms.update.area.time", "jwms", new Date(),"app001301");
		return "我的名字叫:" + name;
	}

	@Override
	public int getUserAge(int age) {
		return age;
	}

	@Override
	public int cudUser(Map<String, Object> map) {
		String sqlId = (String) map.get("sqlId");
		String dbName = (String) map.get("dbName");
		return jdbcDao.update(sqlId, map, dbName);
	}

	@Override
	public List<User> queryList(Map<String, Object> map) {
		String sqlId = (String) map.get("sqlId");
		String dbName = (String) map.get("dbName");
		return jdbcDao.queryForList(sqlId, dbName, map, User.class);
	}
	
	@Override
	public Page<User> queryListByPage(Map<String, Object> map) {
		String sqlId = (String) map.get("sqlId");
		String dbName = (String) map.get("dbName");
		int page = (int) map.get("page");
		int size = (int) map.get("size");
		return jdbcDao.queryForPage(sqlId, dbName, map, User.class, page, size);
	}

}

 

 

 9、 新建 DemoServiceImpl.java 实现BaseDataServices,最后osgi发布出的服务

 

 /*   
 * Project: OSMP
 * FileName: DemoServiceImpl.java
 * version: V1.0
 */
package com.osmp.demo.service;

import java.util.HashMap;
import java.util.Map;

import org.springframework.beans.factory.annotation.Autowired;

import com.osmp.demo.service.user.UserService;
import com.osmp.intf.define.model.Parameter;
import com.osmp.intf.define.service.BaseDataService;

/**
 * Description:
 * @author: wangkaiping
 * @date: 2016年11月9日 下午5:31:09上午10:51:30
 */
public class DemoServiceImpl implements BaseDataService{

	@Autowired
	private UserService service;
	
	@Override
	public Object execute(Parameter parameter) {
		Object result = null;
		String op = parameter.getQueryMap().get("op");
		Map<String,Object> paramMap = new HashMap<String, Object>();
		paramMap.putAll(parameter.getQueryMap());
		switch (op) {
		case "cud":
			result = service.cudUser(paramMap);
			break;
		case "query":
			result = service.queryList(paramMap);
			break;
		case "queryPage":
			result = service.queryListByPage(paramMap);
			break;
		default:
			break;
		}
		
		return result;
	}

}

 

  • 实现BaseDataService接口,重写execute方法
  • 从方法的Parameter获取入参 op 操作类型,并调用不同的方法完成crud
  • 这里方法传递我们使用map作为参数传递

10、在src/main/resources/META-INF/spring 目录下新建spring配置文件 bundle-context.xml

 

<?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:context="http://www.springframework.org/schema/context"
	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/context http://www.springframework.org/schema/context/spring-context-3.0.xsd
		http://www.springframework.org/schema/osgi http://www.springframework.org/schema/osgi/spring-osgi-1.2.xsd">

	<context:component-scan base-package="com.osmp.demo.service">
	</context:component-scan>
	
	
	<bean id="jdbcDao" class="com.osmp.jdbc.support.JdbcDao"></bean>
	
	<bean id="osmp.demo.service" class="com.osmp.demo.service.DemoServiceImpl" />
	<osgi:service interface="com.osmp.intf.define.service.BaseDataService"
		ref="osmp.demo.service">
		<osgi:service-properties>
			<entry key="name" value="osmp-demo" />
			<entry key="mark" value="DEMO例子" />
		</osgi:service-properties>
	</osgi:service>

</beans>

 

  • 这里我们的JdbcDao类是从依赖osmp-jdbc组件的。并在DemoServiceImpl里自动注入的。
  • 与传统的spring相比,只是在spring命名空间里新增了一个spring-osgi的namespaces
  • 通过osgi:service 将DemoServiceImpl 发布为一个osgi服务,服务名称为 osmp-demo 

11、编写sql脚本。demo.xml

 

<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
<!DOCTYPE sqls SYSTEM "osmp_sql.dtd">
<sqls>

	<select id="demo.queryuser">
		select * from demo_user 
		<where>
			<if test="name not empty">
				  and name=:name
			</if>
			<if test="age not empty">
				  and age=:age
			</if>
		</where>
	</select>
	
    <insert id="demo.adduser">
        insert into demo_user(id,name,age,remark) values(:id,:name,:age,:remark)  
    </insert>
    
    <delete id="demo.deluser">
	delete demo_user where id=:id
    </delete>
	
    <update id="demo.upuser">
	update demo_user set
        <if test="name not empty">
            name = :name
        </if>
        <if test="age not empty">
            name = :age
        </if>
        <if test="remark not empty">
            remark = :remark
        </if>
        <where>
        	id = :id
        </where>
    </update>
	
</sqls>

 

12、编写连接池配置文件 demo.osmp.jdbc.properties

 

osmp.jdbc.name=demo
osmp.jdbc.driverClassName=com.mysql.jdbc.Driver
osmp.jdbc.url=jdbc:mysql://10.2.1.9:3306/demo?autoReconnect=true&useUnicode=true&characterEncoding=UTF-8
osmp.jdbc.username=xxx
osmp.jdbc.password=xxx
osmp.jdbc.initialSize=5
osmp.jdbc.maxActive=100
osmp.jdbc.minIdle=5
osmp.jdbc.maxWait=3000
osmp.jdbc.validationQuery=select 1
osmp.jdbc.timeBetweenEvictionRunsMillis=100000
osmp.jdbc.minEvictableIdleTimeMillis=30000
osmp.jdbc.removeAbandonedTimeout=30000

 

 

13、将sql脚本和 连接池配置文件分别上传到${servicemix_home}/etc/sqls ${servicemix_home}/etc/datasources 目录

14、osmp-demo mvn install 将osmp-demo.jar上传到${servicemix_home}/deploy 目录

 

到此我们的服务开发完毕。

写道

新增一条数据

http://xxx.xxx.xxx.xxx:8181/cxf/service/osmp-demo?source={"from":"test"}&parameter={"dbName":"demo","op":"cud","sqlId":"demo.adduser","id":"100000","name":"zhangsang","age":"20","remark":'woshizhangsan"}

查询一条数据(根据名称查询)

http://xxx.xxx.xxx.xxx:8181/cxf/service/osmp-demo?source={"from":"test"}&parameter={"dbName":"demo","op":"query","sqlId":"demo.queryuser","name":"zhangsang"}

分页查询
http://xxx.xxx.xxx.xxx:8181/cxf/service/osmp-demo?source={"from":"test"}&parameter={"dbName":"demo","op":"queryPage","sqlId":"demo.queryuser","page":"1","size":"10"}

删除
http://xxx.xxx.xxx.xxx:8181/cxf/service/osmp-demo?source={"from":"test"}&parameter={"dbName":"demo","op":"cud","sqlId":"demo.deluser","id":"100000"}

 

  • osmp-demo 服务名称。对应上面spring配置文件里发布的osgi:service里的 服务名称 name
  • source={“from”:“test”} 这里是OSMP规定的。用来标识请求来源的,可以自己扩充 from 字段必须有。
  • parameter json参数
  • dbName:数据库名称 这里我们是demo
  • op:我们在DemoServiceImpl里定义的操作符
  • sqlId:对于我们操行这个操作时需要使用到的sql脚本里的哪个一个sql语句
  • 其它的参数根据业务自己定义。

 

这里入参我是使用json的格式来定义的。可以无限扩充。

当你做完这一切的时候差不多三分钟的时候,你可以定义一个通用的增删改查服务。以后你只需要给一个sql的标识和一个数据库的名称。你就可以得到你想要的结果,根本只要会sql的就可以开发。是不是感觉有点儿意思了。。。。。

 

sql脚本基本上只要你能写出来的语句。都应该能被解析执行。下面的一些sql例子是真实线上跑起来的。大家可以看看。

 

 

 



 

 我真心觉得,osmp 已经被业务线给玩坏了。。。。

 

 感兴趣的同学可以把上面的demo部署后在osmp-web里进行实时管理。随时随地远程任意的替换和平滑升级。。。

 

感觉是不是开发一个osgi的服务是如此的简单了呢。。再也不用像eclipse那样新建plugin  工程。一个 一个的去选依赖的组件。。。。。。

 

 

今天就先到这儿吧,下一节我们会继续解讲osgi环境下集成cache组件。

 

  • 大小: 52.5 KB
  • 大小: 92.7 KB
  • 大小: 57.4 KB
分享到:
评论

相关推荐

    《OSGi实战》完整中文版

    《 OSGi实战》是学习OSGi的全面指导,利用与架构和开发人员相关的示例清楚地讲解OSGi概念,同时探讨了很多实践场景和技术,阐述了开发人员有多需要OSGi,怎么将OSGi嵌入其他容器中,将遗留系统移入OSGi的最佳实践,...

    OSGI实战教程

    在OSGI实战教程中,首先需要了解OSGI(Open Services Gateway Initiative)是一个由众多IT公司共同制定的Java模块化标准规范,旨在实现软件组件的热插拔和服务动态管理。OSGI技术允许应用程序通过动态地安装、启动、...

    osgi实战(pdf超请版)

    - **OSGI简介**:OSGI(Open Service Gateway Initiative)是一种模块化平台标准,用于构建可复用的服务和应用程序。它最初被设计用于服务网关设备,但逐渐成为Java平台上通用的模块化标准。 - **目标与愿景**:本书...

    osgi,林昊写的osgi实战和进阶

    OSGI(Open Services Gateway Initiative)是一种Java模块化系统,它允许开发者将应用程序分解为一系列可独立部署、更新和交互的服务。林昊所著的《OSGI实战》与《OSGI进阶》是深入理解OSGI技术的重要参考资料,适合...

    OSGi实战(OSGi规范制定者亲自撰写,汇集Apache项目技术实战经验),完整扫描版

    为了弥补OSGi规范在应用指导方面的不足,四位活跃在OSGi开发第一线的技术专家联手打造了《OSGi实战》。《OSGi实战》面向OSGi规范的使用者,系统、全面、深入地阐述OSGi的重要特性及其使用方法。《OSGi实战》还介绍了...

    OSGI实战和OSGI进阶打包提供

    1. 模块系统:OSGI的核心是模块化,每个模块称为Bundle,类似于Java中的JAR文件,但包含额外的元数据描述其依赖关系。 2. 服务:OSGI强调服务导向,允许模块之间通过服务接口进行通信,增强了组件间的解耦。 3. 生命...

    OSGi 入门+进阶+实战

    1. **模块系统**:OSGi的核心是模块化,每个模块称为一个Bundle,它包含类、资源和元数据。Bundle之间通过导出和导入包来实现依赖关系。 2. **生命周期管理**:OSGi Bundle有启动、停止、安装、更新和卸载等状态,...

    OSGi实战

    资源名称:OSGi实战内容简介:为了弥补OSGi规范在应用指导方面的不足,四位活跃在OSGi开发第一线的技术专家联手打造了《OSGi实战》。《OSGi实战》面向OSGi规范的使用者,系统、全面、深入地阐述OSGi的重要特性及其...

    基于osgi框架实战源码

    "osgi实战源码"这一描述进一步强调了这是一份可以动手实践的源代码,它以一个具体的购物车案例为背景,展示了如何在项目中运用OSGi技术。这个购物车实例旨在帮助开发者理解OSGi的灵活性、模块化特性以及其在可扩展性...

    OSGI资料,OSGI进阶,OSGI实战,OSGI入门和整合Spring

    OSGI(Open Services Gateway Initiative)是一种开放标准的Java模块化系统,它允许开发人员将应用程序分解为一组可独立更新和管理的模块。这些模块被称为服务,它们之间通过接口进行交互,使得OSGI环境下的组件化...

    OSGI实战中文版

    1. **OSGi基础**:首先,会介绍OSGi的基本概念,包括bundle、服务、生命周期管理等,以及OSGi框架如何处理模块间的依赖关系。 2. **Bundle的创建与管理**:阐述如何编写符合OSGi规范的Java代码,构建bundle,并且...

    OSGI实战+进阶

    1. **模块系统**:OSGI的基础是模块化,每个模块称为一个Bundle,它们有自己的类路径和生命周期。理解Bundle的概念及其与其他Java类加载器的区别至关重要。 2. **服务注册与发现**:OSGI强调服务导向,允许模块之间...

    OSGI实战.docx

    1. Equinox:由Eclipse基金会开发,是OSGI参考实现之一,广泛用于Eclipse IDE和其他企业级项目。 2. Oscar:Apache Felix项目的一部分,也是一个流行的开源OSGI实现。 3. Knopflerfish:轻量级且功能丰富的OSGI框架...

    OSGI实战及源码

    7. **Blueprint和Declarative Services**:讲解OSGI中两种常见的服务配置方式,Blueprint XML和Declarative Services,它们简化了服务的声明和管理。 8. **Equinox与Felix**:作为OSGI实现的两个主流框架,Equinox...

    OSGI实战(PDF)

    OSGI(Open Services Gateway Initiative)是一种Java平台上的模块化系统和服务标准,它允许软件开发者将应用程序分解为独立的、可热插拔的组件,这些组件称为“bundle”。OSGI实战这本书是面向对OSGI技术感兴趣的...

    osgi 实战 pdf

    《OSGi实战》一书由BlueDavy撰写,是一份详尽的OSGi入门与实战指南,适合初学者和有经验的开发者深入了解OSGi框架及其应用。以下是对该书籍核心知识点的总结: ### OSGi简介 OSGi(Open Service Gateway Initiative...

    OSGI实战.pdf

    1. **模块化**:OSGI的核心是模块化,它将Java应用程序划分为一个个独立的模块,每个模块称为一个Bundle。每个Bundle都包含自己的类路径,有自己的生命周期,并可以独立地安装、启动、更新和卸载。 2. **服务**:...

    OSGI合集 OSGi原理与最佳实践

    网上收集的OSGI资料. 包括: OSGi原理与最佳实践(精选版).pdf OSGI实战和源码.rar osgi进阶.pdf Introduce.OSGi.ppt OSGi.in.action.ppt r4.cmpn.pdf r4.core.pdf r4.enterprise.pdf

    OSGi实战 实例源代码

    这个“OSGi实战 实例源代码”是BlueDavy的opendoc《OSGi实战》一书中的配套实践代码,为初学者提供了深入理解OSGi机制的宝贵资源。通过这些源代码,读者可以更好地掌握OSGi的核心概念,包括服务、模块化、依赖管理和...

Global site tag (gtag.js) - Google Analytics