[转载]使用 Apache Geronimo 和 POJO 构建 SOA 框架
使用 Apache Geronimo 和 POJO 构建 SOA 框架
在不考虑库和框架强制执行的应用程序编程接口 (API) 约束的情况下进行软件开发,是一个非常诱人主张。它使许多人接受了普通旧式 Java™ 对象(Plain Old Java™ Object,POJO)编程的范例 —— 能够在 Java 平台上开发软件,而无需使用多余的接口或第三方 API。Apache Geronimo 框架为构建复杂应用程序和服务的 POJO 开发提供了一个可靠的基础设施。本文介绍 Geronimo 框架的一些组件和技巧,用于通过 POJO 策略来实现成功的、面向服务的开发。
面向服务的架构 (SOA) 和面向服务的编程 是两个术语,指软件工程的风格,它们将业务逻辑封装为模块化服务。这些服务以动态运行时环境为目标,在该环境中,服务提供者和服务消费者之间的关联是松散 耦合的。松散耦合的服务通常没有任何编译时关联,所以在运行时,您可以动态地将它们链接在一起,并允许开发人员根据需要灵活地做出开发决策。除松散耦合之 外,下列概念也是面向服务的环境中的公共概念:
- 粗粒度:服务的粒度是指服务公开给出的功能范围。细粒度的服务 表示定义一定程度的功能性的公共接口。粗粒度的服务 表示较一般程度的功能性,通常适合于给定的业务领域。
- 位置透明度 (Location transparency):位置透明度是指客户机在不考虑位置的情况下访问网络上的服务。
- 协议独立性:协议独立性指客户机在不考虑通信/网络协议的情况下访问服务。
将服务与这些概念绑定在一起是一项艰难的任务。但 POJO 编程可以简化这一任务。
POJO 简介
POJO 是无需遵循特定外部接口或第三方 API 的 Java 类。此功能本身就是取消代码与外部关联的耦合。去耦的主要好处之一是让软件开发人员无需开发辅助任务(如持久性、事务支持和远程操作)。许多技术消除了组件/类的去耦,并促进了 POJO 编程,包括:
- 注释是开发工具使用的、并用于生成代码的元数据,它可以 “装饰” 一个类或部分类,以支持给定类型的功能或特性,如远程操作、持久性和框架支持。
- 依赖性注入是构建插入式 组件的技术,对象创建和关联是从组件移除的,并由容器或汇编组件实现。
- 反射是运行时发现的关于给定类或接口的信息,如方法、字段和构造函数。
每种去耦技术都有其优点和缺点。本文将通过 POJO 编程构建一个简单的 SOA 框架,它使用反射和 Geronimo 的 GBean 依赖性注入来让组件去耦。
|
|
JMX 和 Geronimo
Geronimo 构建在通用的内核基础上,它使用 Java Management Extensions (JMX) 和称为 GBean 的托管组件的依赖性注入框架。实际上,Geronimo 中的每件事物(适配器、应用程序和容器等)即是一个 GBean,也以 GBean 为基础。GBean 与 JMX 和 JMX Managed Beans (MBeans) 共享许多相似点和相同的底层基础设施。
|
Geronimo 的 GBean 框架
GBean 是 Geronimo 中的托管组件,这些组件共享许多相似点以及与 JMX MBean 的关系,如根据名为 GBeanInfo 的类公开属性和操作,该类与 JMX 替代物 MBeanInfo 类非常相似。Geronimo 将 MX4J 库(请参阅本文结尾的 参考资料)用作其 JMX 的实现。
GBean 维护状态和关联依赖性,并处理生命周期事件。GBean 可以注册为其他 GBean 状态中的相关方。启动相关 GBean 后,它将通过依赖性注入收到相关 GBean 的引用。GBean 在任何给定的时间可以处于下列七个生命周期状态之一:
- 已加载
- 未加载
- 将要开始
- 正在运行
- 将要停止
- 已停止
- 失败
清单 1 给出了一个包含一个属性(消息)的简单 GBean。
清单 1. 典型的 GBean
public class TestGBean implements GBeanLifecycle{ private static GBeanInfo GBEAN_INFO = null; static { GBeanInfoBuilder infoFactory = GBeanInfoBuilder.createStatic(TestGBean.class); infoFactory.addAttribute("message", String.class, true); infoFactory.addOperation("getMessage"); GBEAN_INFO = infoFactory.getBeanInfo(); } private String message; public String getMessage() { return message; } ...} |
您可以使用 清单 2 中给出的代码来启动(激活)和停止 GBean。
清单 2. 启动典型的 GBean
ObjectName testGBeanOName = ObjectName.newInstance("jeffhanson.test:ID=test");GBeanData gBeanData = new GBeanData(testGBeanOName, TestBean.GBEAN_INFO);gBeanData.setAttribute("message", "Hello world");geronimoKernel.loadGBean(gBeanData, Thread.currentThread(). getContextClassLoader());geronimoKernel.startGBean(testGBeanOName);...geronimoKernel.stopGBean(testGBeanOName);geronimoKernel.unloadGBean(testGBeanOName); |
您可以在整个 Geronimo 内核中大量地使用 GBean。
|
|
Geronimo 内核
Geronimo 内核 是 GBean 的一个框架。使用此框架,您可以建模并构建任何复 杂的系统作为一组 GBean 容器和 GBean 组件,来管理状态、关系和事件处理。
使用 KernelFactory 类,以编程方式创建 Geronimo 内核是一个非常简单的过程。清单 3 说明如何通过启动内核、记录启动时间和加载并启动 servlet GBean 来创建名为 TestGeronimo 的新 Geronimo 内核。
清单 3. 创建一个简单的 Geronimo 内核
try{ Kernel geronimoKernel = BasicKernelFactory.newInstance(). createKernel("TestGeronimo"); geronimoKernel.boot(); log.debug("Geronimo BootTime: " + geronimoKernel.getBootTime()); // add the servlet GBean ObjectName servletObjName = new ObjectName("jeffhanson.test:ID=MyGBean"); GBeanData servletGBeanData = new GBeanData(servletObjName, GBEAN_INFO); ClassLoader classLoader = getClass().getClassLoader(); geronimoKernel.loadGBean(servletGBeanData, classLoader); geronimoKernel.startGBean(servletObjName);}catch (Exception e){ log.error(e);} |
创建并运行内核后,调用 POJO 服务上的方法就变成了练习使用 Geronimo 内核服务器及其反射功能,如 清单 4 所示。
清单 4. 调用注册到内核的服务上的调用
private staticObject invokePOJOService(ObjectName serviceObjName, String operationName, String[] params) throws Exception{ String[] paramTypes = null; if (params != null && params.length > 0) { paramTypes = new String[params.length]; for (int i = 0; i < params.length; i++) { paramTypes[i] = params[i].getClass().getName(); } } Kernel geronimoKernel = KernelManager.getInstance().getGeronimoKernel(); Object retVal = geronimoKernel.invoke(serviceObjName, operationName, (Object[])params, paramTypes); return retVal;} |
|
|
Geronimo 中面向服务的 POJO 的可适应框架
本 文中引用的用于 SOA 的 POJO 框架使用 Geronimo 内核实例将 POJO 注册为 GBean,相关客户机可以查询并调用它们,而无需其他接口或 API。框架驻留在多层企业级应用程序环境中的业务层中。服务定位符类负责与内核交互,以查找并注册(如果需要) 用作服务的 POJO。然后服务定位符类将 POJO 返回到调用它们的业务委派组件。图 1 说明了框架中组件的关系。
图 1. 用于 SOA 的 POJO 框架
该框架旨在从客户机接收 HTTP 请求,然后将请求传递到调度程序组件,该组件会发送消息,并将请求分派给业务委派组件。 然后,业务委派组件使用服务定位符找到特定请求的服务。业务委派组件调用该服务,并将任何返回值打包为模型对象。适当的视图组件将处理模型对象,并返回它作为对客户机的格式化响应。图 2 中的顺序图说明了这些步骤。
图 2. 典型 HTTP 请求和服务调用的往返顺序
图 3 中的类图说明了框架的类之间的关系。
图 3. 框架的类之间的关系
|
|
部署并运行框架
框架驻留在企业级应用程序系统的业务层中。该框架公开一个接收 HTTP 请求的 servlet,并将内容分派给框架进行处理。下一节将阐述简单的部署过程。
部署框架
您可以将框架的类和企业级应用程序打包在 .war 文件中,将其放置在 geronimo_home/deploy 目录下。如果此目录不存在,就创建它。
Geronimo 在启动时会自动部署 .war 文件。放置在 deploy 目录中的应用程序是热加载的,允许 Geronimo 在您做出更改时能够在运行时重新加载应用程序。这样使调试应用程序变得非常便利。
测试框架
您可以使用位于 geronimo_home/bin 目录中的启动脚本(startup.bat 或 startup.sh)启动 Geronimo 应用服务器。当调用 Geronimo 启动脚本时,可以看到 Geronimo 控制台窗口。部署框架和应用程序后,启动时的 Geronimo 控制台窗口包含类似于 清单 5 所示的行,确认 Web 应用程序已经成功启动。
清单 5. Web 应用程序已经成功启动的确认
0 [main] DEBUG org.apache.geronimo.kernel.basic.BasicKernel -Starting boot422 [main] DEBUG org.apache.geronimo.gbean.runtime.GBeanInstanceState- GBeanInstanceState for: :role=Kernel State changed from stopped tostarting422 [main] DEBUG org.apache.geronimo.gbean.runtime.GBeanInstanceState- GBeanInstanceState for: :role=Kernel State changed from starting torunning422 [main] DEBUG org.apache.geronimo.kernel.basic.BasicKernel -Booted640 [main] DEBUG com.jeffhanson.apptier.FrontController - GeronimoBootTime: Sat May 20 18:51:08 MDT 2006656 [main] DEBUG org.apache.geronimo.gbean.runtime.GBeanInstanceState- GBeanInstanceState for: jeffhanson.test:ID=FrontController Statechanged from stopped to starting656 [main] DEBUG org.apache.geronimo.gbean.runtime.GBeanInstanceState- GBeanInstanceState for: jeffhanson.test:ID=FrontController Statechanged from starting to running |
现在,在 Web 浏览器窗口键入以下 URL,以激活 HelloWorld 服务上的 setMessage 操作:
http://:/?Action=
HelloWorld&Operation=setMessage&Params=Hello+everybody!
当框架处理请求时,控制台的输出结果应类似于 清单 6 所示。
清单 6. setMessage 操作处理的输出结果
719 [main] DEBUG com.jeffhanson.businesstier.ServiceLocator -Adding service [HelloWorld] to kernel...719 [main] DEBUG com.jeffhanson.businesstier.ServiceLocator -Loading GBean: jeffhanson.test:Name=HelloWorld,Type=GenericService734 [main] DEBUG org.apache.geronimo.gbean.runtime.GBeanInstanceState- GBeanInstanceState for:jeffhanson.test:Name=HelloWorld,Type=GenericService State changedfrom stopped to starting734 [main] DEBUG org.apache.geronimo.gbean.runtime.GBeanInstanceState- GBeanInstanceState for:jeffhanson.test:Name=HelloWorld,Type=GenericService State changedfrom starting to running |
在 Web 浏览器窗口中键入以下 URL,以激活 HelloWorld 服务上的 sayHello 操作:
http://:/?
Action=HelloWorld&Operation=sayHello
当框架处理请求时,控制台的输出结果应类似于 清单 7 所示。
清单 7. sayHello 操作处理的输出结果
750 [main] DEBUG com.jeffhanson.businesstier.ServiceLocator -serviceObjName: jeffhanson.test:Name=HelloWorld,Type=GenericService750 [main] DEBUG com.jeffhanson.businesstier.ServiceLocator -Service [HelloWorld] already in kernel1156 [main] DEBUG com.jeffhanson.businesstier.ServiceLocator -serviceObjName: jeffhanson.test:Name=HelloWorld,Type=GenericService1156 [main] INFO com.jeffhanson.businesstier.services.HelloWorld -Hello everybody! |
当 servlet 引擎关闭 servlet,并调用 servlet 上的 destroy 方法时,servlet 会关闭 Geronimo 内核。当 servlet 引擎关闭 servlet 时,您控制台的输出结果应类似于 清单 8 所示。
清单 8. servlet 关闭后的输出结果
1156 [main] DEBUG org.apache.geronimo.kernel.basic.BasicKernel -Starting kernel shutdown1156 [main] DEBUG org.apache.geronimo.kernel.basic.BasicKernel -Kernel shutdown complete |
HelloWorld 类是带有 setMessage 方法、getMessage 方法和 sayHelloWorld 消息的简单 POJO。向 Geronimo 内核注册此类的实例后,您可以动态地调用该实例,并在运行时,使用依赖性注入将其与其他服务和组件关联。清单 9 中的代码说明了简单的 HelloWorld POJO 类。
清单 9. 简单的 HelloWorld 服务
package com.jeffhanson.businesstier.services; import org.apache.log4j.Logger; public class HelloWorld{ private static Logger log = Logger.getLogger(HelloWorld.class); private String message = "Hello world"; public void setMessage(String message) { if (message == null || message.length() <= 0) { throw new RuntimeException("HelloWorld.setMessage " + "param is not set"); } this.message = message; } public String getMessage() { return message; } public void sayHello() { log.info(message); }} |
|
|
结束语
设 计可以对业务更改和事件做出及时响应的敏捷而又有效的 SOA 是一项复杂的任务,但是,围绕适当设计的 POJO 层构建的 SOA 可以帮助简化这一任务。Geronimo 平台提供了框架和工具,您可以使用它通过 POJO 构建灵活的、可扩展的和可维护的 SOA。
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/374079/viewspace-130287/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/374079/viewspace-130287/
[转载]使用 Apache Geronimo 和 POJO 构建 SOA 框架相关推荐
- [转载]权衡 Apache Geronimo EJB 事务选项,第 3 部分: 综合所有事务
权衡 Apache Geronimo EJB 事务选项,第 3 部分: 综合所有事务 Jonathan Sagorin 在 由三部分组成的系列文章 的最后一部分中对 Enterprise Java™B ...
- [转载]使用 XMLBeans 在 Apache Geronimo 中部署 SOA 应用程序
使用 XMLBeans 在 Apache Geronimo 中部署 SOA 应用程序 对 XMLBeans 好奇吗?这种高级易用的 XML-Java 绑定技术允许您像访问任何 Java™ 对象或 Ja ...
- Apache Geronimo Remote Code Execute Vulnerability
简介: Apache Geronimo 是 Apache 软件基金会的开放源码J2EE服务器,它集成了众多先进技术和设计理念. 这些技术和理念大多源自独立的项目,配置和部署模型也各不相同. Geron ...
- java.lang.NoClassDefFoundError: org/apache/geronimo/mail/util/Base64Encod——解决方案
最近在弄通过javaMail发送信息到邮箱,老是会报这样的错误:Exception in thread "main" java.lang.NoClassDefFoundError: ...
- Apache Geronimo 介绍
Apache Geronimo 介绍 1. Apache Geronimo 是 Apache 软件基金会的开放源码J2EE服务器,它集成了众多先进技术和设计理念.
- Apache Geronimo 2.2发布
Apache Geronimo 是一个由 Apache Software Foundation 开发的开源 J2EE 应用服务器项目,其发行许可证是 Apache License, Version 2 ...
- 淘宝SOA框架dubbo学习(2)--搭建Zookeeper注册中心服务
2019独角兽企业重金招聘Python工程师标准>>> 继上一篇博文, 淘宝SOA框架dubbo学习(1) http://my.oschina.net/hanshubo/blog/3 ...
- Unity3D游戏引擎之构建游戏框架与导出IOS项目(一)
Unity3D游戏引擎之构建游戏框架与导出IOS项目 雨松MOMO原创文章如转载,请注明:转载至我的独立域名博客雨松MOMO程序研究院,原文地址:http://www.xuanyusong.com/a ...
- soa框架_SOA之外:动态业务应用程序的新型框架-第二部分
soa框架 第二部分–在实践中构建动态业务应用程序–两个自适应系统的故事 生产力的提高是提高生活水平的基石. 美国的经验表明,长期强劲的生产率增长的特征是技术创新,伴随着组织结构和商业融资安排的变化以 ...
- 通过 DLPack 构建跨框架深度学习编译器
通过 DLPack 构建跨框架深度学习编译器 深度学习框架,如Tensorflow, PyTorch, and ApacheMxNet,快速原型化和部署深度学习模型提供了强大的工具箱.不幸的是,易用性 ...
最新文章
- SparkStreaming从Kafka读取数据两种方式
- Exchange2010 初始化失败
- google四件套之Dagger2
- oracle别名用双引号,Oracle别名大小写 -----解决方案
- 1.4.在TypeScript中使用JQuery
- centos 关闭开启防火墙
- [javaEE] EL表达式调用java方法
- 【elasticsearch】Elasticsearch : alias数据类型
- 如果把Python代码写成这样子就太难看了
- 说不尽的 π —— π 的近似计算
- [Hive]Hive合并小文件
- 云端服务器只能查看文件,云端服务器只能查看文件夹
- 判断最小生成树的唯一性
- 微软和美国航空航天局(NASA)强强联手,推出Python免费课程
- EasyPlayer-Android互联网直播视频播放器是如何实现播放器退到后台后再回到前台时,播放画面无缝衔接?
- 汽车装配线粘合剂市场现状及未来发展趋势
- 亿愿Word文档批量多语言翻译---word文档翻译专家!几十种语言随意快速互译!可以生成中外文,中英文对照内容文档!
- 泛型中extends和super的区别
- javac -d,-cp是什么意思
- 怎么用计算机画爱心,怎么用cad画爱心