豪情万千的山羊 · JVM性能分析工具使用 | Fluid· 1 周前 · |
谦虚好学的路灯 · 7.4.5. 分析工具使用指南 — ...· 6 月前 · |
腹黑的篮球 · LeoFSにS3FS-Cでマウントまでやって ...· 7 月前 · |
酒量大的煎鸡蛋 · 部署到 Apache Karaf Red ...· 8 月前 · |
刚失恋的鸵鸟 · 荣耀magicbook15电脑保护壳-荣耀m ...· 4 周前 · |
潇洒的钥匙 · How do I install ...· 1 月前 · |
没有腹肌的甘蔗 · if限定版卡带插上3ds里还能再下载透魔篇吗 ...· 2 月前 · |
满身肌肉的炒饭 · 江苏省人民政府 政府办公室(厅)文件 ...· 2 月前 · |
欢快的南瓜 · 微软商店安装的软件在哪 ...· 3 月前 · |
端口聚合 apache karaf fuse |
https://access.redhat.com/documentation/zh-cn/red_hat_fuse/7.11/html-single/deploying_into_apache_karaf/index |
酒量大的煎鸡蛋
8 月前 |
Increase visibility into IT operations to detect and resolve technical issues before they impact your business.
Learn More Go to InsightsEngage with our Red Hat Product Security team, access security updates, and ensure your environments are not exposed to any known security vulnerabilities. Product Security Center
Keep your systems secure with Red Hat's specialized responses to security vulnerabilities. View Responses
摘要
红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。我们从这四个术语开始:master、slave、黑名单和白名单。由于此项工作十分艰巨,这些更改将在即将推出的几个发行版本中逐步实施。详情请查看我们的 CTO Chris Wright 信息 。
这部分包含开发人员的信息。
摘要
OSGi 规范通过定义运行时框架来支持模块化应用程序开发,以简化构建、部署和管理复杂应用程序。
Apache Karaf 是基于 OSGi 的运行时容器,用于部署和管理捆绑包。Apache Karaf 还提供原生操作系统集成,并可集成到操作系统中,作为服务集成,以便生命周期与操作系统绑定。 Apache Karaf 具有以下结构: Apache Karaf - 围绕 OSGi 容器实施的一个打包程序层,为将 OSGi 容器部署为运行时服务器提供支持。Fuse 提供的运行时功能包括热部署、管理和管理功能。 OSGi Framework - 实施 OSGi 功能,包括管理依赖关系和捆绑生命周期
Apache Karaf 使用以下功能扩展了 OSGi 层:
控制台
- 控制台管理服务,安装和管理应用程序及库,并与 Fuse 运行时进行交互。它提供了控制台命令来管理 Fuse 实例。请参阅
Apache Karaf 控制台参考
。
logging
- logging 子系统提供显示、查看和更改日志级别的控制台命令。
部署
- 支持使用捆绑包(
install 和
命令和热部署应用程序)手动部署 OSGi 捆绑包。请参阅
第 6.1 节 “热部署”
。
置备
- 提供多个安装应用程序和库的机制。请参阅
第 9 章
部署功能
。
配置
- 存储在
InstallDir
bundle:
start
/etc
文件夹中的属性文件将持续监控,并且更改以可配置的间隔自动传播到相关服务。
蓝图
- 是一个依赖项注入框架,简化了与 OSGi 容器的交互。例如,提供标准 XML 元素以导入和导出 OSGi 服务。当将 Blueprint 配置文件复制到热部署文件夹时,红帽 Fuse 会即时生成 OSGi 捆绑包,并实例化 Blueprint 上下文。
OSGi 联盟 是一个独立组织,负责定义 OSGi 服务平台版本 4 的特性和功能 。OSGi 服务平台是一组开放规范,可简化构建、部署和管理复杂软件应用程序。 OSGi 技术通常被称为 Java 的动态模块系统。OSGi 是 Java 的框架,它使用捆绑包模块化地部署 Java 组件并处理依赖项、版本控制、类路径控制和类加载。OSGi 的生命周期管理允许您在不关闭 JVM 的情况下加载、启动和停止捆绑包。 OSGi 为 Java、卓越的类加载架构和服务的注册表提供最佳的运行时平台。捆绑包可以导出服务、运行进程以及其依赖项。每个捆绑包都可以满足其由 OSGi 容器管理的要求。 Fuse 使用 Apache Felix 作为其默认的 OSGi 实施。框架层形成安装捆绑包的容器。框架以动态、可扩展的方式管理捆绑包的安装和更新,并管理捆绑和服务之间的依赖关系。
OSGi 框架包含以下内容: 捆绑 - 组成应用程序的逻辑模块。请参阅 第 1.5 节 “OSGi 捆绑包” 。 服务级别 - 提供模块及其所含组件之间的通信。这个层与生命周期层紧密集成。请参阅 第 1.4 节 “OSGi 服务” 。 生命周期阶段 - 提供对底层 OSGi 框架的访问。这个层处理单个捆绑包的生命周期,以便您可以动态管理应用程序,包括启动和停止捆绑包。 模块层 - 提供 API 以管理捆绑打包、依赖项解析和类加载。 执行环境 - JVM 的配置。此环境使用配置文件来定义捆绑包中可正常工作的环境。 安全层 - 基于 Java 2 安全性的可选层,额外限制和增强。 框架中的每个层取决于它下面的层。例如,生命周期层需要模块层。模块层可以在无生命周期和服务层的情况下使用。
OSGi 服务是一个 Java 类或服务接口,其服务属性定义为名称/值对。服务属性区分有同一服务接口的服务提供程序。 OSGi 服务由其服务接口定义语义,它作为服务对象实施。服务的功能由它实施的接口定义。因此,不同的应用程序可以实施相同的服务。 服务接口允许捆绑包通过绑定接口而不是实现交互。服务接口应尽可能少地指定一些实施详情。
在 OSGi 框架中,服务层使用发布、查找和绑定服务模型提供 第 1.5 节 “OSGi 捆绑包” 与所含组件之间的通信。服务层包含一个服务 registry,其中: 服务提供商在框架中注册服务,供其他捆绑包使用 Service requesters 查找服务并绑定到服务供应商 服务归所有,在捆绑包内运行。捆绑包在一个或多个 Java 接口下将服务的实施注册到框架服务 registry。因此,该服务的功能可供框架控制下的其他捆绑包使用,其他捆绑包可以查找并使用该服务。使用 Java 接口和服务属性执行查找。 每个捆绑包都可以使用其接口及其属性的完全限定名称在服务注册表中注册多个服务。捆绑包使用带 LDAP 语法的名称和属性来查询服务 registry。 捆绑包负责运行时服务依赖关系管理活动,包括发布、发现和绑定。捆绑包还可适应与捆绑包绑定的服务动态可用性(arrival 或 departure)带来的变化。 服务接口由捆绑包创建的对象实施。捆绑包可以: 当其注册状态更改时接收通知 OSGi 框架提供了事件通知机制,因此服务请求者可以在服务 registry 中的更改时收到通知事件。这些更改包括发布或检索特定服务以及何时注册、修改或取消注册服务。
当捆绑包想要使用服务时,它会查找该服务并以普通 Java 调用形式调用 Java 对象。因此,服务上的调用是同步的,并在同一线程中发生。您可以使用回调进行更异步处理。参数作为 Java 对象引用传递。对于 XML,不需要 marshall 或中间规范格式。OSGi 为服务不可用问题提供了解决方案。
除您自己的服务外,OSOS 框架还提供以下可选服务来管理框架的操作: 软件包管理服务 - 允许管理代理通过检查共享软件包的状态来定义用于管理 Java 软件包共享的策略。它还允许管理代理刷新软件包,并根据需要停止和重启捆绑包。此服务使管理代理可以在卸载或更新捆绑包时对任何共享软件包做出决定。 该服务还提供刷新从上次刷新后删除或更新的软件包,并明确解析特定捆绑包的方法。此服务也可以在运行时跟踪捆绑包之间的依赖关系,允许您查看哪些捆绑包会受到升级的影响。 启动级别服务 - 允许管理代理控制捆绑包的启动和停止顺序。该服务为每个捆绑包分配一个启动级别。管理代理可以修改捆绑包的启动级别,并设置框架的活跃启动级别,这将启动并停止适当的捆绑包。只有起始级别低于(或等于)的捆绑包,这个活跃的启动级别可以活跃。 URL 处理程序服务 - 动态地使用 URL 方案和内容处理程序扩展 Java 运行时,支持任何组件提供额外的 URL 处理程序。 权限管理员服务 - 启用 OSGi 框架管理代理以管理特定捆绑包的权限,并提供所有捆绑包的默认值。捆绑包可以具有一组用于验证是否有权执行特权代码的权限。您可以通过实时更改策略以及为新安装组件添加新策略来动态操作权限。策略文件用于控制可运行哪些捆绑包。 条件权限管理员服务 - 在检查权限时,使用权限扩展 Permission Admin 服务,可在特定条件为 true 或 false 时应用。这些条件决定了权限应用到的捆绑包选择。设置后会立即激活权限。 在 OSGi 服务 平台版本 4 规范中对 OSGi 框架服务进行详细介绍,请参阅 OSGi 联盟网页上 发布的 4 下载页面 。
除了 OSGi 框架服务外,OSOS 联盟还定义了一组可选的、标准化的编译服务。OSGi 编译服务为日志记录和首选项等任务提供 API。在 OSGi 联盟 Web 站点上 版本 4 下载页面 的 OSGi 服务平台 Service Compendium 中介绍了这些服务。 Configuration Admin compendium 服务类似于中央中心,可保留配置信息并将其分发给关注方。Configuration Admin 服务指定部署捆绑包的配置信息,并确保捆绑包在激活时接收这些数据。捆绑包的配置数据是一个名称值对列表。请参阅 第 1.2 节 “Apache Karaf 架构” 。
借助 OSGi,您将应用程序模块化到捆绑包中。每个捆绑包都是一个紧密耦合的、可动态加载的类、JAR 和配置文件的集合,该文件明确声明任何外部依赖项。在 OSGi 中,捆绑包是主要的部署格式。捆绑包(bundle)是打包在 JAR 中的应用程序,可以安装、启动、停止、更新和删除应用程序。 OSGi 为开发捆绑包提供了一个动态、简洁、一致的编程模型。开发和部署可通过从其实施中分离服务规格(Java 接口)来简化。 OSGi 捆绑包抽象允许模块共享 Java 类。这是静态的重复使用形式。当依赖捆绑包启动时,必须可用共享类。 捆绑包是 JAR 文件,在其 OSGi 清单文件中包含元数据。捆绑包包含类文件,以及可选的其他资源和原生库。您可以明确声明捆绑包中的哪些软件包在外部可见(导出的软件包)以及捆绑包需要哪些外部软件包(导入的软件包)。 模块层处理捆绑包与从其他捆绑包中打包和共享软件包之间的打包和共享。OSGi 框架会在捆绑包间动态地解决依赖项。框架执行捆绑包解析,以匹配导入和导出的软件包。它还可管理多个版本的部署捆绑包。
OSGi 使用图形模型进行类加载,而非树结构模型(供 JVM 使用)。捆绑可以以标准化的方式共享和重新使用类,不会加载运行时类冲突。 每个捆绑包都有自己的内部类路径,以便在需要时可以作为独立单元服务。 OSGi 中类载入的好处包括: 直接在捆绑包间共享类。不需要将 JAR 提升到父类加载程序。 您可以同时部署同一类的不同版本,且无冲突。
摘要
Apache Karaf 提供简单的命令行工具,用于启动和停止服务器。
部署 Apache Karaf 运行时的默认方法是将它部署为具有活跃控制台的单机服务器。您还可以在不控制台的情况下将运行时部署为后台进程。
您可以直接从安装的
bin
子目录中启动 Karaf 运行时,而无需修改您的环境。但是,如果您要在不同的文件夹中启动它,则需要将 glibc 安装的
bin
目录添加到
PATH
环境变量中,如下所示:
Windows
set PATH=%PATH%;InstallDir\bin
Linux/UNIX
export PATH=$PATH,InstallDir/bin`
如果您要从安装目录中启动 Quarkus 运行时,请使用以下命令: Windows
bin\fuse.bat
Linux/UNIX
./bin/fuse
如果 Karaf 启动正确,您应该在控制台中看到以下内容:
Red Hat Fuse starting up. Press Enter to open the shell now... 100% [========================================================================] Karaf started in 8s. Bundle stats: 220 active, 220 total ____ _ _ _ _ _____ | _ \ ___ __| | | | | | __ _| |_ | ___| _ ___ ___ | |_) / _ \/ _` | | |_| |/ _` | __| | |_ | | | / __|/ _ \ | _ < __/ (_| | | _ | (_| | |_ | _|| |_| \__ \ __/ |_| \_\___|\__,_| |_| |_|\__,_|\__| |_| \__,_|___/___| Fuse (7.x.x.fuse-xxxxxx-redhat-xxxxx) http://www.redhat.com/products/jbossenterprisemiddleware/fuse/ Hit '<tab>' for a list of available commands and '[cmd] --help' for help on a specific command. Open a browser to http://localhost:8181/hawtio to access the management console Hit '<ctrl-d>' or 'shutdown' to shutdown Red Hat Fuse. karaf@root()>
自 Fuse 6.2.1 起,启动控制台模式会创建两个进程:父进程
./bin/karaf
,即执行 Karaf 控制台;以及子进程,它在
java
JVM 中执行 Karaf 服务器。但是,关闭的行为与以前相同。也就是说,您可以使用 Ctrl-D 或
osgi:shutdown
从控制台关闭服务器,从而终止这两个进程。
在服务器模式中启动,可在后台运行 Apache Karaf,无需本地控制台。然后,您要使用远程控制台连接到正在运行的实例。详情请查看 第 17.2 节 “在远程连接和断开连接” 。 要在服务器模式中启动 Karaf,请运行以下命令 Windows
bin\start.bat
Linux/UNIX
./bin/start
在生产环境中,您可能希望仅使用本地控制台访问运行时实例。换句话说,您无法通过 SSH 控制台端口远程连接到运行时。您可以使用以下命令在客户端模式中启动运行时: Windows
bin\fuse.bat client
Linux/UNIX
./bin/fuse client
在客户端模式中启动仅阻止 SSH 控制台端口(通常是端口 8101)。其他 Karaf 服务器端口(例如,JMX 管理 RMI 端口)正常打开。
在调试模式下运行
Fuse 有助于更有效地识别和解决错误。默认禁用这个选项。启用之后,Fuse 在端口
5005
上启动 JDWP 套接字。
您可以通过三种方法
在调试模式下运行
Fuse。
第 2.1.5.1 节 “使用 Karaf 环境变量”
第 2.1.5.2 节 “运行 Fuse debug”
第 2.1.5.3 节 “运行 Fuse debugs”
这个方法启用
KARAF_DEBUG
环境变量(
=1
),然后启动容器。
$ export KARAF_DEBUG=1 $ bin/start
此方法运行
debug
,其中
suspend
选项设置为
n
(无)。
$ bin/fuse debug
此方法运行
debug
,其中
suspend
选项设置为
y
(是)。
将
suspend
设为 yes 会导致 JVM 仅在运行
main()
之前暂停,然后它会恢复执行。
$ bin/fuse debugs
您可以从控制台或停止脚本
来停止
Apache Karaf 实例。
如果您通过运行
fuse
或
fuse 客户端
启动 visual 实例,您可以在
karaf
> 提示下执行以下操作之一来停止它:
类型
关闭
按
Ctrl
+
D
您可以通过从
InstallDir/bin
目录调用
stop(.bat)
来停止本地运行的 Karaf 实例(root 容器),如下所示:
Windows
bin\stop.bat
Linux/UNIX
./bin/stop
Karaf
stop
脚本调用的关闭机制与 Apache Tomcat 中实施的关闭机制类似。Karaf 服务器打开专用的关闭端口(与 SSH 端口不同),以接收关闭通知。
默认情况下,会随机选择关闭端口,但是如果愿意,您可以将该端口配置为使用特定的端口。
您可以选择通过在
InstallDir/etc/config.properties
文件中设置以下属性来自定义关闭端口:
karaf.shutdown.port
指定要用作关闭端口的 TCP 端口。将此属性设置为
-1
可禁用端口。默认为
0(
随机端口)。
如果要使用
bin/stop
脚本关闭远程主机上运行的 Karaf 服务器,则需要设置与远程主机的关闭端口相同的属性。但请注意,此设置也会影响位于与
etc/config.properties
文件相同的主机上。
karaf.shutdown.host
指定关闭端口绑定到的主机名。此设置对于多设备主机非常有用。默认为
localhost
。
如果要使用
bin/stop
脚本关闭远程主机上运行的 Karaf 服务器,则需要将此属性设置为远程主机的主机名(或 IP 地址)。但请注意,此设置也会影响位于与
etc/config.properties
文件相同的主机上。
karaf.shutdown.port.file
stop
脚本读取此属性指定的文件,以发现当前关闭端口的值。默认为
${karaf.data}/port
。
karaf.shutdown.command
指定必须发送到关闭端口的 UUID 值以便触发关闭。只要保留 UUID 值,就会提供一个安全性的元素级别。例如,
etc/config.properties
文件可以被读取,以防止普通用户读取这个值。
当 Apache Karaf 首次启动时,会自动生成随机 UUID 值,并将此设置写入
etc/config.properties
文件的末尾。或者,如果已经设置了
karaf.shutdown.command
,则 Karaf 服务器会使用预先存在的 UUID 值(如果需要,它允许您自定义 UUID 设置)。
如果要使用
bin/stop
脚本关闭远程主机上运行的 Karaf 服务器,则需要将此属性设置为与远程主机的
karaf.shutdown.command
的值相等。但请注意,此设置也会影响位于与
etc/config.properties
文件相同的主机上。
您可以停止在远程主机上运行的容器实例,如 第 17.3 节 “停止远程容器” 所述。
本章论述了在第一次引导前配置安全性的基本步骤。默认情况下,ESB 是安全的,但其任何服务都不能被远程访问。本章论述了如何启用对通过 Karaf 公开的端口的安全访问。
Apache Karaf 运行时默认对网络攻击进行保护,因为所有公开的端口都需要用户身份验证,而且最初没有定义用户。换句话说,默认情况下可以远程访问 Apache Karaf 运行时。 如果要远程访问运行时,您必须首先自定义安全配置,如下所述。
如果要启用到 Karaf 容器的远程访问,您必须在启动容器前创建 secure JAAS 用户:
默认情况下,容器没有定义 JAAS 用户,这可有效禁用远程访问(无法登录)。
要创建安全 JAAS 用户,请编辑
InstallDir/etc/users.properties
文件并添加一个新用户字段,如下所示:
Username=Password,admin
其中
Username
和
Password
是新用户凭证。
admin
角色授予该用户访问容器的所有管理和管理功能的特权。
不要用前导零定义数字用户名。此类用户名始终会导致登录尝试失败。这是因为 console 使用的 Karaf shell,当输入显示为数字时,丢弃前导零。例如:
karaf@root> echo 0123 karaf@root> echo 00.123 0.123 karaf@root>
强烈建议您使用强大密码定义自定义用户凭证。
Karaf 容器支持基于角色的访问权限控制,该控制通过 JMX 协议、XDP 命令控制台和 Fuse 管理控制台进行监管。为用户分配角色时,您可以从标准角色集合中选择,它提供了 表 3.1 “访问控制的标准角色” 中描述的访问级别。
表 3.1. 访问控制的标准角色
角色 | 描述 | ||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
3.1.5. Apache Karaf 容器公开的端口容器公开以下端口: 通过 Apache Karaf shell 命令, 控制台端口 >_<-admission-enables 对容器实例的远程控制。此端口默认为启用,并且由 JAAS 身份验证和 SSH 保护。 JMX 端口 abrt-enables 通过 JMX 协议管理容器。此端口默认为启用,并由 JAAS 身份验证进行保护。 Web 控制台端口 & gt;_<-abrtprovides 对可托管 Web 控制台 servlets 的嵌入式 Undertow 容器的访问。默认情况下,Fuse 控制台安装在 Undertow 容器中。 3.1.6. 启用远程控制台端口您可以同时满足以下条件时访问远程控制台端口: JAAS 配置至少有一组登录凭据。 PackageKit 运行时 还没有 以客户端模式启动(客户端模式可完全禁用远程控制台端口)。 例如,要从运行容器的同一机器中登录到远程控制台端口,请输入以下命令: ./client -u Username -p Password
其中,
3.1.7. 加强远程控制台端口的安全性
您可以使用以下措施加强远程控制台端口的安全性:
确保 JAAS 用户凭据具有强大的密码。
自定义 X.509 证书(将 Java 密钥存储文件 替换为自定义密钥对
3.1.8. 启用 JMX 端口
默认情况下启用 JMX 端口,并通过 JAAS 身份验证进行保护。若要访问 JMX 端口,您必须至少有一个登录凭证配置有一组登录凭证。要连接到 JMX 端口,请打开 JMX 客户端(例如,
service:jmx:rmi:///jndi/rmi://localhost:1099/karaf-root
您还必须向 JMX 客户端提供有效的 JAAS 凭据,才能进行连接。
通常,JMX URI 的尾部的格式为
3.1.9. 加强 Fuse 控制台端口的安全性Fuse 控制台已经由 JAAS 身份验证进行保护。要添加 SSL 安全性,请参阅 保护 Undertow HTTP 服务器 。 第 4 章 将 Apache Karaf 安装为服务本章介绍了如何使用提供的模板将 Apache Karaf 实例作为系统服务启动。 4.1. 概述
通过使用服务脚本模板,您可以使用特定于操作系统的 init 脚本的帮助运行 Karaf 实例。您可以在
4.2. 运行PERC as a Service
4.3. systemd
当
$ ./karaf-service.sh -k /opt/karaf-4 -n karaf-4 Writing service file "/opt/karaf-4/bin/contrib/karaf-4.service" Writing service configuration file ""/opt/karaf-4/etc/karaf-4.conf" Writing service file "/opt/karaf-4/bin/contrib/[email protected]" $ sudo cp /opt/karaf-4/bin/contrib/karaf-4.service /etc/systemd/system $ sudo systemctl enable karaf-4.service 4.4. SysV
当
$ ./karaf-service.sh -k /opt/karaf-4 -n karaf-4 Writing service file "/opt/karaf-4/bin/contrib/karaf-4" Writing service configuration file "/opt/karaf-4/etc/karaf-4.conf" $ sudo ln -s /opt/karaf-4/bin/contrib/karaf-4 /etc/init.d/ $ sudo chkconfig karaf-4 on
注意
要在启动时启用服务,请参考您的操作系统 init 指南。 4.5. Solaris SMF
当
$ ./karaf-service.sh -k /opt/karaf-4 -n karaf-4 Writing service file "/opt/karaf-4/bin/contrib/karaf-4.xml" $ sudo svccfg validate /opt/karaf-4/bin/contrib/karaf-4.xml $ sudo svccfg import /opt/karaf-4/bin/contrib/karaf-4.xml
注意
生成的 SMF 描述符是临时的,以便您可以只执行一次启动方法。 4.6. Windows
通过
C:\opt\apache-karaf-4\bin\contrib> karaf-4.exe install C:\opt\apache-karaf-4\bin\contrib> karaf-4.exe start 4.7. karaf-service.sh Options
您可以将选项指定为命令行选项,也可以通过设置环境变量来指定
第 5 章 构建 OSGi 捆绑包摘要 本章论述了如何使用 Maven 构建 OSGi 捆绑包。对于构建捆绑包,Maven bundle 插件会扮演重要角色,因为它可让您自动生成 OSGi 捆绑包的标头(否则会是一个繁琐的任务)。Maven archetypes 生成完整的示例项目,也可以为您的捆绑包项目提供一个起点。 5.1. 生成捆绑包项目5.1.1. 使用 Maven archetypes 生成捆绑包项目为了帮助您快速启动,您可以调用 Maven archetype 来生成 Maven 项目的初始概述( Maven archetype 与项目向导类似)。以下 Maven archetype 生成一个项目来构建 OSGi 捆绑包。 5.1.2. Apache Camel archetype
Apache Camel OSGi archetype 创建了一个项目,用于构建可部署到 OSGi 容器中的路由。
以下示例演示了如何使用 Maven archetype 命令和
GroupId
mvn archetype:generate \ -DarchetypeGroupId=org.apache.camel.archetypes \ -DarchetypeArtifactId=camel-archetype-blueprint \ -DarchetypeVersion=2.23.2.fuse-7_11_1-00015-redhat-00002
运行此命令后,Maven 会提示您指定
5.1.3. 构建捆绑包
默认情况下,前面的 archetypes 在一个新目录中创建一个项目,其名称与指定的工件 ID
ArtifactId
相同。要构建新项目定义的捆绑包,请打开命令提示符,进入项目目录(即包含
mvn install
该命令的作用是编译所有 Java 源文件,以在
ArtifactId
5.2. 修改现有的 Maven 项目5.2.1. 概述如果您已有 Maven 项目并想对其进行修改,以便其生成 OSGi 捆绑包,请执行以下步骤: 第 5.2.2 节 “将软件包类型改为捆绑包” 。 第 5.2.3 节 “将捆绑包插件添加到您的 POM” . 第 5.2.4 节 “自定义 bundle 插件” 。 第 5.2.5 节 “自定义 JDK 编译器版本” 。 5.2.2. 将软件包类型改为捆绑包
通过将软件包类型更改为捆绑到项目的
<project ... >
<packaging>bundle</packaging>
</project>
此设置的影响是选择 Maven bundle 插件
5.2.3. 将捆绑包插件添加到您的 POM
要添加 Maven bundle 插件,请将以下示例
<project ... > <build> <defaultGoal>install</defaultGoal> <plugins> <plugin> <groupId>org.apache.felix</groupId> <artifactId>maven-bundle-plugin</artifactId> <version>3.3.0</version> <extensions>true</extensions> <configuration> <instructions> <Bundle-SymbolicName>${project.groupId}.${project.artifactId} </Bundle-SymbolicName> <Import-Package>*</Import-Package> </instructions> </configuration> </plugin> </plugins> </build> </project>
这里的 bundle 插件由
5.2.4. 自定义 bundle 插件有关为 Apache CXF 配置捆绑插件的某些具体建议,请参阅 第 5.3 节 “在捆绑包中打包 Web 服务” 。 5.2.5. 自定义 JDK 编译器版本
在您的 POM 文件中指定 JDK 版本几乎始终是必需的。如果您的代码使用 Java 语言的任何现代功能,如通用、静态导入等,且您未在 POM 中自定义 JDK 版本,则 Maven 将无法编译源代码。将
<project ... > <build> <defaultGoal>install</defaultGoal> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <configuration> <source>1.8</source> <target>1.8</target> </configuration> </plugin> </plugins> </build> </project> 5.3. 在捆绑包中打包 Web 服务5.3.1. 概述
本节介绍如何为 Apache CXF 应用程序修改现有 Maven 项目,以便项目生成适合在红帽 Fuse OSGi 容器中部署的 OSGi 捆绑包。要转换 Maven 项目,您需要修改项目的 POM 文件和项目的蓝图文件(位于
5.3.2. 修改 POM 文件以生成捆绑包
要配置 Maven POM 文件来生成捆绑包,您需要进行两种更改:更改 POM 的软件包类型到
5.3.3. 必需的导入软件包
要让您的应用程序使用 Apache CXF 组件,您需要将其软件包导入到应用程序的捆绑包中。由于 Apache CXF 中的依赖关系的复杂特性,您无法依赖 Maven 捆绑包插件或
javax.jws javax.wsdl javax.xml.bind javax.xml.bind.annotation javax.xml.namespace javax.xml.ws org.apache.cxf.bus org.apache.cxf.bus.spring org.apache.cxf.bus.resource org.apache.cxf.configuration.spring org.apache.cxf.resource org.apache.cxf.jaxws org.springframework.beans.factory.config 5.3.4. Maven bundle 插件说明示例
例 5.1 “配置强制导入软件包”
展示如何在 POM 中配置 Maven 捆绑插件以导入必需的软件包。必需的导入软件包在
例 5.1. 配置强制导入软件包 <project ... > <build> <plugins> <plugin> <groupId>org.apache.felix</groupId> <artifactId>maven-bundle-plugin</artifactId> <extensions>true</extensions> <configuration> <instructions> <Import-Package> javax.jws, javax.wsdl, javax.xml.bind, javax.xml.bind.annotation, javax.xml.namespace, javax.xml.ws, org.apache.cxf.bus, org.apache.cxf.bus.spring, org.apache.cxf.bus.resource, org.apache.cxf.configuration.spring, org.apache.cxf.resource, org.apache.cxf.jaxws, org.springframework.beans.factory.config, </Import-Package> </instructions> </configuration> </plugin> </plugins> </build> </project> 5.3.5. 添加代码生成插件
Web 服务项目通常需要生成代码。Apache CXF 为 JAX-WS 前端提供两个 Maven 插件,这使您可以将代码生成步骤集成到您的构建中。插件选择取决于您使用 Java 优先方法或 WSDL-first 方法开发您的服务,如下所示:
java
-first 方法
- 使用
5.3.6. OSGi 配置属性OSGi 配置管理服务定义了将配置设置传递给 OSGi 捆绑包的机制。您不必使用此服务进行配置,但它通常是配置捆绑包应用程序的最便捷方式。蓝图提供对 OSGi 配置的支持,可让您使用从 OSGi 配置管理员服务获取的值替换 Blueprint 文件中的变量。 有关如何使用 OSGi 配置属性的详情,请参考 第 5.3.7 节 “配置捆绑插件” 和 第 9.6 节 “在功能中添加 OSGi 配置” 。 5.3.7. 配置捆绑插件概述
捆绑包插件需要很少的信息才能正常工作。所有所需属性都使用默认设置来生成有效的 OSGi 捆绑包。
虽然您可以使用默认值创建有效的捆绑包,但您可能需要修改某些值。您可以在插件的
设置捆绑包的符号链接
默认情况下,Bundle 插件将
例 5.2. 设置捆绑包的符号链接 <plugin>
<groupId>org.apache.felix</groupId>
<artifactId>maven-bundle-plugin</artifactId>
<configuration>
<instructions>
<Bundle-SymbolicName>${project.artifactId}</Bundle-SymbolicName>
</instructions>
</configuration>
</plugin>
设置捆绑包的名称
默认情况下,捆绑包的名称设置为
例 5.3. 设置捆绑包的名称 <plugin>
<groupId>org.apache.felix</groupId>
<artifactId>maven-bundle-plugin</artifactId>
<configuration>
<instructions>
<Bundle-Name>JoeFred</Bundle-Name>
</instructions>
</configuration>
</plugin>
设置捆绑包的版本
默认情况下,捆绑包的版本设置为
例 5.4. 设置捆绑包的版本 <plugin>
<groupId>org.apache.felix</groupId>
<artifactId>maven-bundle-plugin</artifactId>
<configuration>
<instructions>
<Bundle-Version>1.0.3.1</Bundle-Version>
</instructions>
</configuration>
</plugin>
指定导出的软件包
默认情况下,OSOS 清单的
!com.fuse.demo.private,com.fuse.demo.*
但是,如果您使用
指定私有软件包
如果要在导出捆绑包中指定要包含在捆绑包中的软件包列表,您可以在捆绑包插件配置中添加
例 5.5. 在捆绑包中包含私有软件包 <plugin>
<groupId>org.apache.felix</groupId>
<artifactId>maven-bundle-plugin</artifactId>
<configuration>
<instructions>
<Private-Package>org.apache.cxf.wsdlFirst.impl</Private-Package>
</instructions>
</configuration>
</plugin>
指定导入的软件包
默认情况下,Bundle 插件使用捆绑包内容引用的所有软件包列表填充 OSGi 清单的
例 5.6. 指定捆绑包导入的软件包 <plugin>
<groupId>org.apache.felix</groupId>
<artifactId>maven-bundle-plugin</artifactId>
<configuration>
<instructions>
<Import-Package>javax.jws, javax.wsdl, org.apache.cxf.bus, org.apache.cxf.bus.spring, org.apache.cxf.bus.resource, org.apache.cxf.configuration.spring, org.apache.cxf.resource, org.springframework.beans.factory.config, * </Import-Package>
</instructions>
</configuration>
</plugin>
更多信息有关配置捆绑包插件的详情,请参考: olink:OsgiDependencies/OsgiDependencies Apache Felix 文档 Peter Kriens' aQute Software Consultancy 网站 5.3.8. OSGI configAdmin 文件命名规则
PID 字符串(symbolic-name 语法)允许在 OSGI 规格中允许连字符。但是,连字符由 Apache
第 6 章 热部署与手动部署摘要 Fuse 提供两种不同的方法来部署文件:热部署或手动部署。如果您需要部署一个相关捆绑包的集合,您可以将它们部署为 功能 ,而不是即时部署(请参阅 第 9 章 部署功能 )。 6.1. 热部署6.1.1. 热部署目录
Fuse 监控
% cp ProjectDir/target/foo-1.0-SNAPSHOT.jar FUSE_HOME/deploy
6.2. 热取消部署捆绑包
要从热部署目录中取消部署捆绑包,只需从
6.3. 手动部署6.3.1. 概述您可以通过在 Fuse 控制台中执行命令来手动部署和取消部署捆绑包。 6.3.2. 安装捆绑包
使用
bundle:install [-s] [--start] [--help] UrlList
其中 UrlList 是一个空格分隔的 URL 列表,用于指定要部署的每个捆绑包的位置。支持以下命令参数: 安装后启动捆绑包。
--start
-s
相同。
--help
/target/foo-1.0-SNAPSHOT.jar
在 Karaf 控制台提示下输入以下命令:
bundle:install -s file:ProjectDir/target/foo-1.0-SNAPSHOT.jar
注意
在 Windows 平台上,您必须小心谨慎,才能在此命令中
6.3.3. 卸载捆绑包
要卸载捆绑包,您必须首先使用
现在,您可以通过输入以下控制台命令使用 ID
bundle:uninstall 181 6.3.4. 查找捆绑包的 URL 方案
当指定
6.4. 使用 bundle:watch 自动重新部署捆绑包
在开发环境中,开发人员会不断更改并重建捆绑包,通常需要多次重新安装捆绑包。使用
bundle:watch 751
现在,每当您将 Maven 工件重建并安装到本地 Maven 存储库时(例如,通过在 Maven 项目中执行
第 7 章 生命周期管理7.1. 捆绑包生命周期状态
OSGi 环境中的应用程序受其捆绑包的生命周期约束。捆绑包有六个生命周期状态:
installed
- 所有捆绑包都以已安装的状态启动。处于已安装状态的捆绑包正在等待它们的所有依赖项被解决,一旦被解决,捆绑包就会变为已解决的状态。
已解析
- 当满足以下条件时,捆绑包会移到已解析的状态:
运行时环境满足或超过捆绑包指定的环境。
捆绑包导入的所有软件包均由处于已解析状态的捆绑包公开,或者可以和当前捆绑包同时移到已解析状态。
所有所需的捆绑包都处于已解析状态,也可以与当前捆绑包同时解决。
所有应用程序的捆绑包都必须处于已解析状态,然后才能启动应用程序。
如果上述任何条件满足,则捆绑包将重新移到已安装的状态。例如,当从容器中删除包含导入软件包的捆绑包时,会出现这种情况。
启动
- 启动状态是已解析状态和主动状态之间的过渡状态。当捆绑包启动时,容器必须为捆绑包创建资源。当提供容器时,容器还调用捆绑包的
7.2. 安装并解决捆绑包
当使用
bundle:resolve 181
其中 参数(
7.3. 启动和停止捆绑包
您可以使用
bundle:start 181 185 186
您可以使用
bundle:stop 181 185 186
您可以使用
bundle:restart 181 185 186 7.4. 捆绑包启动级别
起始级别
与每个捆绑包相关联。start 级别是一个正整数值,用于控制捆绑要激活/启动的顺序。在具有高级别的捆绑包之前,启动具有最低级别的捆绑包。因此,与起始级别的捆绑包
7.5. 指定捆绑包的开始级别
使用
bundle:start-level 181 70 7.6. 系统启动级别
OSGi 容器本身有与之关联的启动级别,
此系统启动级别
决定哪个捆绑包可以活跃且不能:只有启动级别
小于或等于系统启动
级别的捆绑包才可以激活。
要发现当前系统启动级别,在控制台中输入
karaf@root()> system:start-level Level 100
如果要更改系统启动级别,请为 system:start-level 命令提供新的启动级别作为
system:start-level 200 第 8 章 依赖项故障排除8.1. 缺少依赖项
当您将 OSGi 捆绑包部署到红帽 Fuse 容器时,会发生最常见的问题是缺少一个或多个依赖项。当您尝试在 OSGi 容器中解决捆绑包时,通常会作为启动该捆绑包的一个副作用。捆绑包无法解析(或启动),并且日志记录了
8.2. 未安装所需的功能或捆绑包在尝试解决您的捆绑包前,您的捆绑包所需的所有功能和捆绑包必须已在 OSGi 容器中安装。 特别是,因为 Apache Camel 具有模块化架构,即将每个组件作为单独的功能安装,因此易于安装其中一个需要的组件。 考虑将捆绑包打包为一个功能。使用一个功能,您可以将捆绑包与其所有依赖项一起打包,从而确保它们都同时安装。详情请查看 第 9 章 部署功能 。 8.3. import-Package 标头不完整
如果已经安装了所有必需的功能和捆绑包,您仍然会收到
8.4. 如何跟踪缺失的依赖项
要跟踪缺少的依赖项,请执行以下步骤:
使用
karaf@root()> bundle:install MyBundleURL
使用
karaf@root()> bundle:dynamic-import 218
此设置允许使用容器中已安装的
任何
捆绑包(基于
karaf@root()> bundle:resolve 218
假设您的捆绑包现已解决(使用
karaf@root()> package:imports -b 218 您应该在控制台窗口中看到一个依赖软件包列表: Package │ Version │ Optional │ ID │ Bundle Name ─────────────────────────────────────┼───────────────┼────────────┼─────┼────────────────────────────────── org.apache.jasper.servlet │ [2.2.0,3.0.0) │ resolved │ 217 │ org.ops4j.pax.web.pax-web-runtime org.jasypt.encryption.pbe │ │ resolved │ 217 │ org.ops4j.pax.web.pax-web-runtime org.ops4j.pax.web.jsp │ [7.0.0,) │ resolved │ 217 │ org.ops4j.pax.web.pax-web-runtime org.ops4j.pax.web.service.spi.model │ [7.0.0,) │ │ 217 │ org.ops4j.pax.web.pax-web-runtime org.ops4j.pax.web.service.spi.util │ [7.0.0,) │ │ 217 │ org.ops4j.pax.web.pax-web-runtime 解包您的捆绑包 JAR 文件,并查看
第 9 章 部署功能摘要 因为应用程序和其他工具通常包含多个 OSGi 捆绑包,因此通常可以方便地将相互独立或相关的捆绑包聚合成较大的部署单元。因此,Red Hat Fuse 提供了可扩展的部署单元,它可让您在一个步骤中部署多个捆绑包(以及可选的依赖)。 9.1. 创建功能9.1.1. 概述
本质上,通过将新功能元素添加到一种特殊 XML 文件(称为
功能存储库)来创建一个功能
。
9.2. 创建自定义功能存储库
如果您还没有定义自定义功能存储库,您可以按照如下所示创建一个。在您的文件系统中为功能存储库选择一个方便的位置,例如
<?xml version="1.0" encoding="UTF-8"?>
<features name="CustomRepository">
</features>
您必须通过设置
9.3. 为自定义功能存储库添加功能
要向自定义功能存储库添加功能,请插入一个新的
<?xml version="1.0" encoding="UTF-8"?>
<features name="MyFeaturesRepo">
<feature name="example-camel-bundle">
<bundle>file:C:/Projects/camel-bundle/target/camel-bundle-1.0-SNAPSHOT.jar</bundle>
</feature>
</features>
JBossFuse:karaf@root> features:refreshurl JBossFuse:karaf@root> features:list [uninstalled] [0.0.0 ] example-camel-bundle MyFeaturesRepo 9.4. 将本地存储库 URL 添加到功能服务中
为了让新功能存储库可供 Apache Karaf 使用,您必须使用
features:addurl file:C:/Projects/features.xml
其中
JBossFuse:karaf@root> features:listUrl file:C:/Projects/features.xml mvn:org.apache.ode/ode-jbi-karaf/1.3.3-fuse-01-00/xml/features mvn:org.apache.felix.karaf/apache-felix-karaf/1.2.0-fuse-01-00/xml/features 9.5. 在功能中添加依赖功能
如果您的功能依赖于其他功能,您可以通过添加功能元素作为原始
<?xml version="1.0" encoding="UTF-8"?>
<features name="MyFeaturesRepo">
<feature name="example-camel-bundle">
<bundle>file:C:/Projects/camel-bundle/target/camel-bundle-1.0-SNAPSHOT.jar</bundle>
<feature version="7.11.1.fuse-7_11_1-00013-redhat-00003">camel-core</feature>
<feature version="7.11.1.fuse-7_11_1-00013-redhat-00003">camel-spring-osgi</feature>
</feature>
</features>
指定
9.6. 在功能中添加 OSGi 配置
如果您的应用程序使用
OSGi 配置管理员
服务,您可以使用功能定义中的
<?xml version="1.0" encoding="UTF-8"?>
<features name="MyFeaturesRepo">
<feature name="example-camel-bundle">
<config name="org.fusesource.fuseesb.example">
prefix=MyTransform
</config>
</feature>
</features>
其中
InstallDir/etc/org.fusesource.fuseesb.example.cfg
例如,在实践中使用上述配置属性的示例,请考虑以下 Blueprint XML 文件来访问 OSGi 配置属性: <?xml version="1.0" encoding="UTF-8"?> <blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:cm="http://aries.apache.org/blueprint/xmlns/blueprint-cm/v1.1.0"> <!-- osgi blueprint property placeholder --> <cm:property-placeholder id="placeholder" persistent-id="org.fusesource.fuseesb.example"> <cm:default-properties> <cm:property name="prefix" value="DefaultValue"/> </cm:default-properties> </cm:property-placeholder> <bean id="myTransform" class="org.fusesource.fuseesb.example.MyTransform"> <property name="prefix" value="${prefix}"/> </bean> </blueprint>
当此蓝图 XML 文件部署到
9.7. 自动部署 OSGi 配置
通过将
<configfile finalname="etc/org.fusesource.fuseesb.example.cfg"> mvn:org.fusesource.fuseesb.example/configadmin/1.0/cfg </configfile> 第 10 章 部署功能10.1. 概述
您可以使用以下方法之一部署功能:
使用
10.2. 在控制台中安装
创建功能(通过在功能存储库中添加条目和注册功能存储库)后,使用
JBossFuse:karaf@root> features:refreshurl JBossFuse:karaf@root> features:install example-camel-bundle
建议您在调用
10.3. 在控制台中卸载
要卸载功能,请按如下方式调用 feature
JBossFuse:karaf@root> features:uninstall example-camel-bundle
注意
卸载后,在您调用
10.4. 热部署
只需将功能存储库文件复制到
<?xml version="1.0" encoding="UTF-8"?> <features name="CustomDescriptor"> <repository>RepositoryURL</repository> <feature name="hot-example-camel-bundle"> <feature>example-camel-bundle</feature> </feature> </features>
repository 元素指定自定义功能存储库(您可使用
第 15 章
URL 处理程序
中描述的任何 URL 格式)的位置。
功能
10.5. 热取消部署功能文件
要从热部署目录中取消部署功能文件,只需从
10.6. 在引导配置中添加功能
如果您想为在多个主机上置备 Apache Karaf 副本,您可能有兴趣向引导配置添加功能,这决定了在 Apache Karaf 首次引导时安装的功能集合。
安装目录中的配置文件
这个配置文件有两个属性:
第 11 章 部署 Plain JAR摘要 将应用部署到 Apache Karaf 的替代方法是使用普通 JAR 文件。这些通常是 不包含任何部署元数据的库 。普通 JAR 既不是 WAR,也不是一种 OSGi 捆绑包。 如果普通 JAR 作为捆绑包的依赖项而发生,您必须将捆绑包标头添加到 JAR 中。如果 JAR 公开一个公共 API,通常是将现有的 JAR 转换为捆绑包,使 JAR 能够与其他捆绑包共享。使用开源 Bnd 工具,使用本章中的说明自动执行转换过程。 有关 Bnd 工具的更多信息,请参阅 Bnd 工具网站 。 11.1. 使用 wrap Scheme 转换 JAR概述
您可以使用
wrap:LocationURL
wrap and install
以下示例演示了如何使用单个控制台命令从远程 Maven 存储库下载纯
karaf@root> bundle:install -s wrap:mvn:commons-logging/commons-logging/1.1.1 参考
嵌套
第 12 章 OSGi 服务摘要 OSGi 核心框架定义了 OSGi 服务层 ,它提供了一个简单机制,通过将 Java 对象注册为 OSGi 服务 registry 中的服务来进行交互。OSGi 服务模型的优势在于, 任何 Java 对象都可以作为服务来提供:没有特定限制、继承规则或注解必须应用于服务类。本章论述了如何使用 OSGi Blueprint 容器部署 OSGi 服务。 12.1. Blueprint 容器摘要 Blueprint 容器是一个依赖项注入框架,简化了与 OSGi 容器的交互。Blueprint 容器支持使用基于配置的方法,使用 OSGi 服务注册表(例如,提供标准的 XML 元素用于导入和导出 OSGi 服务)。 12.1.1. 蓝图配置在 JAR 文件中的蓝图文件位置 相对于 bundle JAR 文件的根目录,Blueprint 配置文件的标准位置如下: OSGI-INF/blueprint
此目录下带有后缀
Maven 项目中的蓝图文件位置 在 Maven 项目 ProjectDir 上下文中,Blueprint 配置文件的标准位置如下: ProjectDir/src/main/resources/OSGI-INF/blueprint
蓝图命名空间和 root 元素 蓝图配置元素与以下 XML 命名空间关联: http://www.osgi.org/xmlns/blueprint/v1.0.0
蓝图配置的根元素是
<?xml version="1.0" encoding="UTF-8"?> <blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0"> </blueprint>
注意
在
自定义蓝图文件位置
如果您需要将 Blueprint 配置文件放在非标准位置(即
Bundle-Blueprint: lib/account.xml, security.bp, cnf/*.xml 必需的依赖项
默认情况下,OSOS 服务的依赖项是强制的(虽然通过将
12.1.2. 定义服务 Bean概述
Blueprint 容器允许您使用
蓝图 Bean 元素
Blueprint
Bean 示例
以下示例演示了如何使用 Blueprint 的 Bean 来创建几种不同类型的
<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0"> <bean id="label" class="java.lang.String"> <argument value="LABEL_VALUE"/> </bean> <bean id="myList" class="java.util.ArrayList"> <argument type="int" value="10"/> </bean> <bean id="account" class="org.fusesource.example.Account"> <property name="accountName" value="john.doe"/> <property name="balance" value="10000"/> </bean> </blueprint>
其中
package org.fusesource.example; public class Account private String accountName; private int balance; public Account () { } public void setAccountName(String name) { this.accountName = name; public void setBalance(int bal) { this.balance = bal; } 参考信息 有关定义 Blueprint Bean 的详情,请参考以下参考: Spring 动态模块参考指南 v2.0, Blueprint 章节 . 第 121 蓝图容器规范 ,来自 OSGi Compendium Services R4.2 规范。 12.1.3. 使用属性配置蓝图概述 这部分论述了如何使用在 Camel 上下文以外的文件中保存的属性配置 Blueprint。 配置 Blueprint Bean
蓝图 Bean 可以通过使用可通过从外部文件使用属性放置的变量进行配置。您需要声明
<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0" xmlns:ext="http://aries.apache.org/blueprint/xmlns/blueprint-ext/v1.2.0"> <ext:property-placeholder> <ext:location>file:etc/ldap.properties</ext:location> </ext:property-placeholder> <bean ...> <property name="myProperty" value="${myProperty}" /> </bean> </blueprint>
12.2. 导出服务概述 这部分论述了如何将 Java 对象导出到 OSGi 服务 registry,从而使它可作为服务来访问 OSGi 容器中的其他捆绑包。 使用单个接口导出
要在一个接口名称下将服务导出到 OSGi
例 12.1. 使用单一接口进行服务导出示例 <blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0">
<bean id="savings" class="org.fusesource.example.SavingsAccountImpl"/>
<service ref="savings" interface="org.fusesource.example.Account"/>
</blueprint>
其中
例 12.2. 帐户类和接口示例 package org.fusesource.example public interface Account { ... } public interface SavingsAccount { ... } public interface CheckingAccount { ... } public class SavingsAccountImpl implements SavingsAccount public class CheckingAccountImpl implements CheckingAccount } 使用多个接口导出
要在多个接口名称下将服务导出到 OSGi
<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0"> <bean id="savings" class="org.fusesource.example.SavingsAccountImpl"/> <service ref="savings"> <interfaces> <value>org.fusesource.example.Account</value> <value>org.fusesource.example.SavingsAccount</value> </interfaces> </service> </blueprint>
注意
使用自动导出导出
如果要在其实施的公共 Java 接口下将服务导出到 OSGi 服务 registry,那么使用
<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0"> <bean id="savings" class="org.fusesource.example.SavingsAccountImpl"/> <service ref="savings" auto-export="interfaces"/> </blueprint>
设置服务属性
OSGi 服务 registry 还允许您将服务
属性
与注册的服务相关联。然后,服务的客户端可以使用服务属性来搜索或过滤服务。要将服务属性与导出服务关联,请添加
<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0" xmlns:beans="http://www.springframework.org/schema/beans" <service ref="savings" auto-export="interfaces"> <service-properties> <beans:entry key="bank.name" value="HighStreetBank"/> </service-properties> </service> </blueprint>
默认服务属性
使用
指定 ranking 属性
如果捆绑包在服务 registry 中查找一个服务并找到多个匹配的服务,您可以使用等级确定是否返回哪些服务。该规则是,每当查找匹配多个服务时,返回具有最高等级的服务。服务等级可以是任何非负的整数,其中
<service ref="savings" interface="org.fusesource.example.Account" ranking="10"/>
指定注册监听程序
如果要跟踪服务注册和取消注册事件,您可以定义一个
注册和取消注册事件通知的注册监听程序
回调。要定义注册监听程序,请将
<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0" ...> <bean id="listenerBean" class="org.fusesource.example.Listener"/> <service ref="savings" auto-export="interfaces"> <registration-listener ref="listenerBean" registration-method="register" unregistration-method="unregister"/> </service> </blueprint>
如果
package org.fusesource.example; public class Listener public void register(Account service, java.util.Map serviceProperties) { public void unregister(Account service, java.util.Map serviceProperties) { 方法名称、 12.3. 导入服务概述
本节论述了如何获取和使用被导出到 OSGi 服务 registry 的 OSGi 服务的引用。您可以使用
参考管理器
reference manager
实例由 Blueprint
图 12.1. 对无状态服务的引用
客户端 Blueprint 容器中的 Bean 使用代理对象(
提供的
对象 )注入,该对象由 OSGi 服务注册表的服务对象(
后备服务
)支持。这个模型通过以下方式明确利用无状态服务可交换的事实:
如果发现多个服务实例与
参考列表管理器
Blueprint
图 12.2. Stateful 服务的参考列表
客户端蓝图容器中的 Bean 通过
通过接口(无状态)匹配.
获取
状态
服务引用最简单的方法是使用
<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0"> <reference id="savingsRef" interface="org.fusesource.example.SavingsAccount"/> <bean id="client" class="org.fusesource.example.client.Client"> <property name="savingsAccount" ref="savingsRef"/> </bean> </blueprint>
如果
package org.fusesource.example.client; import org.fusesource.example.SavingsAccount; public class Client { SavingsAccount savingsAccount; // Bean properties public SavingsAccount getSavingsAccount() { return savingsAccount; public void setSavingsAccount(SavingsAccount savingsAccount) { this.savingsAccount = savingsAccount; } 通过接口(stateful)进行匹配.
获取
有状态
服务引用的最简单方法是通过利用
<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0"> <reference-list id="savingsListRef" interface="org.fusesource.example.SavingsAccount"/> <bean id="client" class="org.fusesource.example.client.Client"> <property name="savingsAccountList" ref="savingsListRef"/> </bean> </blueprint>
其中
package org.fusesource.example.client; import org.fusesource.example.SavingsAccount; public class Client { java.util.List<SavingsAccount> accountList; // Bean properties public java.util.List<SavingsAccount> getSavingsAccountList() { return accountList; public void setSavingsAccountList( java.util.List<SavingsAccount> accountList this.accountList = accountList; } 根据接口和组件名称匹配
要匹配
无状态
服务的接口和组件名称(bean ID),请指定
<reference id="savingsRef" interface="org.fusesource.example.SavingsAccount" component-name="savings"/>
要匹配
有状态
服务的接口和组件名称(bean ID),请同时指定
<reference-list id="savingsRef" interface="org.fusesource.example.SavingsAccount" component-name="savings"/> 使用过滤器匹配服务属性
您可以通过匹配过滤器的服务属性来选择服务。过滤器通过引用元素或
(bank.name=HighStreetBank)
要匹配两个服务属性值,您可以使用 和 结合使用表达式和逻辑
(&(foo=FooValue)(bar=BarValue))
有关 LDAP 过滤器表达式的完整语法,请参阅
OSGi 核心规格的 3.2.7 节
。
过滤器也可以与
<reference id="savingsRef" interface="org.fusesource.example.SavingsAccount" filter="(bank.name=HighStreetBank)"/>
要匹配
有状态的
服务
<reference-list id="savingsRef" interface="org.fusesource.example.SavingsAccount" filter="(bank.name=HighStreetBank)"/> 指定是否强制(必需)或可选
默认情况下,LOSOS 服务的引用被假定为强制(请参阅
必需的依赖项
)。通过在元素上设置
<reference id="savingsRef" interface="org.fusesource.example.SavingsAccount" availability="mandatory"/> 指定引用监听程序
例如,若要应对 OSGi 环境的动态性质(例如,如果您声明了一些服务引用)具有
<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0"> <reference id="savingsRef" interface="org.fusesource.example.SavingsAccount" <reference-listener bind-method="onBind" unbind-method="onUnbind"> <bean class="org.fusesource.example.client.Listener"/> </reference-listener> </reference> <bean id="client" class="org.fusesource.example.client.Client"> <property name="savingsAcc" ref="savingsRef"/> </bean> </blueprint>
上述配置将
package org.fusesource.example.client; import org.osgi.framework.ServiceReference; public class Listener { public void onBind(ServiceReference ref) { System.out.println("Bound service: " + ref); public void onUnbind(ServiceReference ref) { System.out.println("Unbound service: " + ref); 方法名称 12.4. 发布 OSGi 服务12.4.1. 概述本节介绍如何在 OSGi 容器中生成、构建和部署简单的 OSGi 服务。该服务是一个简单的 Hello World Java 类,并且 OSGi 配置是使用 Blueprint 配置文件定义的。 12.4.2. 先决条件要使用 Maven Quickstart archetype 生成项目,您必须满足以下条件: Maven 安装 - Maven 是一个来自 Apache 的免费开源构建工具。您可以从 http://maven.apache.org/download.html 下载最新版本(最小为 2.0.9)。 互联网连接 -whilst 执行构建,Maven 会动态搜索外部存储库,并即时下载所需的工件。要使此任务正常工作,构建 机器必须 连接到互联网。 12.4.3. 生成 Maven 项目
mvn archetype:create -DarchetypeArtifactId=maven-archetype-quickstart -DgroupId=org.fusesource.example -DartifactId=osgi-service
此命令的结果是目录
12.4.4. 自定义 POM 文件
您必须自定义 POM 文件才能生成 OSGi 捆绑包,如下所示:
按照
第 5.1 节 “生成捆绑包项目”
中描述的 POM 自定义步骤操作。
在 Maven bundle 插件的配置,修改捆绑包指令以导出
<project ... >
<build>
<plugins>
<plugin>
<groupId>org.apache.felix</groupId>
<artifactId>maven-bundle-plugin</artifactId>
<extensions>true</extensions>
<configuration>
<instructions>
<Bundle-SymbolicName>${pom.groupId}.${pom.artifactId}</Bundle-SymbolicName>
<Export-Package>org.fusesource.example.service</Export-Package>
</instructions>
</configuration>
</plugin>
</plugins>
</build>
</project>
12.4.5. 编写服务接口
创建
例 12.3. The HelloWorldSvc Interface package org.fusesource.example.service; public interface HelloWorldSvc public void sayHello(); } 12.4.6. 编写服务类
创建
例 12.4. The HelloWorldSvcImpl Class package org.fusesource.example.service.impl; import org.fusesource.example.service.HelloWorldSvc; public class HelloWorldSvcImpl implements HelloWorldSvc { public void sayHello() System.out.println( "Hello World!" ); } 12.4.7. 编写 Blueprint 文件
Blueprint 配置文件是一个 XML 文件,存储在类路径上的
ProjectDir/osgi-service/src/main/resources ProjectDir/osgi-service/src/main/resources/OSGI-INF ProjectDir/osgi-service/src/main/resources/OSGI-INF/blueprint
其中
例 12.5. 用于导出服务的蓝图文件 <?xml version="1.0" encoding="UTF-8"?> <blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0"> <bean id="hello" class="org.fusesource.example.service.impl.HelloWorldSvcImpl"/> <service ref="hello" interface="org.fusesource.example.service.HelloWorldSvc"/> </blueprint> 12.4.8. 运行服务捆绑包
要安装并运行
mvn install
如果此命令成功运行,则
Jkaraf@root()> bundle:install -s file:ProjectDir/osgi-service/target/osgi-service-1.0-SNAPSHOT.jar
其中
ProjectDir
是包含 Maven 项目的目录,而
karaf@root()> bundle:install -s file:C:/Projects/osgi-service/target/osgi-service-1.0-SNAPSHOT.jar
注意
在 Windows 机器中,请注意如何对
karaf@root()> bundle:list
在这个列表中的某个位置,您应该会看到
[ 236] [Active ] [Created ] [ ] [ 60] osgi-service (1.0.0.SNAPSHOT) 12.5. 访问 OSGi 服务12.5.1. 概述
本节介绍如何在 OSGi 容器中生成、构建和部署简单的 OSGi 客户端。客户端在 OSGi 注册表中找到一个简单的 Hello World 服务,并调用它上的
12.5.2. 先决条件要使用 Maven Quickstart archetype 生成项目,您必须满足以下条件: Maven 安装 - Maven 是一个来自 Apache 的免费开源构建工具。您可以从 http://maven.apache.org/download.html 下载最新版本(最小为 2.0.9)。 互联网连接 -whilst 执行构建,Maven 会动态搜索外部存储库,并即时下载所需的工件。要使此任务正常工作,构建 机器必须 连接到互联网。 12.5.3. 生成 Maven 项目
mvn archetype:create -DarchetypeArtifactId=maven-archetype-quickstart -DgroupId=org.fusesource.example -DartifactId=osgi-client
此命令的结果是目录
12.5.4. 自定义 POM 文件
您必须自定义 POM 文件才能生成 OSGi 捆绑包,如下所示:
按照
第 5.1 节 “生成捆绑包项目”
中描述的 POM 自定义步骤操作。
由于客户端使用
<project ... > <dependencies> <dependency> <groupId>org.fusesource.example</groupId> <artifactId>osgi-service</artifactId> <version>1.0-SNAPSHOT</version> </dependency> </dependencies> </project> 12.5.5. 编写 Blueprint 文件要将 Blueprint 文件添加到客户端项目,请首先创建以下子目录: ProjectDir/osgi-client/src/main/resources ProjectDir/osgi-client/src/main/resources/OSGI-INF ProjectDir/osgi-client/src/main/resources/OSGI-INF/blueprint
在
例 12.6. 用于导入服务的蓝图文件 <?xml version="1.0" encoding="UTF-8"?> <blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0"> <reference id="helloWorld" interface="org.fusesource.example.service.HelloWorldSvc"/> <bean id="client" class="org.fusesource.example.client.Client" init-method="init"> <property name="helloWorldSvc" ref="helloWorld"/> </bean> </blueprint>
其中
12.5.6. 编写客户端类
在
例 12.7. Client Class package org.fusesource.example.client; import org.fusesource.example.service.HelloWorldSvc; public class Client { HelloWorldSvc helloWorldSvc; // Bean properties public HelloWorldSvc getHelloWorldSvc() { return helloWorldSvc; public void setHelloWorldSvc(HelloWorldSvc helloWorldSvc) { this.helloWorldSvc = helloWorldSvc; public void init() { System.out.println("OSGi client started."); if (helloWorldSvc != null) { System.out.println("Calling sayHello()"); helloWorldSvc.sayHello(); // Invoke the OSGi service! 12.5.7. 运行客户端捆绑包
要安装并运行
mvn install
如果此命令成功运行,则
karaf@root()> bundle:install -s file:ProjectDir/osgi-client/target/osgi-client-1.0-SNAPSHOT.jar
其中
ProjectDir
是包含 Maven 项目的目录,而
karaf@root()> bundle:install -s file:C:/Projects/osgi-client/target/osgi-client-1.0-SNAPSHOT.jar
注意
在 Windows 机器中,请注意如何对
Bundle ID: 239 OSGi client started. Calling sayHello() Hello World! 12.6. 与 Apache Camel 集成12.6.1. 概述Apache Camel 提供了使用 Bean 语言调用 OSGi 服务的简单方法。每当 Apache Camel 应用程序部署到 OSGi 容器时,这个功能都会自动可用,且不需要特殊配置。 12.6.2. registry 链
当将 Apache Camel 路由部署到 OSGi 容器时,
12.6.3. OSGi 服务接口示例
考虑由以下 Java 接口定义的 OSGi 服务,它定义了单一方法
package org.fusesource.example.hello.boston; public interface HelloBoston { public String getGreeting(); } 12.6.4. 服务导出示例
在定义实现
<?xml version="1.0" encoding="UTF-8"?>
<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0">
<bean id="hello" class="org.fusesource.example.hello.boston.HelloBostonImpl"/>
<service ref="hello" interface="org.fusesource.example.hello.boston.HelloBoston"/>
</blueprint>
假设
12.6.5. 从 Java DSL 调用 OSGi 服务
部署包含
from("timer:foo?period=5000")
.bean(org.fusesource.example.hello.boston.HelloBoston.class, "getGreeting")
.log("The message contains: ${body}")
在
12.6.6. 从 XML DSL 调用 OSGi 服务
在 XML DSL 中,您还可以使用 Bean 语言调用
<beans ...>
<camelContext xmlns="http://camel.apache.org/schema/spring">
<route>
<from uri="timer:foo?period=5000"/>
<setBody>
<method ref="org.fusesource.example.hello.boston.HelloBoston" method="getGreeting"/>
</setBody>
<log message="The message contains: ${body}"/>
</route>
</camelContext>
</beans>
注意
当您使用此方法时,IOSGi 服务会被隐式导入。在这种情况下, 不需要 显式导入 OSGi 服务。 第 13 章 使用 JMS 代理部署摘要 Fuse 7.11 不提供默认的内部代理,但设计为与四个外部 JMS 代理进行接口。 Fuse 7.11 容器包含受支持的外部代理的代理客户端库。 有关在 Fuse 7.11 上可用的外部代理、客户端和 Camel 组件组合的更多信息,请参阅支持的配置。 https://access.redhat.com/articles/310603 13.1. AMQ 7 快速入门提供了快速入门来演示使用 AMQ 7 代理的应用程序设置和部署。 下载快速入门
您可从
Fuse Software Downloads
页面安装所有快速入门。
将下载的 zip 文件的内容提取到本地文件夹,例如:名为 Quickstart 的文件夹。
设置快速入门
12:13:50.445 INFO [Blueprint Event Dispatcher: 1] Attempting to start Camel Context jms-example-context 12:13:50.446 INFO [Blueprint Event Dispatcher: 1] Apache Camel 2.21.0.fuse-000030 (CamelContext: jms-example-context) is starting 12:13:50.446 INFO [Blueprint Event Dispatcher: 1] JMX is enabled 12:13:50.528 INFO [Blueprint Event Dispatcher: 1] StreamCaching is not in use. If using streams then its recommended to enable stream caching. See more details at http://camel.apache.org/stream-caching.html 12:13:50.553 INFO [Blueprint Event Dispatcher: 1] Route: file-to-jms-route started and consuming from: file://work/jms/input 12:13:50.555 INFO [Blueprint Event Dispatcher: 1] Route: jms-cbr-route started and consuming from: jms://queue:incomingOrders?transacted=true 12:13:50.556 INFO [Blueprint Event Dispatcher: 1] Total 2 routes, of which 2 are started 运行快速入门
Receiving order order1.xml Sending order order1.xml to another country Done processing order1.xml
13.2. 使用 ROLES 核心客户端
Artemis 核心客户端可用于连接到外部代理,而非
使用 ROLES 核心客户端进行连接
第 14 章 故障转移部署摘要 红帽 Fuse 使用简单的锁定文件系统或 JDBC 锁定机制提供故障切换功能。在这两种情况下,容器级锁定系统都允许捆绑包加载到二级内核实例中,以便提供更快的故障转移性能。 14.1. 使用简单锁定文件系统首次启动 Red Hat Fuse 时,会在安装目录的根目录中创建锁定文件。您可以通过设置主实例失败的主(secondary)系统,将锁定传递给位于同一主机上的次要实例。 配置锁定文件系统
要配置锁定文件故障切换部署,请编辑主和二级安装中的
例 14.1. 锁定文件故障切换配置 karaf.lock=true
karaf.lock.class=org.apache.karaf.main.SimpleFileLock
karaf.lock.dir=PathToLockFileDirectory
karaf.lock.delay=10000
14.2. 使用 JDBC 锁定系统JDBC 锁定机制主要用于在单独的机器上存在红帽 Fuse 实例的故障转移部署。 在这种情况下,主实例会在由数据库托管的锁定表中有一个锁定。如果主实例丢失锁定,则等待的辅助进程获得对锁定表的访问,并完全启动其容器。 在类路径中添加 JDBC 驱动程序
在 JDBC 锁定系统中,JDBC 驱动程序需要位于主/secondary设置中每个实例的类路径上。在类路径中添加 JDBC 驱动程序,如下所示:
将 JDBC 驱动程序 JAR 文件复制到每个 Red Hat Fuse 实例的
注意
如果您要添加 MySQL 驱动程序 JAR 或 PostgreSQL 驱动程序 JAR,您必须用
配置 JDBC 锁定系统
要配置 JDBC 锁定系统,请更新主/次要部署中每个实例的
例 14.2. JDBC 锁定文件配置 karaf.lock=true karaf.lock.class=org.apache.karaf.main.lock.DefaultJDBCLock karaf.lock.level=50 karaf.lock.delay=10000 karaf.lock.jdbc.url=jdbc:derby://dbserver:1527/sample karaf.lock.jdbc.driver=org.apache.derby.jdbc.ClientDriver karaf.lock.jdbc.user=user karaf.lock.jdbc.password=password karaf.lock.jdbc.table=KARAF_LOCK karaf.lock.jdbc.clustername=karaf karaf.lock.jdbc.timeout=30 在示例中,如果不存在名为 sample 的数据库,则会创建名为 sample 的数据库。获取锁定表的第一个红帽 Fuse 实例是主实例。如果与数据库的连接丢失,则主实例会尝试正常关闭,允许次要实例在恢复数据库服务时成为主实例。之前的主实例需要手动重启。 在 Oracle 中配置 JDBC 锁定
如果您在 JDBC 锁定方案中使用 Oracle 作为数据库,则
例 14.3. Oracle 的 JDBC 锁定文件配置 karaf.lock=true karaf.lock.class=org.apache.karaf.main.lock.OracleJDBCLock karaf.lock.jdbc.url=jdbc:oracle:thin:@hostname:1521:XE karaf.lock.jdbc.driver=oracle.jdbc.OracleDriver karaf.lock.jdbc.user=user karaf.lock.jdbc.password=password karaf.lock.jdbc.table=KARAF_LOCK karaf.lock.jdbc.clustername=karaf karaf.lock.jdbc.timeout=30
注意
在 Derby 中配置 JDBC 锁定
如果您在 JDBC 锁定方案中使用 Derby 作为数据库,则
例 14.4. Derby 的 JDBC Lock 文件配置 karaf.lock=true karaf.lock.class=org.apache.karaf.main.lock.DerbyJDBCLock karaf.lock.jdbc.url=jdbc:derby://127.0.0.1:1527/dbname karaf.lock.jdbc.driver=org.apache.derby.jdbc.ClientDriver karaf.lock.jdbc.user=user karaf.lock.jdbc.password=password karaf.lock.jdbc.table=KARAF_LOCK karaf.lock.jdbc.clustername=karaf karaf.lock.jdbc.timeout=30 在 MySQL 中配置 JDBC 锁定
如果您在 JDBC 锁定方案中使用 MySQL 作为数据库,则
例 14.5. MySQL 的 JDBC 锁定文件配置 karaf.lock=true karaf.lock.class=org.apache.karaf.main.lock.MySQLJDBCLock karaf.lock.jdbc.url=jdbc:mysql://127.0.0.1:3306/dbname karaf.lock.jdbc.driver=com.mysql.jdbc.Driver karaf.lock.jdbc.user=user karaf.lock.jdbc.password=password karaf.lock.jdbc.table=KARAF_LOCK karaf.lock.jdbc.clustername=karaf karaf.lock.jdbc.timeout=30 在 PostgreSQL 上配置 JDBC 锁定
如果您在 JDBC 锁定方案中使用 PostgreSQL 作为数据库,则
例 14.6. PostgreSQL 的 JDBC 锁定文件配置 karaf.lock=true karaf.lock.class=org.apache.karaf.main.lock.PostgreSQLJDBCLock karaf.lock.jdbc.url=jdbc:postgresql://127.0.0.1:5432/dbname karaf.lock.jdbc.driver=org.postgresql.Driver karaf.lock.jdbc.user=user karaf.lock.jdbc.password=password karaf.lock.jdbc.table=KARAF_LOCK karaf.lock.jdbc.clustername=karaf karaf.lock.jdbc.timeout=0 JDBC 锁定类以下 JDBC 锁定类目前由 Apache Karaf 提供: org.apache.karaf.main.lock.DefaultJDBCLock org.apache.karaf.main.lock.DerbyJDBCLock org.apache.karaf.main.lock.MySQLJDBCLock org.apache.karaf.main.lock.OracleJDBCLock org.apache.karaf.main.lock.PostgreSQLJDBCLock 14.3. 容器级别的锁定概述容器级别的锁定允许将捆绑包加载到二级内核实例中,以便提供更快的故障转移性能。在简单的文件和 JDBC 锁定机制中都支持容器级别的锁定。 配置容器级别锁定
要实现容器级别的锁定,请在 primary/secondary 设置的每个系统上的
例 14.7. 容器级别的锁定配置 karaf.lock=true karaf.lock.level=50 karaf.lock.delay=10000
表 14.1. 捆绑包启动级别
避免端口冲突
当在同一主机上使用"热"备用时,您需要将 JMX 远程端口设置为唯一值,以避免绑定冲突。您可以编辑
DEFAULT_JAVA_OPTS="-server $DEFAULT_JAVA_OPTS -Dcom.sun.management.jmxremote.port=1100 -Dcom.sun.management.jmxremote.authenticate=false" 第 15 章 URL 处理程序Red Hat Fuse 中有很多上下文,您需要提供 URL 来指定资源的位置(例如,作为控制台命令的参数)。通常,在指定 URL 时,您可以使用 Fuse 的内置 URL 处理程序支持的任何方案。本附录介绍了所有可用的 URL 处理程序的语法。 15.1. 文件 URL 处理程序15.1.1. 语法
文件 URL 的语法是
15.1.2. 例子
例如,考虑 Windows 上的路径名称,
file:C:/Projects/camel-bundle/target/foo-1.0-SNAPSHOT.jar file:C:\\Projects\\camel-bundle\\target\\foo-1.0-SNAPSHOT.jar 以下示例显示了 Windows 中文件 URL 的一些 不正确 的替代方法: file:C:\Projects\camel-bundle\target\foo-1.0-SNAPSHOT.jar // WRONG! file://C:/Projects/camel-bundle/target/foo-1.0-SNAPSHOT.jar // WRONG! file://C:\\Projects\\camel-bundle\\target\\foo-1.0-SNAPSHOT.jar // WRONG! 15.2. HTTP URL 处理程序15.2.1. 语法
HTTP URL 具有标准语法
15.3. mvn URL Handler15.3.1. 概述如果您使用 Maven 构建捆绑包,或者知道特定捆绑包可从 Maven 存储库中获取,您可以使用 Mvn handler 方案来定位捆绑包。 为确保 Mvn URL 处理程序可以找到本地和远程 Maven 工件,您可能会发现需要它来自定义 Mvn URL 处理程序配置。详情请查看 第 15.3.5 节 “配置 Mvn URL 处理程序” 。 15.3.2. 语法Mvn URL 具有以下语法: mvn:[repositoryUrl!]groupId/artifactId[/[version][/[packaging][/[classifier]]]] 其中 repositoryUrl optionally 指定 Maven 存储库的 URL。 groupId 、 artifactId 、 版本 、 打包和 分类器 是标准的 Maven 协调,用于查找 Maven 工件。 15.3.3. 省略协调
当指定 Mvn URL 时,只需要
groupId
和
artifactId
协调。以下示例使用
groupId
、
mvn:org.fusesource.example/bundle-demo mvn:org.fusesource.example/bundle-demo/1.1
当省略
版本
时,如第一个示例所示,它默认为
mvn:groupId/artifactId///classifier mvn:groupId/artifactId/version//classifier mvn:groupId/artifactId//packaging/classifier mvn:groupId/artifactId//packaging 15.3.4. 指定版本范围
当在 Mvn URL 中指定
version
值时,您可以指定一个版本范围(使用标准 Maven 版本范围语法)以代替简单的版本号。您可以使用方括号
mvn:org.fusesource.example/bundle-demo/[1.0.4,2.0) 15.3.5. 配置 Mvn URL 处理程序首次使用 Mvn URL 前,您可能需要自定义 Mvn URL 处理程序设置,如下所示: 第 15.3.6 节 “检查 Mvn URL 设置” . 第 15.3.7 节 “编辑配置文件” . 第 15.3.8 节 “自定义本地存储库的位置” . 15.3.6. 检查 Mvn URL 设置Mvn URL 处理程序解析对本地 Maven 存储库的引用,并维护远程 Maven 存储库列表。解决 Mvn URL 时,处理程序首先搜索本地存储库,然后搜索远程存储库以查找指定的 Maven artifiact。如果解析 Mvn URL 出现问题,您应该首先检查处理程序设置,以查看使用哪个本地存储库和远程存储库来解析 URL。 要检查 Mvn URL 设置,在控制台中输入以下命令: JBossFuse:karaf@root> config:edit org.ops4j.pax.url.mvn JBossFuse:karaf@root> config:proplist
org.ops4j.pax.url.mvn.defaultRepositories = file:/path/to/JBossFuse/jboss-fuse-7.11.1.fuse-7_11_1-00013-redhat-00003/system@snapshots@id=karaf.system,file:/home/userid/.m2/repository@snapshots@id=local,file:/path/to/JBossFuse/jboss-fuse-7.11.1.fuse-7_11_1-00013-redhat-00003/local-repo@snapshots@id=karaf.local-repo,file:/path/to/JBossFuse/jboss-fuse-7.11.1.fuse-7_11_1-00013-redhat-00003/system@snapshots@id=child.karaf.system org.ops4j.pax.url.mvn.globalChecksumPolicy = warn org.ops4j.pax.url.mvn.globalUpdatePolicy = daily org.ops4j.pax.url.mvn.localRepository = /path/to/JBossFuse/jboss-fuse-7.11.1.fuse-7_11_1-00013-redhat-00003/data/repository org.ops4j.pax.url.mvn.repositories = http://repo1.maven.org/maven2@id=maven.central.repo, https://maven.repository.redhat.com/ga@id=redhat.ga.repo, https://maven.repository.redhat.com/earlyaccess/all@id=redhat.ea.repo, https://repository.jboss.org/nexus/content/groups/ea@id=fuseearlyaccess org.ops4j.pax.url.mvn.settings = /path/to/jboss-fuse-7.11.1.fuse-7_11_1-00013-redhat-00003/etc/maven-settings.xml org.ops4j.pax.url.mvn.useFallbackRepositories = false service.pid = org.ops4j.pax.url.mvn
其中
15.3.7. 编辑配置文件要自定义 Mvn URL 处理程序的属性设置,请编辑以下配置文件: InstallDir/etc/org.ops4j.pax.url.mvn.cfg
此文件中的设置允许您显式指定本地 Maven 存储库的位置,删除 Maven 存储库、Maven 代理服务器设置等。有关这些设置的详情,请查看 配置文件中的注释。 15.3.8. 自定义本地存储库的位置
特别是,如果您的本地 Maven 存储库位于非默认位置,您可能会发现需要对其进行显式配置,以便访问本地构建的 Maven 工件。在您的
# Path to the local maven repository which is used to avoid downloading # artifacts when they already exist locally. # The value of this property will be extracted from the settings.xml file # above, or defaulted to: # System.getProperty( "user.home" ) + "/.m2/repository" org.ops4j.pax.url.mvn.localRepository=file:E:/Data/.m2/repository 15.3.9. 参考
有关
15.4. 嵌套 URL 处理程序15.4.1. 概述如果您需要引用未打包为捆绑包的 JAR 文件,您可以使用 Wrap URL 处理程序进行动态转换。Wrap URL 处理程序的实施基于 Peter Krien 的开源 Bnd 工具。 15.4.2. 语法Wrap URL 具有以下语法: wrap:locationURL[,instructionsURL][$instructions]
locationURL
可以是找到 JAR 的任何 URL(引用的 JAR
不会
作为捆绑包的格式)。可选的
instructionsURL
引用了一个 Bnd 属性文件,用于指定如何执行捆绑包转换。可选的
指令是
符号、和,由 Bnd 属性列表指定如何执行捆绑包转换。
15.4.3. 默认说明
在大多数情况下,默认的 Bnd 指令可用于嵌套 API JAR 文件。默认情况下,Wrap 将清单标头添加到 JAR 的
表 15.1. Wrapping a JAR 的默认说明
15.4.4. 例子
以下 Wrap URL 找到 Maven 存储库中的
wrap:mvn:commons-logging/commons-logging/1.1
以下 Wrap URL 使用来自文件的 Bnd 属性,
wrap:mvn:commons-logging/commons-logging/1.1,file:E:/Data/Examples/commons-logging-1.1.bnd
以下 Wrap URL 指定
wrap:mvn:commons-logging/commons-logging/1.1$Bundle-SymbolicName=apache-comm-log&Bundle-Version=1.1
如果前面的 URL 用作命令行参数,可能需要转义美元符号
wrap:mvn:commons-logging/commons-logging/1.1\$Bundle-SymbolicName=apache-comm-log&Bundle-Version=1.1 15.4.5. 参考
有关嵌套 URL
15.5. war URL Handler15.5.1. 概述
如果您需要在 OSGi 容器中部署 WAR 文件,您可以通过使用
15.5.2. 语法使用以下语法之一指定 War URL: war:warURL warref:instructionsURL
第一个语法使用
15.5.3. WAR 特定属性/结构
15.5.4. 默认说明
默认情况下,War URL 处理程序将清单标头添加到 WAR 的
表 15.2. Wrapping a WAR 文件的默认指令
15.5.5. 例子
以下 War URL 在 Maven 存储库中找到
war:mvn:org.apache.wicket/wicket-examples/1.4.7/war
以下 Wrap URL 明确指定
war:mvn:org.apache.wicket/wicket-examples/1.4.7/war?Web-ContextPath=wicket
以下 War URL 将
warref:file:E:/Data/Examples/wicket-examples-1.4.7.bnd 15.5.6. 参考
有关
部分 II. 用户指南这部分包含在红帽 Fuse 上 Apache Karaf 的配置和准备信息。 第 16 章 部署至 Apache Karaf 用户指南摘要 在使用部署到 Apache 手册中的此用户指南部分前,您必须按照在 Apache Karaf 上安装 的说明安装最新版本的 Red Hat Fuse。 16.1. Fuse 配置简介OSGi 配置管理服务指定部署服务的配置信息,并确保服务在激活时接收这些数据。 16.2. OSGi 配置
配置是名称值对列表,从
16.3. 配置文件您可以使用以下文件配置 Red Hat Fuse 运行时: 表 16.1. Fuse 配置文件
16.4. 高级 Undertow 配置16.4.1. IO 配置自 PAXWEB-1255 起,可以更改监听器使用的 XNIO worker 和缓冲池的配置。在 undertow.xml 模板中有一个指定某些与 IO 相关参数的默认值的部分: <!-- Only "default" worker and buffer-pool are supported and can be used to override the default values used by all listeners buffer-pool: - buffer-size defaults to: - when < 64MB of Xmx: 512 - when < 128MB of Xmx: 1024 - when >= 128MB of Xmx: 16K - 20 - direct-buffers defaults to: - when < 64MB of Xmx: false - when >= 64MB of Xmx: true worker: - io-threads defaults to Math.max(Runtime.getRuntime().availableProcessors(), 2); - task-core-threads and task-max-threads default to io-threads * 8 <subsystem xmlns="urn:jboss:domain:io:3.0"> <buffer-pool name="default" buffer-size="16364" direct-buffers="true" /> <worker name="default" io-threads="8" task-core-threads="64" task-max-threads="64" task-keepalive="60000" /> </subsystem> 可以指定以下 16.4.2. worker IO 配置
可以在每个服务或捆绑包的基础上配置 Undertow 线程池及其名称,这有助于从 Hawtio 控制台进行监控并更有效地调试。
在捆绑包蓝图配置文件中(通常存储在 Maven 项目中的
例 16.1. httpu:engine-factory 元素带有 workerIOName 和 ThreadPool 配置 <httpu:engine-factory> <httpu:engine port="9001"> <httpu:threadingParameters minThreads="99" maxThreads="777" workerIOThreads="8" workerIOName="WorkerIOTest"/> </httpu:engine> </httpu:engine-factory>
可指定
16.5. 配置文件命名规则配置文件的文件命名规则取决于配置是否适用于 OSGi 托管服务还是 OSGi 托管服务的工厂。 OSGi 托管服务的配置文件遵循以下命名约定: <PID>.cfg
其中,&
<PID>-<InstanceID>.cfg
其中
16.6. 设置 Java 选项
可以使用 Linux 中的
JAVA_MIN_MEM=512M # Minimum memory for the JVM To set a Java option other than the direct options, use EXTRA_JAVA_OPTS="Java option"
For example, EXTRA_JAVA_OPTS="-XX:+UseG1GC" 16.7. 配置控制台命令有多个控制台命令可用于更改或交集 Fuse 7.11 的配置。 如需有关 config: 命令的更多详情,请参阅 Apache Karaf Console Reference 中的 Config 部分。 16.8. JMX ConfigMBean
在 JMX 层,
M
Bean 专用于配置管理。
表 16.2. JMX MBean 操作
16.9. 使用控制台16.9.1. 可用命令
要在控制台中查看可用命令列表,您可以使用
karaf@root()> help bundle Enter the subshell bundle:capabilities Displays OSGi capabilities of a given bundles. bundle:classes Displays a list of classes/resources contained in the bundle bundle:diag Displays diagnostic information why a bundle is not Active bundle:dynamic-import Enables/disables dynamic-import for a given bundle. bundle:find-class Locates a specified class in any deployed bundle bundle:headers Displays OSGi headers of a given bundles. bundle:id Gets the bundle ID. 您有简短描述的所有命令列表。 您可以使用 tab 键获得所有命令的快速列表:karaf@root()> Display all 294 possibilities? (y or n) ... 16.9.2. 子 shell 和完成模式
命令具有作用域和名称。例如,命令
karaf@root()> feature:list 或在子 shell 中输入命令并键入命令上下文到子 shell:karaf@root()> feature karaf@root(feature)> list 16.9.3. 像环境一样的 UNIXKaraf 控制台提供完整的 Unix 控制台,如环境。 16.9.3.1. help 或 man
我们已看到
karaf@root()> help feature:list karaf@root()> man feature:list karaf@root()> feature:list --help 所有都生成相同的帮助输出: DESCRIPTION feature:list Lists all existing features available from the defined repositories. SYNTAX feature:list [options] OPTIONS --help Display this help message -o, --ordered Display a list using alphabetical order -i, --installed Display a list of all installed features only --no-format Disable table rendered output 16.9.3.2. completion当您键入 tab 键时,Batton 会尝试完成: subshell commands 16.9.3.3. Alias
别名是与给定命令关联的另一个名称。
karaf@root()> alias "list-features-installed = { feature:list -i }" karaf@root()> list-features-installed Name | Version | Required | State | Repository | Description ------------------------------------------------------------------------------------------------------------------------------ feature | 4.0.0 | x | Started | standard-4.0.0 | Features Support shell | 4.0.0 | x | Started | standard-4.0.0 | Karaf Shell deployer | 4.0.0 | x | Started | standard-4.0.0 | Karaf Deployer bundle | 4.0.0 | x | Started | standard-4.0.0 | Provide Bundle support config | 4.0.0 | x | Started | standard-4.0.0 | Provide OSGi ConfigAdmin support diagnostic | 4.0.0 | x | Started | standard-4.0.0 | Provide Diagnostic support instance | 4.0.0 | x | Started | standard-4.0.0 | Provide Instance support jaas | 4.0.0 | x | Started | standard-4.0.0 | Provide JAAS support log | 4.0.0 | x | Started | standard-4.0.0 | Provide Log support package | 4.0.0 | x | Started | standard-4.0.0 | Package commands and mbeans service | 4.0.0 | x | Started | standard-4.0.0 | Provide Service support system | 4.0.0 | x | Started | standard-4.0.0 | Provide System support kar | 4.0.0 | x | Started | standard-4.0.0 | Provide KAR (KARaf archive) support ssh | 4.0.0 | x | Started | standard-4.0.0 | Provide a SSHd server on Karaf management | 4.0.0 | x | Started | standard-4.0.0 | Provide a JMX MBeanServer and a set of MBeans in
登录时,Apache Karaf 控制台会读取
ld = { log:display $args } ; lde = { log:exception-display $args } ; la = { bundle:list -t 0 $args } ; ls = { service:list $args } ; cl = { config:list "(service.pid=$args)" } ; halt = { system:shutdown -h -f $args } ; help = { *:help $args | more } ; man = { help $args } ; log:list = { log:get ALL } ;
您可以在此处看到默认可用的别名:
16.9.3.4. 密钥绑定与在大多数 Unix 环境中一样,Patton 控制台支持一些键绑定: 要在命令历史记录中导航的箭头键 CTRL-D 注销/shutdown Karaf 使用 CTRL-R 搜索之前执行的命令 使用 CTRL-U 删除行 16.9.3.5. pipe您可以将一个命令的输出作为输入传送到另一个命令的输出。这是一个管道,使用 | 字符: karaf@root()> feature:list |grep -i war pax-war | 4.1.4 | | Uninstalled | org.ops4j.pax.web-4.1.4 | Provide support of a full WebContainer pax-war-tomcat | 4.1.4 | | Uninstalled | org.ops4j.pax.web-4.1.4 | war | 4.0.0 | | Uninstalled | standard-4.0.0 | Turn Karaf as a full WebContainer blueprint-web | 4.0.0 | | Uninstalled | standard-4.0.0 | Provides an OSGI-aware Servlet ContextListener fo 16.9.3.6. grep, more, find, …
Karaf 控制台提供一些与 Unix 环境类似的核心命令:
16.9.3.7. 脚本
Apache Karaf 控制台支持完整的脚本语言,类似于 Unix 上的 bash 或 csh。
karaf@root()> list = [1 2 3]; each ($list) { echo $it } 可使用 16.9.4. 安全性Apache Karaf 控制台支持基于角色的访问控制(RBAC)安全机制。这意味着,根据连接到控制台的用户,您可以根据用户的组和角色定义、执行某些命令的权限,或者限制参数允许的值。 控制台 安全性在本指南的安全部分 进行了详细。 16.10. 置备Apache Karaf 支持使用 Karaf 功能的概念来置备应用程序和模块。 16.10.1. Application(应用程序)通过置备应用程序,这意味着安装所有模块、配置和传输应用程序。 16.10.2. OSGi它原生支持 OSGi 应用程序的部署。 OSGi 应用程序是一组 OSGi 捆绑包。OSGi 捆绑包是一个常规 jar 文件,它带有 jar MANIFEST 中的其他元数据。 在 OSGi 中,捆绑包可以依赖其他捆绑包。因此,这意味着大多数时候部署 OSGi 应用程序,您首先需要部署应用程序所需的许多其他捆绑包。 因此,您必须首先找到这些捆绑包,安装捆绑包。同样,这些"依赖项"捆绑包可能需要其他捆绑包来满足自己的依赖项。 通常,应用程序需要配置(请参阅用户指南中的 [Configuration 部分| 配置])。因此,在除了依赖捆绑包外,还需要创建或部署配置,然后才能启动您的应用程序。 正如我们看到的那样,应用程序的配置可能非常长且非常快。 16.10.3. 功能和解析程序
Apache Karaf 提供简单而灵活的方式来置备应用程序。
在 Apache Karaf 中,应用程序调配是一个 Apache Karaf "feature"。
功能描述了应用程序:
可选描述(以长描述为事件)
(可选)设置配置或配置文件
(可选)依赖项功能集
安装功能时,Apache Karaf 安装功能中描述的所有资源。这意味着它将自动解析并安装功能中描述的所有捆绑包、配置和依赖项功能。
功能解析器检查服务要求,并安装提供与要求匹配的服务的捆绑包。默认模式只为"new 风格"功能存储库启用此行为(基本来说,模式的功能库 XML 等于 1.3.0)。它不适用于"旧风格"功能存储库(与 Karaf 2 或 3 起)。
您可以使用
serviceRequirements=default 可能的值有: Disable: 服务要求完全忽略,对于"旧风格"和"新风格"功能存储库,都会完全忽略 默认值:对于"旧风格"功能存储库,会忽略服务要求,并为"新风格"功能存储库启用。 enforce:服务要求总是被验证,用于"旧风格"和"新风格的功能存储库。 另外,一个功能也可以定义要求。在这种情况下,Bill 可以自动进行额外的捆绑包或功能,从而满足要求。 功能具有完整的生命周期:安装、启动、停止、更新、卸载。 16.10.4. 功能软件仓库
功能在 XML 描述符中描述。这个 XML 文件包含一组功能的描述。
XML 描述符的名称为"功能存储库"。在安装功能前,您必须注册提供该功能的功能存储库(使用
<features xmlns="http://karaf.apache.org/xmlns/features/v1.3.0"> <feature name="feature1" version="1.0.0"> <bundle>...</bundle> <bundle>...</bundle> </feature> <feature name="feature2" version="1.1.0"> <feature>feature1</feature> <bundle>...</bundle> </feature> </features>
我们可能会注意到 XML 的功能带有 schema。查看详情的用户指南的 [Features XML Schema 部分|provisioning-schema]。
16.10.5. 引导特性
您可以将一些功能描述为引导功能。即使之前还没有通过
16.10.6. 升级功能您可以通过安装相同的功能(使用相同的 SNAPSHOT 或不同的版本)来更新发行版本。 由于功能生命周期,您可以控制功能的状态(启动、停止等)。 您还可以使用模拟来查看更新将做什么。 16.10.7. overrides功能中定义的捆绑包可以使用文件 etc/overrides.properties 覆盖。文件的每一行都定义一个覆盖。语法为: <bundle-uri>[;range="[min,max)"]。如果覆盖版本大于覆盖捆绑包的版本和范围匹配,给定捆绑包中的功能定义中会覆盖的所有捆绑包和范围匹配。如果没有提供范围,则假设在微版本级别的兼容性。 例如,覆盖 mvn:org.ops4j.pax.logging/pax-logging-service/1.8.5 将 overide pax-logging-service 1.8.3 而不是 1.8.6 或 1.7.0。 16.10.8. 功能捆绑包16.10.8.1. 开始级别
默认情况下,功能部署的捆绑包在
<feature name="my-project" version="1.0.0"> <bundle start-level="80">mvn:com.mycompany.myproject/myproject-dao</bundle> <bundle start-level="85">mvn:com.mycompany.myproject/myproject-service</bundle> </feature>
start-level 属性可确保在使用它的捆绑包之前启动
16.10.8.2. 模拟、启动和停止
您可以使用
<feature name="my-project" version="1.0.0"> <bundle start-level="80" start="false">mvn:com.mycompany.myproject/myproject-dao</bundle> <bundle start-level="85" start="false">mvn:com.mycompany.myproject/myproject-service</bundle> </feature> 16.10.8.3. 依赖项
一个捆绑包可以被标记为依赖项,使用 <
16.10.9. 依赖功能功能可以依赖于一组其他功能: <feature name="my-project" version="1.0.0"> <feature>other</feature> <bundle start-level="80" start="false">mvn:com.mycompany.myproject/myproject-dao</bundle> <bundle start-level="85" start="false">mvn:com.mycompany.myproject/myproject-service</bundle> </feature>
将安装
<feature name="spring-dm"> <feature version="[2.5.6,4)">spring</feature> </feature>
将安装范围中最高版本的功能。
如果指定了单个版本,则该范围将被视为开放范围。
如果未指定,则安装最高可用。
要指定准确版本,请使用
16.10.9.1. 功能先决条件
先决条件功能是特殊的依赖项类型。如果将
16.10.10. 功能配置
功能 XML 中的
<config name="com.foo.bar"> myProperty = myValue </config>
<
16.10.11. 功能配置文件
一个功能可以指定 &
<configfile finalname="/etc/myfile.cfg" override="false">URL</configfile>
<
<configfile finalname="${karaf.etc}/myfile.cfg" override="false">URL</configfile>
如果文件已存在于所需的位置,并且跳过了配置文件的部署,因为已有的文件可能会包含自定义。这种行为可通过覆盖设置为 true
16.10.11.1. 要求功能也可以指定预期的要求。功能解析器将尝试满足要求。为此,它会检查功能和捆绑包功能,并将自动安装捆绑包以满足要求。 例如,一个功能可以包含以下内容: <requirement>osgi.ee;filter:="(&(osgi.ee=JavaSE)(!(version>=1.8)))"</requirement> 要求指定只有在 JDK 版本不是 1.8(因此基本上为 1.7)时,该功能才会正常工作。 当一个可选的依赖项满足时,功能解析器也可以刷新捆绑包,从而重新运行可选的导入。 16.10.12. 命令
16.10.12.1.
|
豪情万千的山羊 · JVM性能分析工具使用 | Fluid 1 周前 |