JBoss Fuse 快速指南



JBoss Fuse - ESB 简介

在本章中,我们将从企业服务总线 (ESB) 的基础知识开始。下面是对 ESB 的详细解释,包括其优点、缺点和一些便于理解的图表。

什么是 ESB?

ESB 代表企业服务总线。ESB 最简单的形式是一种中间件,它充当信息高速公路,帮助多个应用程序进行通信。

在企业世界中,我们为许多事情开发解决方案。这些解决方案可能使用不同的技术和不同的数据格式。由于这些技术的通信或数据格式的兼容性差异,将这些解决方案一起使用变得很麻烦。因此,我们需要一种技术来允许这些不同解决方案之间的**松散耦合集成**。

ESB 旨在通过成为位于所有应用程序中间的“中心”,并促进它们之间的消息路由来简化这一集成问题。ESB 充当调解器,充当信息高速公路,负责数据转换路由,让程序员或开发人员专注于自己的应用程序逻辑。

当我们理解 ESB 为其专门设计的问题时,理解 ESB 就变得非常简单,解决方案也变得容易。应该清楚地了解如何启用许多不同的系统(使用不同的语言编写,并在使用不同数据格式的不同机器上运行)来共享信息并形成一个集成的业务平台。

集成问题

在企业平台中,多个应用程序协同工作并整体提供业务功能是很常见的,但这些应用程序的集成是最经常出现的问题。随着应用程序的增长,这个问题会变得更加困难。

每个应用程序都可以使用自己的格式输入和输出数据。如果应用程序的数量较少,这种方法效果很好,但是随着应用程序数量的增加,集成方法也需要改进。例如,如果业务的特定应用程序需要更改,则所有依赖于该主应用程序的应用程序的输出或输入数据格式都会受到影响。

这种方法是集成面临的最大障碍,它需要紧密耦合的架构。这就是 ESB 发挥作用的地方。每个应用程序不需要直接与其他应用程序通信;相反,所有应用程序都与 ESB 通信,ESB 处理信息的路由和内部数据格式转换。

Integration Problem

为什么选择 ESB?

以下是解释为什么企业服务总线必不可少的一些要点。

  • ESB 旨在简化与具有不同兼容性应用程序的集成问题。

  • 它充当中间件,充当所有应用程序的调解器,并促进它们之间的消息路由。

  • 每个应用程序不再直接与其他每个应用程序交互,现在每个应用程序只有一个与 ESB 的接口。

  • ESB 负责将消息转换为/从通用格式转换,并将其路由到其目的地。

  • 如果必须替换任何现有应用程序,这种方法的主要节省将成为一大优势。您不必编写大量新的接口,而只需关注一个接口(应用程序和 ESB 之间的接口)。

ESB

SOA 与 ESB?

SOA 和 ESB 通常可以互换使用,但它们完全不同。

SOA 是一种设计模式,它允许应用程序通过通信协议在网络上公开其功能作为服务,而 ESB 是一种促进不同系统之间通信的模型,但是 ESB 可以用作实施 SOA 的主干。

什么是 Fuse?

JBoss Fuse 是 Red Hat 的开源 ESB 解决方案。它是一个基于社区项目 Apache Servicemix 的企业解决方案。

与 Fuse 集成

JBoss Fuse 是一个轻量级且灵活的集成平台,允许快速集成企业应用程序。

Fuse 最初由 Progressive Software Inc. 开发,该公司于 2012 年被 Red Hat 收购。JBoss Fuse 6.1.0.redhat-379 GA 是 Fuse 的稳定版本,可以从其官方网站下载。

架构

Fuse 将各种技术组合在一起作为单个产品。

Architecture

组件

Apache CXF

Apache CXF 是一个开源 Web 服务开发框架,它也支持 SOAP 和 REST Web 服务的开发。

Apache Camel

Apache Camel 是一个基于 EIP 的集成框架。EIP 或企业集成模式是企业集成中反复出现问题的已识别解决方案。使用这些预定义的开箱即用模式的组合,可以迅速实现完整的集成解决方案。

它允许使用多种领域特定语言(如 Java、Spring DSL 和 Scala 等)编写路由逻辑。

Apache AMQ

Apache AMQ 是一个 JMS,它根据 JMS 标准提供可靠的消息传递系统。它不仅支持 JMS 规范,还提供 JMS 规范中未包含的一些令人兴奋且有用的功能。

Apache Karaf

Apache Karaf 是一个轻量级的 OSGi 容器,充当工件的运行时环境。与 JVM 相比,Apache Karaf 更具动态性。它允许在运行时安装或卸载模块。Fuse 中的所有工件都部署在 Karaf 中。

Fabric

Fabric 提供了一种简单的方法来管理大型分布式环境中工件的部署。它为所有多个 Fuse 实例提供集中式管理。

安装 Fuse

安装 Fuse 非常简单。与其他 JBoss 产品一样,Fuse 以 zip 文件的形式提供,可以解压缩,并且在进行一些小的配置更改后可以直接启动。

安装 Fuse 是一个四步过程:

下载

从以下链接下载 Fuse 6.1.0 GA。https://jboss.com.cn/

解压缩

与所有其他 JBoss 产品一样,Fuse 也是一个平台无关的 zip 文件。

将下载的文件解压缩到您希望作为 Fuse 安装目录的目标目录中。明智地选择此目录,因为它应该在 Fuse 实例的整个生命周期中保持不变。

**注意** - 即使 Fuse 的解压缩和启动方式与其他 JBoss 产品一样,也不建议在安装完成后将 Fuse 安装从一个位置移动到另一个位置。

配置

解压缩 Fuse 后,您将在解压缩的目录中找到以下目录:

  • bin
  • etc
  • deploy
  • lib
  • licenses
  • extras
  • quickstarts

我们将只使用其中的两个目录**bin** 和**etc**。

实际上,在解压缩 Fuse 后,我们应该能够直接启动 Fuse,但这将使用所有默认配置启动 Fuse,这对于生产环境是不建议的。强烈建议在启动 Fuse 之前进行以下更改。

设置环境变量

  • 设置以下环境变量 – **JAVA_HOME**

  • 该变量应指向 Java 安装目录 – **M2_HOME**

  • 该变量应指向 Maven 安装目录 – **PATH**

  • 设置路径变量以包含 Java 和 Maven 可执行文件。

Windows

在 Windows 上,可以通过以下说明进行设置:

开始→我的电脑→右键单击→属性→高级系统设置→环境变量。

UNIX 和克隆系统

对于每个用户,在 *nix 操作系统中都有一个 bash 配置文件。我们可以通过更改此文件来添加或编辑现有的系统变量。

$ vi ~/.bash_profile

**注意** - 此文件的任何更改都是永久性的。强烈建议在更改原始文件之前备份现有文件。

基本配置

我们将讨论 JBoss Fuse 的基本配置,为此,我们必须从以下命令开始 **Edit $FUSE_INSTALLATION_DIR/etc/**

  • 在 **user.properties** 中

    • #admin=admin,admin

    • 这需要根据我们想要的第一个管理员用户名进行更改,第二个管理员密码,第三个可能保持不变,因为它表示一个角色,并且不要忘记删除 #

    • 例如 – FuseAdmin = FusePAss,admin

Basic Configuration
  • 在 **system.properties** 中

    • karafName = root

      • 这指示您要为 Karaf 实例指定的名称。

      • 我们可以将其命名为任何我们想要的名称,例如 Cont1。

      • 确保您指定的名称是唯一的名称,并且尚未被另一个 Fuse 实例使用。

  • 在 **org.ops4j.pax.web.cfg** 中

    • org.osgi.service.http.port = 8181

    • 此属性指示要用于访问 Fuse 提供的基于浏览器的界面 HAWTIO 的端口

    • HAWTIO 是从 6.0 版本开始提供的 Fuse 的内置浏览器界面

  • 在 **org.ops4j.pax.url.mvn.cfg** 中

    • org.ops4j.pax.url.mvn.localRepository = D:/repository

    • 此属性指示 Maven 的本地存储库的路径,Fuse 将从中安装其工件。

    • org.ops4j.pax.url.mvn.settings = D:/Maven/conf/settings.xml

    • 此属性指示 Fuse 应该使用的 settings.xml,以从 Maven 获取工件。

配置 Maven

Maven 是安装 Fuse 的先决条件。如果您不知道 Maven 是什么,请参考 https://tutorialspoint.com/maven/

Maven 是用于构建 Fuse 工件的构建工具。当我们发出安装工件的命令时,Fuse 首先在 Maven 本地存储库中搜索工件。因此,我们必须让 Fuse 知道 Maven 的安装位置和 Maven 本地存储库的路径。

编辑 $FUSE_INSTALLATION_DIR/etc/ **org.ops4j.paxurl.mvn.cfg**

更新以下两个属性:

  • org.ops4j.pax.url.mvn.settings = $M2_HOME/conf/settings.xml
  • org.ops4j.pax.url.mvn.localRepository = $local_repo

**注意** - 请将 **$local_repo** 更改为 Maven settings.xml 中提到的本地存储库的实际路径。

运行

完成基本的配置更改后,我们现在可以启动Fuse。所有与Fuse一起使用的二进制文件都位于$FUSE_INSTALLATION_DIR

启动Fuse有两种方法:

  • 使用./fuse

    • 这将允许您在启动Fuse的同一窗口中查看所有进度和日志。

    • 它将在与下面所示相同的终端中提供Karaf控制台。

注意:这将在控制台模式下启动Fuse,这意味着当用户注销会话或关闭终端时,Fuse进程也将停止,这在生产或开发场景中是不希望的。此脚本仅应用于调试Fuse。

  • 使用./start

    • 这不会在屏幕上显示任何日志,甚至不会显示进度,但这将在后台启动Fuse,并且当用户退出会话或关闭终端时,Fuse服务不会停止。

    • 在实际应用程序中,需要这种行为。即使我们关闭终端,Fuse也应该在后台运行。

    • 如果要连接到在后台运行的Fuse,可以使用位于同一文件夹中的client脚本。

    • 您应该获得如下所示的显示。

    • 退出客户端脚本不会停止Fuse服务。它只会关闭Fuse控制台。

Configuring Maven

HAWTIO

Fuse还使用FMC(Fuse管理控制台)提供对其的完整GUI访问。您可以在以下URLhttps://:8181上找到GUI。

HAWTIO

通过执行命令所做的所有操作也可以通过访问此基于浏览器的GUI来完成。当我们有多个容器并在Fabric环境中运行时,它变得非常有用。

JBoss Fuse - Apache Karaf

在本章中,我们将讨论Apache Karaf,以及为什么它被称为轻量级OSGi容器,以及它的优点和其他重要特性。

JVM问题

JVM或Java虚拟机并不充当实际的虚拟机。一台机器,允许您动态地停止、启动或重新启动在其内部运行的组件。它有时可能允许类级别的热部署,但是您无法在虚拟机中部署或卸载应用程序的组件而无需重新启动它。

为了解决这个问题并在Java应用程序中允许模块化,Fuse使用基于OSGi的运行时,称为Apache Karaf。

OSGi

OSGi技术是一组规范,定义了Java的动态组件系统。这些规范允许开发模型,其中应用程序由许多不同的(可重用)组件(动态地)组成。

OSGi的优点

  • 降低复杂性:应用程序构建为协作组件,这些组件彼此隐藏其实现细节,从而降低了复杂性。

  • 可重用性:许多组件可以利用部署在容器中的相同组件。

  • 部署:OSGi通过其生命周期管理API支持动态启动、停止和更新组件,而无需重新启动容器。

Bundle与Feature

以下是Bundle和Feature之间的比较。

Bundle

Bundle对于OSGi相当于JAR对于JVM。Bundle是在OSGi容器中可部署的工件。Bundle是协同工作或独立工作以形成应用程序的组件。

这些Bundle可以在运行时安装、卸载、更新、启动或停止,而无需重新启动容器。

Feature

Feature是一种将多个Bundle一起部署的方法。有时,将Bundle分组部署更有意义。Feature允许我们只需一个命令即可部署一组Bundle。

为什么需要另一个容器?

Apache Karaf是一个基于OSGi的运行时,我们的应用程序Bundle就在其中运行。Fuse使用Apache Karaf作为其运行时,Bundle在其中运行并协作以提供业务功能。

Karaf构建在Felix和equinox之上,它们是OSGi框架。

Karaf架构

Karaf Architecture

Apache Karaf为基本的OSGi运行时添加了以下附加功能。

热部署

Karaf支持热部署。它包含一个热部署目录。放置在此目录中的任何内容都将自动部署并作为Bundle安装到Karaf中。

日志记录

Karaf通过在$Fuse_home/data/log中为所有Bundle生成日志来提供集中式日志记录。我们可以在$Fuse_home/etc目录中的org.ops4j.pax.logging.cfg中编辑日志记录器配置。

管理控制台

Karaf提供了一个复杂而清晰的管理控制台来与Fuse的运行实例进行交互。它还提供了一套预安装的命令,可用于在运行时管理和监控组件(Bundle)。此控制台是可扩展的,因此它允许我们通过向控制台添加新的Bundle来向控制台添加新命令。

Admin console

SSH访问

Karaf允许通过SSH远程访问此管理控制台。任何拥有有效凭据的人都可以通过SSH终端连接到Karaf管理控制台。

JBoss Fuse - Apache Camel

在本章中,我们将讨论什么是Apache Camel以及它如何有效地在端点之间路由数据,以及一些示例。

什么是Apache Camel?

Apache Camel是一个开源集成框架,于2007年初启动。

它是一种基于EIP(企业集成模式)的方法,它提供了几种现成的模式实现,可用于解决企业集成问题。EIP只不过是针对企业集成中记录良好且反复出现的问题的成熟解决方案。

Camel也称为路由和中介引擎,因为它有效地在端点之间路由数据,同时承担繁重的负载,例如数据格式转换、端点连接等等。

基本示例

使用Apache Camel的先决条件:

  • Java
  • Maven
  • Redhat JBoss Fuse 6.1-GA-379

创建应用程序的基本框架

mvn:archetype generate 
–DgroupId = com.tutorialpoint.app 
–DartifactId = camel-first-app 
–DarchetypeGroupId = org.apache.camel.archetypes
–DarchetypeArtifactId = camel-archetype-spring 
–DinteractiveMode = false -X

这应该生成以下目录结构。

Directory Structure

这是我们生成的Camel应用程序的基本框架。

编辑camel-context.xml

编辑camel-first-app → src → main → resources → META-INF\spring\camel-context.xml使其与以下内容匹配

<?xml version = "1.0" encoding = "UTF-8"?>
<!-- Configures the Camel Context-->
<beans xmlns = "http://www.springframework.org/schema/beans"
   xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"
   xsi:schemaLocation = "http://www.springframework.org/schema/beans
   http://www.springframework.org/schema/beans/spring-beans.xsd
   http://camel.apache.org/schema/spring
   http://camel.apache.org/schema/spring/camel-spring.xsd">

   <camelContext xmlns = "http://camel.apache.org/schema/spring">
      <!-- here is a sample which processes the input file
         (leaving them in place - see the 'noop' flag) 
         then performs content based routing on the message using XPath -->
			
      <route>
         <from uri = "file:///d:/src/data?noop=false"/>
         <choice>
            <when>
               <xpath>/person/city = 'London'</xpath>
               <log message = "UK message"/>
               <to uri = "file:///d:/target/messages/uk"/>
            </when>
				
            <otherwise>
               <log message = "Other message"/>
               <to uri = "file:///d:/target/messages/others"/>
            </otherwise>
				
         </choice>
			
      </route>
   </camelContext>
</beans>

编辑pom.xml

在<plugins></plugins>内添加以下代码:

<plugin>
   <groupId>org.apache.felix</groupId>
   <artifactId>maven-bundle-plugin</artifactId>
   <version>2.3.4</version>
   <extensions>true</extensions>
	
   <configuration>
      <instructions>
         <Bundle-SymbolicName>
            ${project.artifactId}
         </Bundle-SymbolicName>
         <Import-Package>*</Import-Package>
      </instructions>
   </configuration>
	
</plugin>

将打包类型从jar → bundle更改。

<packaging>bundle</packaging>

使用以下命令构建项目:

mvn clean install

将项目安装到Fuse

使用Fuse.bat/start.bat启动Fuse。如果使用start.bat启动Fuse,请使用client.bat连接到Fuse。您应该获得如下所示的UI。

Install Project in Fuse

这是用于访问Karaf和Fuse命令的CLI。

install –s mvn:com.tutorialpoint.app/camel-firt-app/1.0-SNAPSHOT

测试您的项目是否正在运行

现在您的应用程序应该安装在Fuse中。将camel-first-app内的data目录复制并放置在D:/src/中,它应该将包含city = London的消息复制到D:/target/merssages/uk

将输入文件放在D:/src/data

输入

Message1.xml

<?xml version = "1.0" encoding = "UTF-8"?>
<person user = "james">
   <firstName>James</firstName>
   <lastName>Strachan</lastName>
   <city>London</city>
</person>

Message2.xml

<?xml version = "1.0" encoding = "UTF-8"?>
<person user = "hiram">
   <firstName>Hiram</firstName>
   <lastName>Chirino</lastName>
   <city>Tampa</city>
</person>

输出

在D:/target/messages/uk

<?xml version = "1.0" encoding = "UTF-8"?>
<person user = "james">
   <firstName>James</firstName>
   <lastName>Strachan</lastName>
   <city>London</city>
</person>

在D:/target/messages/others

<?xml version = "1.0" encoding = "UTF-8"?>
<person user = "hiram">
   <firstName>Hiram</firstName>
   <lastName>Chirino</lastName>
   <city>Tampa</city>
</person>

JBoss Fuse - Camel概念

在本章中,我们将了解不同的Camel概念。让我们从一个基本的例子开始,了解核心概念。

CamelContext

每个Camel应用程序至少都有一个CamelContext。这是我们添加Camel路由的地方。它类似于Spring的ApplicationContext

Camel context可以被认为是一个容器,它将所有东西整合在一起。一个Camel context可以在其中包含多个路由。

路由

CamelContext可以包含一个或多个路由。路由是集成逻辑,它定义了数据如何在Camel context中从一个端点流向另一个端点。

端点

端点是通道的末端,系统可以通过它发送或接收消息。这就是我们在通信语言中所说的目的地或来源。

组件

组件是Camel中的扩展点。组件可以是技术、数据格式、转换器等的接口。它们也可以充当端点的工厂。

Components

EIP

EIP代表企业集成模式。这些是针对重复出现的问题的已识别和众所周知的解决方案。Camel支持大多数企业集成模式。

基于内容的路由器

CBR模式允许我们根据输入文件的内容路由数据。

Content Based Router

当我们必须根据输入正文的内容路由值时,使用此模式。

以下示例将从D:/data/input目录读取数据。读取后,它将检查data标签内的value标签。如果value标签包含value1,它将被发送到D:/value1,如果它包含value2,它将被发送到D:/value2,如果两者都不包含,则它将被发送到others。

<CamelContext xmlns = "http://camel.apache.org/schema/spring">
   <route>
      <from uri = "file:///D:/data/input"/>
      <choice>
         <when>
            <xpath>/data/value = 'value1'</xpath>
            <to uri = "file:///D:/value1"/>
         </when> 
         <when>
            <xpath>/data/value = 'value2'</xpath>
            <to uri = "file:///D:/value2"/>
         </when>  
			
         <otherwise>
            <to uri = "file:///D:/others "/>
         </otherwise>
			
      </choice>
   </route>
</camelContext>

输入

D:/data/input/message1.xml

<data>
   <value>value1</value>
</data>

D:/data/input/message2.xml

<data>
   <value>value2</value>
</data>

输出

D:/value1/

<data>
   <value>value1</value>
</data>

D:/value2/

<data>
   <value>value2</value>
</data>

拆分器

拆分器模式用于将输入数据拆分为较小的块。

Splitter

此模式通常与需要拆分成块的大量输入数据一起使用,因此它变得可处理。它根据输入标记字符串将输入分解成较小的片段。

<CamelContext xmlns = "http://camel.apache.org/schema/spring">
   <route>
      <from uri = "file:///D:/inbox"/>
      <split streaming = "true">
         <tokenize token = "order" xml = "true"/>
         <to uri = "activemq:queue:order"/>
      </split>
   </route>
</CamelContext>

输入

D:/inbox/message.xml

<order>
   <data>
      <value>value1</value>
   </data>
</order>

<order>
   <data>
      <value>value2</value>
   </data>
</order>

<order>
   <data>
      <value>value3</value>
   </data>
</order>

输出

如果检查AMQ,您会发现发布了3条消息。

<order>
   <data>
      <value>value4</value>
   </data>
</order>

收件人列表

当需要从消息正文本身检索收件人列表时,使用收件人列表模式。

Recipient List

在以下示例中,一条消息将发送给在customer标签中列出的所有收件人,这些收件人是逗号分隔的字符串列表。

<CamelContext xmlns = "http://camel.apache.org/schema/spring">
   <route>
      <from uri = "jms:xmlOrders" />
      <recipientList>
         <xpath>/order/customer</xpath>
      </recipientList>
   </route>
</camelContext>

其他EIP

Camel几乎支持所有已识别的EIP。一些常用的EIP如下所示。

  • 日志:记录完整消息或部分消息

  • 消息过滤器:过滤消息内容

  • 重新排序器:按顺序获取所有标记

  • Wiretap:检查正在传输的消息

EIP的完整列表及其用法可以在Camel的官方文档中找到 http://camel.apache.org/eip.html

Camel中的异常处理

使用错误处理程序:这是处理Camel中异常的最简单方法。

要使用此方法,我们必须配置错误处理程序类bean并将其作为引用提供给CamelContext errorHandlerRef属性。

<bean id = "loggingErrorHandler" class = "org.apache.camel.builder.LoggingErrorHandler">
   <property name = "logName" value = "mylogger.name"/>
   <property name = "level" value = "DEBUG"/>
</bean>

<camelContext errorHandlerRef = ” loggingErrorHandler” >
   …
</camelContext>

使用Try Catch Finally

Camel还支持Java风格的Try Catch Finally块进行错误处理。

就像Java一样,它具有以下三个块:

  • doTry块包含可能生成异常的代码。

  • doCatch块包含在发生异常时需要执行的代码。

  • doFinally块包含必须执行的代码,无论是否发生异常。无论是否引发异常,它都将始终执行。

注意:Mock是测试组件,不建议用于其他目的。它是Camel中用于测试的组件,就像测试驱动开发中的jMOck组件一样。

<route>
   <from uri = "direct:start"/>
   <doTry>
      <process ref = "someProcesorThatmayFail"/>
      <to uri = "mock:result"/>
		
      <doCatch>
         <exception>java.io.IOException</exception>
         <exception>java.lang.IllegalStateException</exception>
         <to uri = "mock:catch"/>
      </doCatch>
		
      <doFinally>
         <to uri = "mock:finally"/>
      </doFinally>
		
   </doTry>
</route>

在上面的示例中,我们可以提供catch块需要处理的异常列表。

在Fuse中部署Bundle

使用Fuse.bat/start.bat启动Fuse。

如果使用start.bat启动Fuse,请使用client.bat连接到Fuse。您应该获得如下所示的UI。

Deploying Bundle in Fuse

这是用于访问Karaf和Fuse命令的CLI。

install –s mvn:group.id /artifact.id/version 
e.g. install –s mvn:com.tutorialpoint.app/camel-firt-app/1.0-SNAPSHOT

JBoss Fuse - Apache CXF

在本章中,让我们讨论什么是Apache CXF以及它如何在开发SOAP和Rest Web服务中提供帮助。

什么是Apache CXF?

Apache CXF是一个Web服务开发框架,可用于开发SOAP和Rest Web服务。CXF完全符合JAX-RS和JAX-Ws标准。

它现在是最广泛使用的Web服务开发框架。CXF已经学习并改进了Axis2,Axis2现在正逐渐被CXF取代。

CXF与Axis2

CXF Axis2
改进

CXF是目前最常用的框架。

它对Axis2有很多改进

Axis2正逐渐被CXF取代。

与CXF相比,它需要更多代码

所需代码

与Axis2相比,CXF需要的代码更少

Axis2相比之下需要更多代码

标准符合性

CSF 完全兼容 JAX-RS 和 JAX-WS

Axis2 不完全兼容 JAX-RS 和 JAX-WS

兼容 Spring

前端分离

前端与 JAX-WS 代码干净分离

未提供干净的分离

SOAP

SOAP 代表简单对象访问协议 (Simple Object Access Protocol)。它是一种用于在两个系统之间通过 Web 服务交换结构化信息的协议。它主要依赖于 XML 来构建数据,并使用 HTTP 或 SMTP 进行消息协商和传输。

有两种开发 SOAP Web 服务的方法:

  • 代码优先 (Code first) − 在这种方法中,WSDL 从代码生成。

  • 契约优先 (Contract first) − 在契约优先方法中,代码从 WSDL 生成。

使用 CXF 开发 SOAP

配置 Maven

将以下配置文件添加到 Maven 的 settings.xml 文件中。

<profiles>
   <profile>
      <id>Jboss-Fuse</id>
		
      <activation>
         <activeByDefault>true</activeByDefault>
      </activation>
		
      <repositories>
         <repository>
            <id>fusesource</id>
            <url>http://repo.fusesource.com/nexus/content/groups/public/</url>
            <snapshots>
               <enabled>false</enabled>
            </snapshots>
            <releases>
               <enabled>true</enabled>
            </releases>
         </repository>
      </repositories>
		
   </profile>
</profiles>

创建骨架

mvn archetype:generate
-DarchetypeGroupId = org.apache.servicemix.tooling 
-DarchetypeArtifactId = servicemix-cxf-code-first-osgi-bundle 
-DarchetypeVersion=2012.01.0.redhat-60024 
-DgroupId = org.fusesource.example 
-DartifactId = cxf-basic 
-Dversion = 1.0-SNAPSHOT

构建 Web 服务项目.

mvn clean install

使用以下命令将 Web 服务安装到 Fuse 中.

JBossFuse:karaf@root>install -s mvn:org.fusesource.example/cxf-basic/1.0-SNAPSH

检查 bundle 是否已注册 SOQP Web 服务

打开 URL https://:8181/cxf

SOQP web-service

Web 服务应按如下方式列出。

测试 Web 服务

mvn -Pclient

信息 − 从 com.to 类创建服务 {http://ws.totorials.com/} PersonService

torials.ws.Person
Invoking getPerson...
getPerson._getPerson_personId = Guillaume
getPerson._getPerson_ssn = 000-000-0000
getPerson._getPerson_name = Guillaume
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 30.668 s
[INFO] Finished at: 2016-02-15T21:01:20+05:30
[INFO] Final Memory: 10M/37M
[INFO] ------------------------------------------------------------------------

JBoss Fuse - REST Web 服务

首先,REST 代表具象状态传输 (Representational State Transfer)。它是一种基于无状态、可缓存的客户端-服务器协议(大多数情况下为 HTTP)开发 Web 服务的方法。

REST Web 服务使用 HTTP 请求来发布、获取和删除网络数据。

使用 CXF 开发 REST

创建一个简单的 Maven 快速启动项目

mvn archetype:generate 
-DgroupId = com.tuts.abhinav 
-DartifactId = rest-service
-DarchetypeArtifactId = maven-archetype-quickstart 
-DinteractiveMode = false

添加依赖项

<dependency>
   <groupId>org.apache.servicemix.specs</groupId>
   <artifactId>org.apache.servicemix.specs.jsr311-api-1.1.1</artifactId>
   <version>1.9.0</version>
   <scope>provided</scope>
</dependency>

<dependency>
   <groupId>org.apache.servicemix</groupId>
   <artifactId>servicemix-http</artifactId>
   <version>2013.01</version>
</dependency>

<dependency>
   <groupId>log4j</groupId>
   <artifactId>log4j</artifactId>
   <version>1.2.16</version>
</dependency>

添加构建指令

<build>
   <defaultGoal>install</defaultGoal>
   <plugins>
      <plugin>
         <groupId>org.apache.felix</groupId>
         <artifalctId>maven-bundle-plugin</artifactId>
         <version>2.3.4</version>
         <extensions>true</extensions>
			
         <configuration>
            <instructions>
               <Bundle-SymbolicName>rest-example-database-post-method
                  </Bundle-SymbolicName>
               <Import-Package>* </Import-Package>
            </instructions>
         </configuration>
			
      </plugin>
   </plugins>
</build>

添加 Fuse 插件仓库

<pluginRepositories>
   <pluginRepository>
      <id>fusesource.m2</id>
      <name>FuseSource Community Release Repository</name>
      <url>http://repo.fusesource.com/nexus/content/repositories/releases</url>
      <snapshots>
         <enabled>false</enabled>
      </snapshots>
		
      <releases>
         <enabled>true</enabled>
      </releases>
   </pluginRepository>
<pluginRepositories>

添加仓库

<repositories>
   <repository>
      <id>fusesource.m2</id>
      <name>FuseSource Community Release Repository</name>
      <url>http://repo.fusesource.com/nexus/content/repositories/releases</url>
      <snapshots>
         <enabled>false</enabled>
      </snapshots>
		
      <releases>
         <enabled>true</enabled>
      </releases>
		
   </repository>
	
   <repository>
      <id>fusesource.ea</id>
      <name>FuseSource Community Early Access Release Repository</name>
      <url>http://repo.fusesource.com/nexus/content/groups/ea</url>
      <snapshots>
         <enabled>false</enabled>
      </snapshots>
      <releases>
         <enabled>true</enabled>
      </releases>
   </repository>
	
</repositories>

创建服务类

在 com/tuts/ 下创建类 UserService.java

package com.tuts;

import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;

@Path("/UserService_1")
public class UserService {
   @GET
   @Path("/get_data")
   @Produces(MediaType.APPLICATION_JSON)
	
   public String getUser() {
      String reponse = "This is standard response from REST";
      return reponse;
   }
}

创建 Blueprint.xml

在 /src/main/resources/OSGI-INF/blueprint 下创建 blueprint.xml 文件

<?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:jaxrs = "http://cxf.apache.org/blueprint/jaxrs"
   xsi:schemaLocation = "http://www.osgi.org/xmlns/blueprint/v1.0.0 
   http://www.osgi.org/xmlns/blueprint/v1.0.0/blueprint.xsd
   http://cxf.apache.org/blueprint/jaxrs 
   http://cxf.apache.org/schemas/blueprint/jaxrs.xsd">
	
   <jaxrs:server id = "service" address = "/users">
      <jaxrs:serviceBeans>
         <ref component-id = "userService" />
      </jaxrs:serviceBeans>
   </jaxrs:server>
	
   <bean id = "userService" class = "com.tuts.UserService" />
</blueprint>

在 Fuse 中安装 REST 服务

install -s mvn:com.tuts.abhinav/rest-service/1.0-SNAPSHOT

检查 Bundle 是否已注册 Web 服务

打开 URL https://:8181/cxf

Registered Web-Service

测试 Web 服务

打开 URL https://:8181/cxf/users12/UserService_1/get_data

Localhost CXF

JBoss Fuse - Apache AMQ

在本章中,我们将了解 ActiveMQ 以及它如何充当消息代理,从而允许应用程序彼此通信。

什么是 AMQ?

ActiveMQ 是一个用 Java 编写的开源消息代理。它完全符合 JMS 1.1 标准。

JMS 是一种允许开发基于消息的系统的规范。ActiveMQ 充当消息代理,位于应用程序之间,允许它们以异步和可靠的方式进行通信。

AMQ

消息类型

为了更好地理解,下面解释了两种消息传递选项。

点对点

在这种类型的通信中,代理仅将消息发送给一个消费者,而其他消费者将等待从代理接收消息。没有消费者会收到相同的消息。

如果没有消费者,代理将保留消息,直到它获得一个消费者。这种类型的通信也称为基于队列的通信,其中生产者将消息发送到队列,并且只有一个消费者从队列中获取一条消息。如果有多个消费者,他们可能会收到下一条消息,但他们不会收到与其他消费者相同的消息。

Point to Point Messaging

发布/订阅

在这种类型的通信中,代理将相同的消息副本发送给所有活动消费者。这种类型的通信也称为基于主题的通信,其中代理将相同的消息发送给已订阅特定主题的所有活动消费者。此模型支持单向通信,不需要对传输的消息进行验证。

Publish/Subscribe Messaging

创建队列和主题

Fuse 自带 ActiveMQ。我们可以使用 FMC 控制台(基于浏览器的 AMQ 工作界面)访问 ActiveMQ。

使用localhost:8181登录 FMC 并选择ActiveMQ选项卡。

ActiveMQ
  • 点击 +创建
  • 输入队列/主题名称
  • 从单选按钮中选择队列/主题
  • 点击创建队列/创建主题
Queue/Create topic

现在您应该能够在 root → Queue → 下看到已创建的TestQ

TestQ

要检查已创建的主题,请按照 root → Topic 操作。

浏览/删除队列的内容

  • 使用localhost:8181登录 FMC

  • 选择 ActiveMQ 选项卡

  • Root → Queue → TestQ