复制模式和扩展模式_扩展剂:模式还是反模式?

复制模式和扩展模式

扩展器模式在最近几年变得很流行,甚至已经在OSGi标准(例如,蓝图服务和Web应用程序规范)中使用。 在处女座,我们从一开始就与扩展程序一起工作,但是尽管它们具有优势,但它们仍有一些明显的缺点。 由于OSGi联盟正在考虑在其他规范中使用扩展器,因此我同意记录一些问题。

第一个困难是知道扩展器何时完成了捆绑包的处理。 例如,一旦驱动了任何束激活器,包含蓝图XML文件的束将转换为ACTIVE状态。 但这还不是全部。 管理员对何时可以使用捆绑软件感兴趣,因此处女座中的管理代码会跟踪扩展程序的进度,并为代表捆绑软件的安装工件提供混合状态。 安装工件会一直处于STARTING状态,直到发布了应用程序上下文为止,此时该应用程序过渡到ACTIVE。 如果没有这样的附加基础架构,管理员将无法确定由扩展程序处理的捆绑包何时真正准备就绪。

那是成功的案例,但在错误案例中也有复杂之处。 第一个麻烦是,由于扩展程序在与安装捆绑软件的线程不同的线程中运行,因此,如果扩展程序抛出异常,则不会传播到安装捆绑软件的代码。 因此,安装程序需要以某种方式检查错误。 因此,处女座拥有检测此类错误并将其传播回启动捆绑软件部署的线程的基础架构:部署操作失败,并带有堆栈跟踪,指示出问题所在。

另一个错误并发症是处理扩展器的扩展器存在(可能不确定)延迟。 对于这种错误,Virgo会跟踪扩展程序处理的进度,并向事件日志发出警告(旨在引起管理员的注意),指出哪些处理过程已延迟以及在某些常见情况下(例如,当蓝图正在等待依赖项时) ,是什么导致延迟。

扩展程序需要能够查看包的生命周期事件,因此对于将框架进行分区的系统,必须将每个扩展程序安装到多个分区中。 另一方面,至关重要的是防止扩展程序的多个实例看到相同的捆绑事件,否则它们都将尝试扩展捆绑。

扩展器的另一个问题是需要使它们保持运行和健康,因为除了扩展器未处理的捆绑包外,几乎没有迹象表明扩展器发生故障或生病。 处女座小心确保其扩展器正确启动,其用于检测延迟的基础设施有助于诊断扩展器崩溃或疾病(这两种情况都是极为罕见的情况)。

将参数传递给扩展程序以影响其行为也存在一个问题。 通常,这是通过将扩展程序配置嵌入正在处理的束中或将包含片段的配置附加到扩展程序束中来完成的。 但是,由于扩展器不是由API驱动的,因此无法在调用时传递参数的常规方法。 本质上,扩展器模型意味着用于部署的编程模型仅限于BundleContext.installBundle。

通过在其他基础架构上进行大量投资,处女座设法合理地支持了Blueprint和Spring DM扩展器。 但是对于Web应用程序扩展器,Virgo无法使其足够强大,因此它直接从Virgo部署管道中驱动了基础Web组件,从而避免了上述问题。

我知道至少有另一个服务器运行时项目在扩展程序上遇到了类似的问题,因此处女座并不孤单。 在将安装程序与特定于资源的处理松散耦合,扩展程序模式的主要优势(但远非该模式唯一)与提供健壮的编程模型和可用的管理视图之间进行权衡取舍服务器运行时-如果没有扩展程序,这将更加直接。

参考: 扩展程序:模式还是反模式? 从我们的JCG合作伙伴 Glyn Normington在Mind the Gap博客中获得。


翻译自: https://www.javacodegeeks.com/2012/08/extenders-pattern-or-anti-pattern.html

复制模式和扩展模式

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/353566.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Ubuntu 18.04 下安装pip3及pygame模块

1.Ubuntu下pip3的安装、升级、卸载 安装pip3 sudo apt-get install python3-pip 升级pip3 sudo pip3 install --upgrade pip 卸载pip3 sudo apt-get remove python3-pip 2.安装pygame sudo pip3 install pygame 3.验证pygame是否安装成功,如果安装成功则会出现如下图…

linux 禁止账户远程登录

为了安全或其他原因,经常需要禁止某些用户远程登录,方法整理如下: 1. 禁止root账户远程登录 root账户下修改 /etc/ssh/sshd_config # vi /etc/ssh/sshd_config 找到 PermitRootLogin yes 这一句,将yes改成no,退出保存…

ANTLR和网络:一个简单的例子

网络上的ANTLR:为什么? 我开始在MS-DOS上编写我的第一个程序。 因此,我非常习惯在计算机上安装工具。 但是在2016年,网络无处不在,因此那里也可能需要我们的语言。 可能的情况: ANTLR 也在网络上&#xf…

下一秒

好想能看到 你嘴角微笑 最好在下一秒 好想能听到 你轻声歌唱 最好在下一秒 纯白棒球帽 墨绿色衣角 时间静止的美好 默契发生在每个下一秒 爱上同一种口味的蛋糕 不约而同哼唱一段曲调 喜欢这样看你傻傻的笑 好想能这样 就白头到老 最好从下一秒 转载于:https://www.cnblogs.com…

类加载器 jboss_JBoss AS 7类加载说明

类加载器 jboss这是示例章节,摘自Francesco Marchioni编辑的JBoss AS 7 Configuration Deployment and Administration一书,该书正在运行一个名为mastertheboss.com的JBoss门户。 根据Java EE规范的要求,理想情况下,应用程序服务器…

【转】Docker 容器化核心概念

DockerVM vs DockerDocker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口。 示例一&…

弹簧活性样品

Spring-Reactive旨在为基于Spring的项目带来响应式编程支持 ,并且有望在Spring 5的时间表中提供。 我的意图是使用此模型为REST端点行使一些非常基本的签名。 在继续之前,请允许我确认整个样本完全基于塞巴斯蒂安德勒兹(SbastienDeleuze&…

团队作业_1_博客1(分工理解)

对于团队大作业分工(服务端)的理解: 这次大作业一经出炉,还是感觉很有意思的,虽然之前老师已经提及会出这么一个大作业来训练我们的能力,但是真的看到作业的出现,还是很惊喜的。 团队作业的分工…

pojo类继承pojo类_如何编写更好的POJO服务

pojo类继承pojo类在Java中,您可以轻松地在Plain Old Java Object(POJO)类中实现一些业务逻辑,并且可以在高级服务器或框架中轻松运行它们。 有许多服务器/框架,例如JBossAS,Spring或Camel等,它们…

国外机构操盘图

转载于:https://www.cnblogs.com/carl2380/p/9139020.html

代码气味–第二部分

在上一篇文章《代码气味–第一部分》中 ,我谈到了膨胀器:它们是代码气味,可以识别为长方法,大型类,基元痴迷,长参数列表和数据块。 在这一篇中,我想深入研究面向对象的滥用者和变更阻止者 。 面…

solr 启动、停止

启动命令: solr start 停止命令 solr stop -all 转载于:https://www.cnblogs.com/yby120/p/9139791.html

第一篇博客测试

第一次发博客测试,看看都能进行什么操作。 再编辑一下,发表的时间就又改了? 没想到这个测试也有这么多人访问,那我把我的测试结果也贴出来供大家参考: 1. 无论怎么编辑,发表时间不会更改; 2. 编…

hadoop 提交程序并监控运行

程序编写及打包 使用maven导入第三方jar pom.xml <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation&qu…

digester_Apache Digester示例–轻松配置

digester解决问题–硬编码&#xff0c;需要为您的应用程序创建自定义配置&#xff0c;例如struts配置文件&#xff0c;仅通过更改文件即可改变应用程序的行为。 Apache Digester可以轻松为您完成此任务。 使用Apache Digester相当容易将XML文档转换为相应的Java bean对象层次结…

MFC状态栏编程(显示系统时间和进度条)

显示系统时间 1、 在状态栏中设置两个新的栏位Timer和Progress。首先到ResourceView中编辑String Table&#xff0c;增加IDS_TIMER(时间),PROGRESS(进度)。然后在MainFrame中修改indicators数组&#xff0c;插入IDS_TIMER和IDS_PROGRESS。插入的位置&#xff0c;即为显示的位置…

极光推送服务端API(定时推送任务,推送到指定设备,推送到所有设备)

极光推送常用的几个api方法总结&#xff0c;抽取出了utils类&#xff0c;利用MsgType进行业务类型区别&#xff0c;方便app端收到推送后进行不同处理&#xff1a; 首先引入依赖&#xff1a; <!-- 极光推送 --><dependency><groupId>cn.jpush.api</groupId…

Java 9附加流

Java 9即将发布&#xff01; 它不仅仅是Jigsaw项目 。 &#xff08;我也很惊讶。&#xff09;它给平台带来了很多小的变化&#xff0c;我想一一看一下。 我将标记所有这些帖子&#xff0c;您可以在这里找到它们。 让我们从…开始 流 Streams学习了两个新技巧。 第一个处理前缀…

MFC注册快捷键

1. 使用RegisterHotKey()注册快捷键&#xff1b;2. OnHotKey()函数中响应快捷键&#xff1b;3. 程序退出时&#xff0c;使用UnregisterHotKey(hWnd, m_HotKeyId)取消快捷键注册。

Hibernate---对象的三种状态

Hibernate---对象的三种状态 简而言之&#xff0c;hibernate本就是面向对象的基于ORM的框架&#xff0c;位于dao层&#xff0c;对数据进行操作的框架。我就谈谈hibernate的对象的三种状态。他们分别为&#xff1a;游离&#xff0c;持久和瞬时。通过代码来详解一下吧。 hibernat…