扫一扫
分享文章到微信
扫一扫
关注官方公众号
至顶头条
一种转换,不同的技术
本文假设需要将消息从一种 XML 格式转换为另一种 XML 格式。IBM® WebSphere® Message Broker V6 提供了四种转换技术:
转换将包括重新设置消息的格式、连接字符串,并基于某些字段的值执行数字计算。在本文的 XSLT 和 JavaCompute 节点部分中,执行转换的消息流包含在产品附带的 JavaCompute
和 XMLT
技术示例中。
在每个不同的实现流程中使用的输入和输出消息如下所示:
图 1. 输入消息
<?xml version="1.0" encoding="UTF-8"?> <Parent> <First>1</First> <SaleList> <Invoice> <Initial>A</Initial> <Initial>A</Initial> <Surname>Piper</Surname> <Item> <Code>00</Code> <Code>01</Code> <Description>Unreal Tournament 2004</Description> <Category>Games</Category> <Price>24.99</Price> <Quantity>01</Quantity> </Item> <Item> <Code>03</Code> <Description>XSLT</Description> <Category>Books and Media</Category> <Price>19.95</Price> <Quantity>01</Quantity> </Item> <Balance>44.94</Balance> <Currency>Sterling</Currency> </Invoice> </SaleList> <Last>Test</Last> </Parent> |
图 2. 输出消息
<?xml version="1.0" encoding="UTF-8"?> <Parent> <SaleList> <Statement Type="Monthly" Style="Full"> <Customer> <Initials>AA</Initials> <Name>Piper</Name> <Balance>44.94</Balance> </Customer> <Purchases> <Article> <Desc>Unreal Tournament 2004</Desc> <Cost>39.98</Cost> <Qty>01</Qty> </Article> <Article> <Desc>XSLT</Desc> <Cost>31.92</Cost> <Qty>01</Qty> </Article> </Purchases> <Amount Currency="Sterling">71.9</Amount> </Statement> </SaleList> </Parent> |
使用 Java
WebSphere Message Broker V6 为在消息流中开发转换引入了新的选择。在以前的版本中,如果您希望使用 Java 进行消息操作,则是通过编写完整的 Java 插件或从 ESQL 中调用静态 Java 方法;现在,在 V6 中,您可以使用 JavaCompute 节点直接在消息流中编写转换逻辑。Java 是许多企业选择的开发语言,所以将熟悉的、基于 Eclipse 的开发环境(如 IBM Rational® Application Developer)与在消息流开发中使用 Java 的能力结合在一起将有助于未使用过 WebSphere Message Broker 的开发人员开始使用消息流开发。对于现有的 WebSphere Message Broker 用户,JavaCompute 节点的外观类似于标准的 Compute 节点,不过它允许您编写本机 Java 代码,而不是编写 ESQL 模块。WebSphere Message Broker V6 为 Java 代码提供了 Java 2 Standard Edition (J2SE) 1.4.2 运行时环境。基本 J2SE 类库提供了广泛的功能,并且您可以通过第三方库添加更多功能,从而使得 JavaCompute 节点极为灵活。
JavaCompute 节点基础
要在消息流中编写 Java,请在消息流编辑器中放置一个新的 JavaCompute 节点,然后右键单击节点,并选择 Open Java(相当于为标准 Compute 节点选择 Open ESQL)。向导将指导您完成与该节点关联的 Java 项目和类的创建:
该向导会创建新的 Java 项目和类,然后自动切换到 Java 透视图,以便您可以编写代码。此外,如果 Java 代码已存在,您可以使用 JavaCompute 节点的 Properties 页面上的选项浏览相关的类。
图 3 总结了在为 JavaCompute 节点创建新的 Java 类时所涉及的步骤:
图 3. 创建 JavaCompute 节点项目的步骤
如果您为 WebSphere Message Broker 的以前版本开发了 Java 插件节点,则可能熟悉 JavaCompute 节点内部的 Java 代码的某些结构——可以使用 MbNode 类的 getOutputTerminal 方法选择输出终端,并且可以使用 MbElement 类的方法访问消息树。在 WebSphere Message Broker V6 中,您还可以使用 XPath 语法导航消息树。
JavaCompute
技术示例的 JavaComputeTransformXPath
和 JavaComputeTransformNoXPath
流演示了如何将图 1 中的示例消息转换为图 2 中的消息。JavaComputeTransformXPath
流使用 XPath 语法在消息树中获取、转换和设置值。JavaComputeTransformNoXPath
使用 MbElement 方法导航树。图 4 和图 5 对使用 XPath 的代码和使用 MbElement 方法的代码进行了比较。请注意,在第一个清单中使用了扩展的 XPath 语法,它演示了如何使用 WebSphere Message Broker Java API 在消息树中创建元素和设置新值。
图 4. 使用 XPath 访问消息树
final MbXPath setArticle = new MbXPath("?$Article[?Desc[set-value($item/Description)]]" + "[?Cost[set-value($item/Price * 1.6)]]" + "[?Qty[set-value($item/Quantity)]]"); |
图 5. 使用 MbElement 访问消息树
MbElement article = purchases.createElementAsLastChild(MbElement.TYPE_NAME, "Article", null); MbElement cursor = item.getFirstElementByPath("Description"); article.createElementAsLastChild(MbElement.TYPE_NAME, "Desc", (String)cursor.getValue()); cursor = cursor.getNextSibling().getNextSibling(); // Price element double cost = Double.parseDouble((String)cursor.getValue()) * 1.6; cursor = cursor.getNextSibling(); // Quantity element; int quantity = Integer.parseInt((String)cursor.getValue()); total += cost * quantity; article.createElementAsLastChild(MbElement.TYPE_NAME, "Cost", Double.toString(cost)); article.createElementAsLastChild(MbElement.TYPE_NAME, "Qty", Integer.toString(quantity)); |
在部署包含 JavaCompute 节点的消息流时,所有必需的 JAR 文件自动包装到代理存档,并分发到各个代理。此过程减少了以前版本中的管理开销,其中从 ESQL 调用的包含 Java 类的 JAR 文件必须手动转移到代理系统。
使用 JavaCompute 节点时的注意事项
一个 JavaCompute 节点有三个输出终端(out
、alternate
和 failure
),该节点支持通过 out
或 alternate
终端执行路由。此过程没有使用 ESQL 执行处理的节点灵活。Filter 节点和增强的 WebSphere Message Broker V6 Compute 节点都有三个以上的输出终端。如果您正在使用 Java,并且需要超过三个的输出终端,则需要完整的 Java 插件节点。由于 JavaCompute 节点和 Java 插件需要的代码之间在结构方面类似,所以基于以前为 JavaCompute 节点开发的代码创建新的 Java 插件节点非常容易。这样做可以为团队提供新级别的重用,因为可以将预构建的功能以新插件节点的形式添加到消息流开发人员的面板中。
如果 JavaCompute 节点需要与数据库通信,则有三种方法执行此任务:
JavaCompute 节点的优点
Java 可能是企业选择的语言或提高工作效率的首选项。JavaCompute 节点的主要优点是基本 Java 类提供了广泛的功能。此外,在 Internet 上还提供了多种第三方类库。企业可能已经开发了 Java 类库来执行关键的业务功能。WebSphere Message Broker V6 附带了大量的示例消息流,演示了如何使用不同的类库。例如,一个示例流演示基本的消息转换,另一个示例流显示如何使用 JavaCompute 节点来调用 Google API。另一个示例显示如何使用 JavaMail NNTP(新闻组)API。在 ESQL 中必须手动编写某些常见的算法(如 Base64 编码和 MD5SUM),但是在 Java 中已提供了这些算法。这种重用现有代码的功能非常强大。
如果将 JavaCompute 节点部署到 z/OS 上的 WebSphere Message Broker V6,那么可以将该节点执行的任何工作分散到 zSeries Application Assist Processor (zAAP),这有助于减少成本,而且可能是使用 WebSphere Message Broker V6 中的 Java 支持的较好理由。
有关如何使用 JavaCompute 节点的详细信息,请参见在 WebSphere Message Broker V6 中使用 Java。
JavaCompute 节点优点摘要
使用可扩展样式表语言转换 (XSLT)
如果企业使用 XML 描述业务数据,则 XSLT 可以作为格式之间转换的选择语言。可能已经存在许多 XSL 转换,或者开发人员可能在技能上最适合使用此语言创建转换。如果您需要在不同产品之间共享常见转换,则 XSLT 可能也是最佳选择,因为大量的不同引擎可以将这些转换应用到 XML 数据。可以重用为了在另一运行时引擎(例如 WebSphere Application Server 或 Mozilla Firefox Web 浏览器)中使用而开发的样式表,无需在 WebSphere Message Broker 进行更改。
XSLT 入门知识
XSLT 是符合 W3C 标准的基于 XML 的语言,用于转换 XML 数据。转换通常是从一种 XML 文档转换为另一种 XML 文档,但是输出不一定是 XML 格式。XSLT 依靠 XPath 访问和操作消息树中的元素。WebSphere Message Broker 支持使用符合 XSLT 1.0 的样式表,并支持使用 XALAN-4J 引擎。
在 WebSphere Message Broker V6 中使用 XSLT
需要以下两个步骤,才能在消息流中使用 XSLT:
如果样式表不存在,WebSphere Message Broker Toolkit(基于 Rational Application Developer)提供了一组与 XML 文件一起使用的工具,它允许您构建样式表。这些工具包括用于 XSL 转换的编辑器和调试器。
在缺省情况下,在 WebSphere Message Broker Toolkit 中创建新的工作区时,这些高级 XML 功能不可用。要访问这些功能,您必须通过选择 Preferences => Workbench => Capabilities 来启用 XML 开发人员功能:
图 6. 在 WebSphere Message Broker Toolkit 中启用高级 XML 功能
例如,如果已拥有以前项目中的样式表,您可以使用另一产品开发和调试您的样式表(如果愿意这样做)。然后,在准备使用样式表时,可以将它们直接导入到您的 WebSphere Message Broker Toolkit 工作区。有关创建和开发样式表的详细信息,请参阅 WebSphere Message Broker 信息中心。
图 7 显示了用于在输入和输出消息类型之间进行转换的样式表。XMLT Sample Message Flows(XMLT 示例消息流)项目中包括该样式表,该项目是作为 WebSphere Message Broker V6 附带的 XMLT 技术示例的一部分提供的:
图 7. 用于消息转换的 XSLT
<?xml version="1.0" encoding="ISO-8859-1"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:template match="/"> <Parent> <xsl:for-each select="/Parent/SaleList"> <SaleList> <xsl:for-each select="Invoice"> <xsl:if test="not(contains(Surname,'Shop'))"> <Statement> <xsl:attribute name="Type">Monthly</xsl:attribute> <xsl:attribute name="Style">Full</xsl:attribute> <Customer> <Initials> <xsl:for-each select="Initial"> <xsl:value-of select="."/> </xsl:for-each> </Initials> <Name><xsl:value-of select="Surname"/></Name> <Balance><xsl:value-of select="Balance"/></Balance> </Customer> <Purchases> <xsl:for-each select="Item"> <Article> <Desc><xsl:value-of select="Description"/></Desc> <Cost><xsl:value-of select='format-number((number(Price)*1.6), "####.##")'/></Cost> <Qty><xsl:value-of select="Quantity"/></Qty> </Article> </xsl:for-each> </Purchases> <Amount> <xsl:attribute name="Currency"> <xsl:value-of select="Currency" /> </xsl:attribute> <xsl:call-template name="sumSales"> <xsl:with-param name="list" select="Item"/> </xsl:call-template> </Amount> </Statement> </xsl:if> </xsl:for-each> </SaleList> </xsl:for-each> </Parent> </xsl:template> <xsl:template name="sumSales"> <xsl:param name="list" /> <xsl:param name="result" select="0"/> <xsl:choose> <xsl:when test="$list"> <xsl:call-template name="sumSales"> <xsl:with-param name="list" select="$list[position()!=1]"/> <xsl:with-param name="result" select="$result + number($list[1]/Price)*number($list[1]/Quantity)*1.6"/> </xsl:call-template> </xsl:when> <xsl:otherwise> <xsl:value-of select='format-number(number($result),"####.##")'/> </xsl:otherwise> </xsl:choose> </xsl:template> </xsl:stylesheet> |
要在消息流中使用 XSL 转换,请使用 XMLTransformation 节点(如图 8 所示)。XMLT 技术示例的 XMLT_Sample_Flow
消息流演示了如何使用该节点,样式表将图 1 中的输入消息转换为图 2 中的输出消息。
图 8. 运行 XSLT 的消息流
XSLT 注意事项
XMLTransformation 节点依赖于到达包含 XML 格式数据的节点的消息,因为 XSLT 将只操作定义为 XML 格式的数据。这并不意味着消息必须属于某个 XML 域,但是位流必须包含格式正确的 XML。此限制不适用于输出,因为 XSLT 可以创建各种格式的输出。成功传播到 XMLTransformation 节点的输出终端的消息将位于 BLOB 域中。如果输出数据是 XML 格式,并且稍后需要在消息流中进行处理,那么在离开 XMLTransformation 节点后,必须将消息的域重新设置为 XML、XMLNS 或 XMLNSC,例如使用 ResetContentDescriptor 节点。
在该节点的 Properties 页面上,您可以指定在消息通过节点时您希望使用的样式表。可以将样式表的名称和位置嵌入在通过节点的 XML 文档中,在这种情况下,可以使用 XML Embedded Selection 选项。另外,您可以从您的工作区选择现有的样式表。样式表将自动部署到代理存档文件内部的代理中。注意,样式表必须始终是代理系统的本地样式表——不能将远程 URI 指定为样式表位置。
XMLTransformation 节点使用 XALAN-4J 引擎并且是 Java 插件节点。这样做的优点之一是,使用 JavaCompute 节点,在 z/OS 平台上可以将处理分散到 zAAP 处理器。另一个好处是在所有平台上都支持编译的样式表,从而提高以前版本在实现上的性能。为提高性能,从磁盘读取的样式表缓存在内存中——节点不能缓存输入消息提供的样式表。
XMLTransformation 节点是一个 Java 插件,所以在消息流中应用它时,不能使用调试器进入样式表。您可以使用 WebSphere Message Broker Toolkit 中的 XSL 调试器来调试消息流外面的样式表,也可以使用跟踪来尝试确定任何问题存在的位置。为详细的跟踪配置节点时,通过节点处理消息的信息将从标准用户跟踪写出到独立文件中,从而隔离样式表潜在问题的信息。有关详细信息,请参阅 WebSphere Message Broker 信息中心。
在使用 XMLTransformation 节点时,不能访问与传入消息关联的消息标头。它只是可以通过 XSLT 访问和更改的 XML 消息主体。
XSLT 优点摘要
使用映射
映射节点为输入消息或数据库中的字段之间、以及到一个或多个输出消息或数据库表执行映射提供了图形方法。目标是减少编程工作,并使开发人员能够快速开发从一个消息结构到另一个消息结构的转换。
开始使用映射节点
为了使用映射节点,必须首选将输入和输出结构定义到 WebSphere Message Broker Toolkit。对于数据库表,它可以是数据库模式的形式,对于消息,它将是 Message Set 和 Message Definition File。对于我们的示例消息,最初不存在任何消息定义或 XML 模式,但是通过右键单击 Message Brokers Toolkit 中的 XML 文件并选择 Generate => XML Schema 可以生成一个模式。生成模式后,可以将其导入到 Message Set 项目,以创建所需的消息定义。
要开始开发映射,请将映射节点放置在消息流中。右键单击节点,并选择 Open Map
。向导将指导您完成创建新的消息映射文件所需的步骤。向导的步骤有:
将映射文件初始化后,映射编辑器将打开。图 9 显示了映射编辑器。编辑器的上半部分允许将元素从源 (1) 拖到目标 (2),以便创建字段之间的关系,将字段连接在一起的线条标记了此关系。在编辑器的底部,以图形方式描述了映射脚本 (3)。中间的部分提供了一个编辑器,其中可以使用 XPath 语法操作单个公式。
在所示的示例中,对源消息中所有 Price 字段的值进行求和后并乘以 1.6,以得出映射到输出消息中 Amount 字段的结果。
图 9. 映射编辑器
注意,可以使用 XPath 语法引用消息字段。也可以应用映射节点中的许多 XPath 功能,如 fn:concat、fn:count 和 fn:substring。有关详细信息,请参阅 WebSphere Message Broker 信息中心和 Message Mapping 技术示例。示例还在映射中显示了 for 循环——对于源消息中的每个 Parent/SaleList/Invoice/Item,在输出消息中,使用从源映射的 Desc、Cost 和 Qty 子元素创建了 Article 元素。这种重复的映射行为具有非常强大的功能。
使用映射的示例场景
与 JavaCompute、ESQL 和 XSLT 示例不同,执行输入和输出消息之间转换的产品不包括任何映射示例。请参阅本文提供的示例项目,了解包括适当消息映射文件的消息集和流。
尽管源消息的许多字段可以直接映射到目标消息中的字段,但是有些字段需要更复杂的操作。
例如,我们需要对一组目标字段求和,但是这不能直接使用映射编辑器。在示例中,目标消息中的 Statement/Amount 字段是对目标的所有 Statement/Purchases/Article/Cost 字段求和并乘以源消息的 Price 字段的结果。因为不可能将目标字段的和作为另一个目标字段的值,所以我们需要求和,并乘以源 Price 字段,作为目标 Amount 字段的值。XPath 表达式类似于:
fn:sum($source/Parent/SaleList/Invoice/Item/Price) * 1.6 |
我们需要将源消息的所有 Initial 字段连接到目标消息中的单个 Initials 字段。这也不能直接使用映射编辑器,XPath 功能在这里无法帮助我们。对于此类情况,可以使用 ESQL 功能扩展映射节点。ESQL 功能从使用 esql:<broker_schema>.<function_name>
语法的映射进行调用。在我们的示例中,我们可以调用 ESQL 功能来执行我们需要使用以下表达式执行的工作:
esql:map.ConcatenateInitials($source/Parent/SaleList/Invoice) |
ConcatenateInitials
函数存在于代理模式调用的映射内部。它接受指向源消息中 Parent/SaleList/Invoice 树的 REFERENCE。然后,它遍历称为 Initial 的所有元素实例,并将它们连接到要返回到映射的 CHARACTER 变量。
CREATE FUNCTION ConcatenateInitials (invoice REFERENCE "Invoice" ) RETURNS CHARACTER BEGIN DECLARE ref REFERENCE TO invoice.Initial[1]; DECLARE result CHARACTER ''; WHILE LASTMOVE(ref) DO SET result = result || ref; MOVE ref NEXTSIBLING REPEAT NAME; END WHILE; RETURN result; END; |
使用 ESQL 扩展映射的能力(节点本身提供的一系列 XPath 功能所不能提供的映射功能),使得映射节点成为非常灵活的转换工具。
ESQL 优点摘要
使用扩展结构化查询语言 (ESQL)
现有的 WebSphere Message Broker 用户实现转换的最常用方法与使用 ESQL 类似。自从 MQSeries Integrator(WebSphere Message Broker 的早期名称)版本 2.0 发布以来一直支持该语言。随着时间的推移,ESQL 的功能已经得到增强和发展。在版本 6 中,该语言已经有了大量的改进,包括:
此外,标准的 Compute 节点现在提供 5 个输出终端,允许在消息流中进行更加灵活的路由。
使用 ESQL 的示例场景
下面显示了执行我们选择的转换所需的 ESQL 代码。需要对跟踪重复的元素(如 Statement 和 Item)进行一些工作,因此使用了数据索引。
图 10. 用于消息转换的 ESQL
DECLARE total FLOAT; DECLARE count INTEGER 1; DECLARE innercount INTEGER 1; DECLARE i INTEGER 1; DECLARE saleListRef REFERENCE TO InputBody.Parent.SaleList[1]; CREATE FIELD OutputRoot.XML.Parent; DECLARE outref REFERENCE TO OutputRoot.XML.Parent; WHILE LASTMOVE(saleListRef) DO DECLARE invoiceRef REFERENCE TO saleListRef.Invoice[1]; WHILE LASTMOVE(invoiceRef) DO IF (invoiceRef.Surname <> 'Shop') THEN SET outref.SaleList[i].Statement[count].Customer.Initials = invoiceRef.Initial[1] || COALESCE(invoiceRef.Initial[2],''); SET outref.SaleList[i].Statement[count].Customer.Name = invoiceRef.Surname; SET outref.SaleList[i].Statement[count].Customer.Balance = invoiceRef.Balance; DECLARE ref2 REFERENCE to invoiceRef.Item[1]; SET total = 0; SET innercount = 1; WHILE (LASTMOVE(ref2) = TRUE) DO IF (ref2.Price > 0.0) THEN SET outref.SaleList[i].Statement[count].Purchases. Article[innercount].Desc = ref2.Description; SET outref.SaleList[i].Statement[count]. Purchases.Article[innercount].Cost = CAST(ref2.Price AS FLOAT) * 1.6; SET outref.SaleList[i].Statement[count]. Purchases.Article[innercount].Qty = ref2.Quantity; SET total = total + (CAST(ref2.Price AS FLOAT) * CAST(ref2.Quantity AS FLOAT) * 1.6); SET innercount = innercount + 1; END IF; MOVE ref2 NEXTSIBLING REPEAT NAME; END WHILE; SET outref.SaleList[i].Statement[count].Amount = total; SET outref.SaleList[i].Statement[count].Amount.Currency = invoiceRef.Currency; SET outref.SaleList[i].Statement[count].Type ='Monthly'; SET outref.SaleList[i].Statement[count].Style = 'Full'; SET count = count + 1; END IF; MOVE invoiceRef NEXTSIBLING NAME 'Invoice'; END WHILE; SET i = i + 1; SET count = 1; MOVE saleListRef NEXTSIBLING NAME 'SaleList'; END WHILE; |
使用 ESQL 的优点
ESQL 是 WebSphere Message Broker V6 运行时执行的解释性语言。
SQL 当然比较知名,并且从 SQL 转移到 ESQL 的学习过程也比较短,所以,如果您在组织中没有 Java 技能,那么 ESQL 可能是一个理想选择。如果您要从早期版本的 WebSphere Message Broker 迁移,那么您可能熟悉 ESQL。如果已经使用 ESQL 对现有消息流的内核进行了编程,那么没有任何理由从 ESQL 进行切换,尽管您可能希望将一个或多个其他转换技术添加到现有的流。
ESQL 具有强大的重用潜能,因为您可以从 ESQL 功能和过程创建代码库,并将它们存储在模式中,这类似于 Java 包。然后其他团队和项目可以重用这些通用功能。
由于 ESQL 是 SQL 派生的,所以,在需要许多数据库交互时,操作消息数据特别好。当数据库在消息流的范围内工作时,WebSphere Message Broker V6 可以执行事务协调转换。您可以在消息数据和数据库表上使用标准的 SQL SELECT 语句。某些组织使用较旧的数据库应用程序的 SQL 对业务逻辑进行了编码,有时通过迁移到 ESQL 可以重用此逻辑。您还可以直接从 ESQL 调用外部存储的过程,并根据需要处理结果集。
在 WebSphere Message Broker V6 中,您可以直接从 ESQL 将其写入系统事件日志。仅在 ESQL 或 Java API 中提供此功能,而 XSLT 或映射中没有此功能,因此,如果有这方面的要求,ESQL 可能是最佳选择,您可以将其用于消息流中需要它的各个部分中。
如果 ESQL 中不能提供所需的功能,您可以编写公开静态方法的 Java 类。因此,ESQL 非常灵活,能够在 Message Broker V6 支持的任何域中直接与数据库交互、调用存储的过程、调用 Java 方法和操作消息数据。
ESQL 优点摘要
性能、效率和成本问题
性能、效率和成本问题包括资产重用、开发的速度和成本以及运行时性能。重用资产(如可扩展的样式表)的功能可以减少开发成本,但是可能会影响运行时性能,具体取决于所涉及的处理的类型和复杂性,因为可扩展样式表的性能通常比在 ESQL 或 Java 中手动编码的实现速度要慢。如果消息吞吐量是要首先考虑的事项,那么 ESQL 或 Java 可能是您处理逻辑的较好选择。
附加选项
在 WebSphere Message Broker 中操作消息数据的其他方法包括使用 C 语言编写插件节点或调用数据库存储过程和从消息树传递值以及从数据库引擎收回一个或多个值。有关这些选项的详细信息,请参见 WebSphere Message Broker 信息中心。
结束语
本文介绍了在 WebSphere Message Broker 中转换数据的四种主要技术,涵盖了从编码到使用图形界面进行映射等各种编程语言和开发样式。本文还介绍了每个选项的优缺点,并阐述了需要如何考虑功能性和非功能性的要求,以便为给定的集成方案选择最佳的技术。影响您选择转换技术的其他因素包括您公司首选的编程语言和消息流开发人员的技能。请记住,在跨不同的项目、相同项目以及同一消息流中可以使用不同的技术方法。转换选项的范围以及将它们混合的能力使得 WebSphere Message Broker V6 作为高级企业服务总线成为一个真正灵活的解决方案。
如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。
现场直击|2021世界人工智能大会
直击5G创新地带,就在2021MWC上海
5G已至 转型当时——服务提供商如何把握转型的绝佳时机
寻找自己的Flag
华为开发者大会2020(Cloud)- 科技行者