`
wyuxiao729
  • 浏览: 34720 次
  • 性别: 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 入门+进阶+实战

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

    基于osgi框架实战源码

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

    OSGI实战.docx

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

    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 实战教程

    它通过提供一个服务导向的架构,使得组件可以独立地安装、升级、激活和停用,从而解决了Java应用程序的复杂性和可维护性问题。在本教程中,我们将深入探讨OSGI的核心概念、其在实际开发中的应用以及如何利用OSGI构建...

    osgi服务(加法和乘法)

    综上所述,这个压缩包文件可能包含两个Java项目或bundle,分别实现了加法和乘法的运算逻辑,并封装为OSGi服务。使用者可以通过启动对应的bundle来选择执行加法还是乘法运算,展示了OSGi框架在动态服务发现和交互方面...

    OSGi原理与最佳实践(完整版)&OSGi_in_action

    7. **最佳实践**:提供在实际项目中应用OSGi的建议,如如何设计模块化的系统架构,如何进行测试和调试,以及性能优化策略。 《OSGi in Action》可能涵盖: 1. **实战指南**:通过实际案例,展示如何将OSGi应用于...

    OSGI进阶实战教程

    OSGi学习不错的材料 OSGi学习不错的材料 OSGi学习不错的材料 OSGi学习不错的材料

    OSGI 开发文档中文的

    9. **实战应用**:"OSGI实战.pdf"可能包含实际项目案例,演示如何在真实场景中应用OSGI解决特定问题。 通过阅读这份文档和解压后的"dist.rar"和"code.rar"文件,你不仅可以深入了解OSGI技术,还能获得实践经验,...

    osgi服务发布和获取方式

    OSGi(Open Service Gateway Initiative)是一种动态模块化的服务平台,能够动态地管理和部署服务。OSGi 服务发布和获取方式是 OSGi 框架中的一种核心机制,用于发布和获取服务。下面将详细介绍 OSGi 服务发布和获取...

    osgi重要文档--osgi核心规范文档,osgi服务文档,osgi-最佳原理与实践(王昊编著,共79页)

    这个压缩包包含了关于OSGI的重要文档,分别是“OSGi R4核心规范文档”、“OSGi服务文档”以及“OSGi-最佳原理与实践”(王昊编著)。下面将详细介绍这些文档所涵盖的关键知识点。 首先,"OSGi R4核心规范文档"是...

    eclipse下构建spring与OSGI项目

    本教程将详细讲解如何在Eclipse环境中构建一个整合了Spring和OSGi的项目。 首先,我们需要了解Spring框架。Spring以其依赖注入(Dependency Injection,DI)和面向切面编程(Aspect-Oriented Programming,AOP)的...

    OSGi原理与最佳实践pdf下载(完整版)

    OSGI原理与最佳实践的完整版,共12...第1 章OSGi 简介 第2 章OSGi 框架简介 第3 章基于Spring-DM 实现Petstore 第4 章基于Apache CXF 实现分布式Petstore 第5 章构建OSGI Bundle Repositor'y 第6 章OSGi 规范解读 ……

    OSGi 入门 学习 实战 进阶

    《OSGi实战》这本书可能涵盖了如何在实际项目中应用OSGi技术,包括Bundle的创建、服务的注册和发现、依赖管理等方面。通过这本书,读者可以了解到如何将复杂的程序分解为小型、可重用的模块,以及如何利用OSGi的生命...

    OSGI服务 DS EVENT

    DS(Declarative Services)是OSGI中的一个核心服务,它提供了声明式的方式来管理和装配服务。而EVENT则是DS中关于事件处理的部分,用于在OSGI组件之间传递信息和协调工作。 OSGI服务是一种动态的服务注册和发现...

    两个osgi的例子程序

    总之,这个压缩包和相关博客文章为我们提供了一个学习OSGi实战经验的机会,涵盖了从基础概念到具体实践的多个方面。通过研究源码和工具,我们可以深入理解OSGi如何实现模块化,以及如何利用这一技术来构建更灵活、更...

    OSGI 入门资料PDF

    OSGI(Open Services Gateway Initiative)是一种开放标准,用于创建模块化和动态的Java应用程序。它为Java开发人员提供了一个框架,使他们能够构建可热插拔的组件,从而实现更灵活、可扩展和可维护的软件系统。在本...

    OSGI原理与最佳实践

    资源名称:OSGI原理与最佳实践内容简介:国内第一本OSGi图书OSGi国内推广者林昊多年经验的结晶涵盖OSGi从入门到深入的知识体系引领OSGi国内研究和普及本书基于作者多年使用OSGi的经验而编写,涵盖了OSGi从入门到深入...

Global site tag (gtag.js) - Google Analytics