将 Business Events 与公共业务事件集成

Jon Mc Namara, 高级 IT 专家, IBM

概述

在简介部分,我们将描述 WebSphere Business Events (Business Events)、公共基础事件(Common Base Events,CBE)和公共事件基础结构(Common Event Infrastructure,CEI)工具,以及它们在提供企业应用程序集成功能方面的价值。然后,我们将从体系结构的角度相对于彼此概述这些工具如何操作。

配置 Business Events 以接受来自 CEI 的 CBE 消息中,您将了解如何使用提供的示例处理来自 CEI 的 CBE 消息,并将事件作为文件输出。在配置 Business Events 以生成 CBE 消息并将其发送到 CEI 中,您将了解如何使用提供的示例将事件作为文件输入,并将其以 CBE 消息的形式输出,以放入 CEI。这些部分彼此完全独立。也就是说,您不需要同时实现这两个部分的内容来得到结果。相反,您可以仅关注您感兴趣的区域,从 CEI 获取 CBE 消息并进行处理,或将消息作为 CBE 输出到 CEI。

我们假定本文的读者对 CEI 非常了解,而且阅读了本系列的其他文章,具有 Business Events 的背景知识。

Business Events 的概述

Business Events 是 IT 基础结构的事件管理层。它处理业务事件流程的设计、执行和监视。业务事件处理(Business Event Processing,BEP)对传统消息传递应用程序进行了增强,在其中添加了业务事件处理功能。您可以构建和部署应用程序,并描述业务规则,以指定系统如何响应发生(或不发生)事件的情况以及采取什么操作进行响应。

公共基础事件概述

在讨论什么是公共基础事件前,首先确定一下我们所说的事件的含义。事件就是发生了感兴趣的某件事的指示信息。

如果看看公共基础事件模型,可以发现事件能够代表所感兴趣的任何活动的开始、发展和结束。

从更为技术的层面而言,事件可以提供所感兴趣的活动的状态视图。此状态可能为该活动已经失败、开始、停止,或是终止并已过渡到其他活动。事件还可以作为出现了某种情况的通知,例如:“Mc Namara 先生的帐户余额已少于 0。”

那么,使用 CBE 格式的好处是什么呢?它为我们提供了事件的通用一致性表示形式。这个一致性意味着 CBE 可表示支持特定功能的各种不同技术生成或使用的事件。CBE 提供的通用性和一致性好处以广泛采用的 CBE 标准为后盾。CBE 本身分为三个部分:

  1. 标识报告情况的组件。
  2. 标识受情况影响的组件。
  3. 情况本身。

为了支持这个公用方法,CBE 以标准 XML 模式的形式定义,而这自然会导致其具有多种应用类型,如通知、审核和业务事件。没有这样的一致性和标准化,作为事件发布的数据基本上就对业务系统没有价值,因为它们依赖于数据的完整性来确定给定情况的最佳操作。CBE 定义及其包含三个级别的格式的一致性能帮助确保这个完整性,并提供了有保障的数据质量,为提供准确和有用的业务事件提供必要支持。

尽管 CBE 的主要好处是提供了事件的一致表示形式,但能向事件添加并不严格遵循所定义的结构的额外信息也是一个有用的优势。为此提供的 CBE 模式允许包括 XML 文档片段。您可以使用 xs:any 构造添加此类片段。例如,可以使用它表示事件的有效负载。在创建此类片段前,应该创建定义追加的 xml 的结构的 XML 模式定义(XML Schema Definition,XSD)。

在运行时,公共基础接口的 addAny() 方法用于向 CBE 添加此自定义 XML 片段。接收到 CBE 时,XSD 描述接收方如何解析 XML 的片段。

以下是将 eventXML 作为 XML 追加内容添加的示例:

CommonBaseEvent cbe = this.eventFactory.createCommonBaseEvent();
. . .
cbe.addAny(eventXML);
. . .

单个事件可以包含多个 XSD。这些 XSD 以及 CBE 定义本身描述整个事件的结构。

请注意 CBE 中 XSD 定义的 XML 片段的使用:

  • 事件定义包含在 XSD、CBE 或 Web 服务描述语言(Web Services Description Language,WSDL)文件或这些文件的组合中。
  • 您可以引用其他项目中的现有事件定义,或从文件系统导入事件定义。您还可以在嵌套事件定义时对其进行引用。
  • 由于 XSD 可定义任何 XML 结构,追加的 XML 可包括用于其他目的的片段;例如,用于通过应用程序传递数据的业务对象。

面向服务的体系结构(Service-Oriented Architecture,SOA)和业务流程管理(Business Process Management,BPM)的其他领域还使用 xml 定义事件,因此,通过在 CBE 中包括自定义 XML,您可以使用与其他领域相同的工具。如果您已经为希望传递到业务事件主体中的业务数据定义了 XSD,则可以直接在将 XML 追加到 CBE 时重用该 XSD。这个灵活性提供了便于应用程序和中间件使用 XML 的方便选择。

很多发出 CBE 的 WebSphere BPM 产品都已经采用了 XSD 样式的事件,包括 WebSphere Process Server V6.1、WebSphere Enterprise Service Bus V6.1 和 WebSphere Message Broker V6.1。Business Events V6.1 能生成采用 XML 格式的完全格式化 CBE,并将其转发到 CEI 队列(包含 XSD 定义的有效负载)。XSD 样式的事件还可以供 Business Events 使用。

CEI 概述

您现在已经了解了关于 CBE 的更多信息,接下来我们将看看公共事件基础结构(Common Event Infrastructure,CEI),CEI 在 CBE 的操作中扮演着关键角色。

CEI 是用于广泛的业务、系统和网络 CBE 格式事件的创建、传输、持久和分发的统一的一致 API 集的 IBM 实现。很多产品支持使用 CEI 作为传递 CBE 格式事件的机制。CEI 是当前在很多产品中提供的事件通知和事件传输框架。这些产品支持使用 CEI 作为传递 CBE 格式事件的机制。IBM 将继续支持 CEI 和 CBE 格式,但同时还将对事件通知和传输进行增强,并不限于 CEI 和 CBE 格式。通过利用基于 JMS、Web 服务和 XML 的技术,能够为事件生产者和使用者提供更大的灵活性。

CEI 提供了用于以下方面的公共接口:

  • 发布(或发出)事件
  • 订阅与特定筛选器匹配的事件(事件组)
  • 使用事件。
  • 查询历史事件数据(如果启用了可选事件存储,则可以通过发布的接口实现)。

CEI 提供了集成点,用于整合来自大量异类多样化源的事件。另外还提供了将这些事件分发到使用者的功能。这些事件使用前面描述的 CBE 模型表示。

通过使用 CEI 产品,可以将应用程序和功能作为事件集成。这样就能支持这些服务组成的以业务为中心的端到端流程视图。这方面的一个例子是,银行后端办公系统生成事件,记录客户自己亲自从其本地分行进行了取款操作。同时,可能会有某个独立系统生成一个事件,记录在不同的国家/地区使用了同一个客户的 ATM 卡。通常,这两个事件将是独立的,不过,因为 CEI 为这些事件提供了单个框架,因此这两个事件都可供其他系统使用。此系统将注册一个警报,指示出现了不正常操作。不会希望出现这样的情况,一方面个人在本地提取现金,而另一方面又同时看到客户的卡号出现在不同的国家/地区的 ATM 交易中。如果没有这样的基础结构,这两个系统都可能有自己的事件管理系统,因此不能将其事件进行相关,以提供此业务价值。

CEI 提供了生成、分发和使用事件的工具。不过,它并不定义实际的事件本身。为此,开发人员和管理人员需要定义事件类型、事件组及其相关性。

如果深入 CEI 的技术层面,可能发现它是一个共享组件,使用 WebSphere Application Server (Application Server) 的功能。CEI 提供了存储、更新事件和将其分发给侦听 JMS 主题的使用者的能力。这些事件使用者能够在事件创建者之外的环境中处理事件。事实上,这些事件使用者很可能将处理来自大量不同源的事件。这样有两个结果:

  • 所有事件都需要使用同一个公共结构。正如前面讨论的,CBE 是被广泛接受的此类结构的标准。
  • CBE 需要包含使用者所需的全部信息,以便理解事件。这包括关于运行时环境、业务环境和创建事件的应用程序对象的实例的信息。有关更多信息,请参见公共基础事件模型





回页首


必备 CEI 配置

提供下载的示例是在 WebSphere Application Server CEI 服务器实现上开发和测试的。在此实现上,我们构造了针对运行 WebSphere Business Monitor (Monitor) 的远程 WebSphere Application Server 的跨单元配置。在配置 Business Events 以生成 CBE 消息并将其发送到 CEI 中使用 Business Events 生成的 CBE 分发到远程 Application Server,并由 Monitor 模型进行处理,Monitor 将更新其业务仪表板,以显示结果。

为了充分利用这个示例,您不需要配置 Monitor。不过,为了匹配示例所使用的条件,有必要确保您在 CEI 实现上启用了 CEI 服务器。另外,我们将说明使用跨单元队列构件(稍后介绍)如何捕获和检查 CEI 中的消息,因此,如果希望复制这个环境,有必要创建本文中使用的 CEI 构件。

如果您希望设置指向其他 Application Server 系统的跨单元配置,请遵循跨单元配置中的说明操作。





回页首


配置 Business Events 以接受来自 CEI 的 CBE 消息

在此部分,我们将详细介绍各个步骤,从而配置 Business Events,以从 CEI 中接受 CBE 消息。到目前为止,我们讨论了公共基础事件的本质,以及对其进行操作的框架,即公共事件基础结构。接下来,我们将了解 Business Events 工具,并描述如何配置此工具来从 CEI 内接受 CBE。您可以使用此部分描述的流程和提供的示例,增强您自己的项目,以从 CEI 直接接收 CBE 消息。

场景概述

示例项目提供了在“CEI”接触点中创建的已配置好的“公共基础事件”。此事件配置为从 CEI 接收 CBE 消息,在接收到此消息时,将自动处理消息中的信息子集,并将其输出到文件。

为了使 Business Events 事件能够从 CEI 接收 CBE 消息,事件的 Business Events 消息队列连接器需要 XSL 导入,以便 Business Events 直接处理 CBE。修改此示例供自己使用时,请记住所提供的 XSL 配置为与示例项目中已配置的事件一起使用。创建新事件时,XSL 将需要反映所需的新事件。导入了自己的 XSL 后,您将需要配置连接器,使其指向相应的 JMS 队列(CBE 消息预计将到达此队列)。

我们还将演示如何配置消息队列连接器来接受这些消息,以及如何在预期 JMS 队列上放置测试 CBE 消息,以测试配置。

导入示例项目

要导入示例项目,请执行以下操作:

  1. 将示例项目 P1CommonBaseEventProject.xml 保存到您硬盘驱动器上相应的文件夹。
  2. 在 Business Events 中打开 Design Data
  3. 选择 File => Open Project ,以导入项目,如图 1 中所示。然后选择 Browse,以定位到示例项目,并单击 Open

    图 1. 打开项目
    打开项目

  4. 打开 Touchpoints 窗格并查看 Common Base Event 事件,如图 2 中所示。您可以看到它具有特定的格式。

    图 2. 事件属性
    事件属性

    我们花点时间看看这个事件。当您创建自己的 CBE 兼容事件时,您需要记住,需要符合所预期处理的 CBE 的格式。

允许事件接受来自 CEI 的 CBE 消息

现在已经导入了项目,接下来我们将允许事件接受来自 CEI 的 CBE 消息。

  1. 右键单击 Common Base Event 并选择 Event Properties => Connection => Message Queue Connection => Configure,如图 3 中所示。

    图 3. 事件连接属性
    事件连接属性

  2. 您可以看到所需的格式为 Custom XML (XSL input)。选择 Configure => New,以导入 XSL 样式表。示例 XSL 已经导入到此项目中,而且已经准备好,可供使用了。
  3. 图 3 中,您可以看到,为了接受来自 CEI 的 CBE 消息,需要进行特定的配置。确保 Type: 设置为 JMS Queue,而 Name: 设置为 jms/cei/EventQueue,如图中所示。
  4. 单击 Provider,以查看示例所需的提供者配置,如图 4 中所示。

    图 4. 提供者属性
    提供者属性

  5. 对于此示例,请设置以下信息:
    • Context Factory Classcom.ibm.websphere.naming.WsnInitialContextFactory
    • URLiiop://localhost:2809。注意:请将此修改为您环境的本地主机,详见 Application Server 配置,如图 5 中所示。

      图 5. 本地主机属性
      本地主机属性

    • Factory Namejms/cei/Event/QueueConnectionFactory
    • UsernamePassword:您的 Application Server 管理控制台的用户 ID 和密码。

为 Business Events 输出设置目录

在测试项目配置前,您需要确保有一个目录,可供 Business Events 在其中放置因为从 CEI 接收 CBE 消息而创建的文件。

  1. 如果检查由于事件所启动的操作,可以发现创建了一个输出文件,其中包含传入 CBE 消息中包含的 CBE 数据的子集。为此,请在 Touchpoint 窗格中选择 Publish Common Base Event => Action Properties => Connection => File System => Configure。 您将会看到操作属性,如图 6 中所示。

    图 6. 操作属性
    操作属性

  2. Server 部分单击 Configure。在文件属性窗口(如图 7 中所示)中,可以看到出站操作文件将发送到 c:\wbeout 目录。

    图 7. 文件属性
    文件属性

  3. 为了测试示例配置,您需要创建名为 c:\wbeout 的目录。

创建此目录后,就可以测试示例项目了。

测试示例项目

如果您尚未将项目签入运行时存储库,请进行签入。完成之后,就可以对流程进行测试了。

  1. 导航到您的 Business Events 安装路径的 \director\bin 目录,启动连接器。例如:C:\\director\bin。
  2. 键入 connectors.bat。因为示例项目的配置需要连接器检查 CEI 事件队列,因此应该看到与这里所示类似的连接器信息:

    图 8. 连接器启动
    连接器启动

  3. 对于本示例,我们使用了 Service Integration Bus Explorer 将示例 P1CBE.xml 放到在公共基础事件消息队列中指定的 JMS 队列中。有关 Service Integration Bus Explorer 的详细信息,请参见 Service Integration Bus Explorer

    打开 Service Integration Bus Explorer 之前,请打开 P1CBE.xml 示例文件,并将内容复制到剪贴板。

  4. 现在,打开 Service Integration Bus Explorer 并选择 CommonEventInfrastructure_Bus => Destinations
  5. 在右侧窗格中右键单击 YourNode.YourServer.CommonEventInfrastructureQueueDestination 并对队列选择 Put Single Test Message,如图 9 中所示。

    图 9. Service Integration Bus Explorer
    Service Integration Bus Explorer

  6. 将剪贴板中的 XML 粘贴到测试消息字段,并小心地删除测试消息中任何不必要的空格,然后单击 OK

    您应该看到,由于从 CEI 队列接收到此消息,命令窗口中的连接器状态会更新,如图 10 中所示。



    图 10. 连接器接收 CBE
    连接器接收 CBE

  7. 既然已经为 Business Events 事件提供了输入,接下来可以进行检查,了解是否对其进行了处理。为此,请转到前面创建的 Business Events 输出目录 c:\wbeout。您应该看到 Business Events 出站操作创建了一个文件。
  8. 打开此文件。应该看到从 CEI 向其传入的事件信息的子集,而且现在已经转换为 BuyAck 事件文件,如图 11 中所示。

    图 11. 输出文件
    输出文件

小结

在此场景中,您了解了 Business Events 如何处理来自 CEI 的传入 CBE 消息。在这个实例中,我们从 CEI 获取 CBE 消息,并将消息的子集输出到文件。将 Business Events 配置为接受来自 CEI 的 CBE 消息后,就可以采用多种方式操作事件,将其用于构造针对各种媒体(如 MQ、FTP,甚至返回到 CEI)的出站操作。

在下一部分,我们将了解如何才能接受来自文件格式的事件,并生成将放置到 CEI 队列上的 CBE。





回页首


配置 Business Events,以生成 CBE 消息,并将其发送到 CEI

在此部分,我们将使用一个示例 Business Events 项目,用于生成 CBE。

场景

接下来我们看看在本系列前面的部分中使用的交易系统场景。此系统接收买进和卖出请求,需要监视实时交易数据中的特定模式。我们对大量交易事件(或消息)中可能指示投机行为的模式感兴趣。我们将定义两个策略来确定此类情形:

  • Sell 和 Buy 事件具有描述客户、股票、交易发生的日期和时间、股份数额和价格的属性。当相同客户在 Buy 事件后一小时内针对相同股票发生 Sell 事件时,将生成一个 SellAfterBuy 操作。
  • 如果一个客户一天内针对相同或不同股票执行了三次 SellAfterBuy,则会生成一个 SpeculativeCustomer 操作。

SellAfterBuy 和 SpeculativeCustomer 操作是作为匹配策略规则的结果生成的 Business Events 输出。如本系列前面的各个部分中所述,其他外部系统可以处理这些操作。图 12 显示了此场景:


图 12. 示例场景
示例场景

正如前面提到的,本文提供下载的示例项目提供了已经准备好可供使用的 Business Events 应用程序。此应用程序已经配置为生成从 Business Events 到 CEI 的 CBE。

在创建新 Business Events 项目来使用 CBE 之前,最好花点时间看看示例项目,以了解如何配置 Business Events 操作来发出 CBE。理解此项目及以下配置步骤后,您应该具备了相关知识,可以开始创建或修改自己的 Business Events 项目了。

导入示例项目

要导入示例项目,请执行以下步骤:

  1. 将示例项目 P2TradeOut.xml 保存到硬盘驱动器上相应的文件夹。
  2. 在 Business Events 中打开 Design Data
  3. 选择 File => Open Project ,以导入项目,如图 13 中所示。然后选择 Browse,以定位到示例项目,并单击 Open

    图 13. 导入示例项目
    导入示例项目

工具中现在打开了 Trade System 示例项目。

配置示例项目

现在已经将示例项目加载到了 Design Data 工具中,接下来可以看看如何让 Business Events 向 CEI 发出 CBE。此部分将会详细介绍如何配置出站 Business Events 操作向 CEI 发出 CBE 的步骤。

导入并打开项目之后,可以看到 Touchpoint 窗格中填充了一系列条目。在此 Touchpoint 窗格中,可以配置出站 Business Events 操作,以发出 CBE 事件。接下来我们看看操作,了解如何实现此工作。

  1. 右键单击操作 Buy Ack 并选择 Action Properties,如图 14 中所示。

    图 14. Action Properties
    Action Properties

  2. 在 Action Properties 窗口中,选择 Connection 选项卡,并单击 Message Queue Connection ,如图 15 中所示,然后单击 Configure

    图 15. Message Queue Connection
    Message Queue Connection

  3. 您将看到一系列可为 Message Queue 操作配置指定的选项,如图 16 中所示。请指定以下设置:
    • FormatCBE (WBM)
    • TypeJMS Queue
    • Namejms/cei/EventQueue
    • Message TypeCREATE_EVENTS_NOTIFICATION_V2_0
    • 单击 Provider


    图 16. 配置 Message Queue 操作
    配置 Message Queue 操作

  4. 将显示 Provider 窗口,如图 17 中所示。

    图 17. 提供者配置
    提供者配置

    指定下面的内容:
    • 确保 Context Factory Class 设置为 com.ibm.websphere.naming.WsnInitialContextFactory
    • URLiiop://localhost:2809。注意:请将此修改为您环境的本地主机,详见 Application Server 配置,如图中所示。

      图 18. 本地主机属性
      本地主机属性

    • Factory Namejms/cei/EventQueueConnectionFactory
    • UsernamePassword:您的 Application Server 管理控制台的用户 ID 和密码。

对于所创建的任何新 Business Events 项目以及所有希望生成传入 CEI 的 CBE 的操作,您都需要完成上面的步骤。

部署配置

要部署更改,以准备进行测试,请完成以下步骤:

  1. 从 Design Data 中选择 Tools => Repositories,如图 19 中所示。

    图 19. 打开存储库
    打开存储库

  2. 在图 20 中所示的 Repository 窗口中,从 Project 窗格的构件列表中选择一个元素,然后按 Ctrl+A 选择全部。
  3. 单击 Add in,以将所有元素添加到存储库,包括所有更改。

    图 20. 将元素添加到存储库
    将元素添加到存储库

  4. 停止并重新启动 Business Events 运行时,以从存储库中获取更改。为此,请使用 WebSphere Application Server 管理控制台,可通过其检查 Business Events 运行时的状态以及停止和启动它。

    登录到控制台后,从左列中选择 Enterprise Applications,您将看到 Business Events 运行时,如图 21 中所示。



    图 21. Business Events 运行时
    Business Events 运行时

    由于 WBERuntimeEAR 的状态显示为绿色,请选择 WBERuntimeEar 并单击 Stop

  5. 运行时停止后且未出错时,请再次选择 WBERuntimeEar 并单击 Start。您应该看到绿色状态,指示它已经启动。

现在您已经准备好对工具进行测试,使用 CBE 从 Business Events 向 CEI 发送消息。

测试配置

完成 Business Events 项目的配置后,应该进行测试,以确保您的操作配置成功。为了测试新操作配置,您可以使用示例项目中提供的输入事件:

  • aeventBUY*.xml
  • beventSELL*.xml
  • beventSELLafterBUY*.xml

创建一个 c:/wbetmp/ 目录,并将这些示例输入文件放入此目录中。

或者,您可以创建自己的输入事件。为了生成自己的可由 Business Events 作为输入并触发我们所修改的操作的构件,您需要将示例数据包从操作本身中导出。为此,请使用示例项目完成以下步骤:

  1. 在 Touchpoints 窗格中右键单击 Buy 事件,并选择 Event Properties,如图 22 中所示。

    图 22. Event properties
    Event properties

  2. 在 Event Buy Properties 窗口选择 Event 选项卡,如图 23 中所示。

    图 23. Buy 属性
    Buy 属性

  3. 单击 Export packets and schemas 并选择 WBE Packet Example
  4. 将示例保存到您很容易查找的目录。示例项目中使用的目录为 c:/wbetmp/,因此在使用示例项目时,请创建此目录,并将您的文件保存到其中。
  5. 保存文件之后,请使用 XML 编辑器将其打开,以熟悉入站事件的结构。

    执行示例项目时,确保所生成的所有 BUY 事件都使用“a”作为前缀(例如,aBUY_EVENT.xml),所有 SELL 事件都使用“b”作为前缀(例如,bSELL_EVENT.xml)。很有必要这样做,因为示例项目配置为根据文件的前缀区分传入 BUY 和 SELL 事件。这样,用户就可以交错事件处理的顺序,确保某些事件在其他事件之前处理。

  6. 现在已经生成了将作为传入事件处理的文件,现在可以启动连接器,连接器将允许 Business Events 使用事件,然后将输出操作生成的 CGE 传递到 CEI 上。
  7. 导航到您的 Business Events 安装路径的 \director\bin 目录,启动连接器。例如:C:\\director\bin。
  8. 键入 connectors.bat。连接器启动,打开显示启动信息的命令窗口,并会扫描您已创建并保存到 Business Events 事件目录的事件文件。您应该在命令窗口中看到您的事件被连接器进程处理,如图 24 中所示:

    图 24. 连接器启动
    连接器启动

  9. 检查以下信息,以确保处理没有出现问题:
    • 确保事件文件已被删除,从而确定所创建并保存在 c:\wbetemp\event 目录中的事件已经被使用。
    • 连接器日志位于 C:\\director\logs\WBERuntime.connectors.log。

在 CEI 中检查 CBE

如果您要在 CEI 中检查 Business Events 所处理的 CBE,可以停止通过总线发送消息。为此,您将需要登录到 Application Server 管理控制台,并对 CEI 配置进行一点修改。为了遵循这些说明进行操作,您必须完全按照“先决条件 CEI 配置”部分中所述的对 CEI 进行了配置。

要禁用 CEI 中的接收选项,请在 Application Server 中选择 Buses => CommonEventInfrastructure_Bus => Destinations => YourNode.yourserver => CommonEventInfrastructureQueueDestination。取消选中 Receive allowed,如图 25 中所示。


图 25. 禁用 Receive Allowed
禁用 Receive Allowed

运行测试之后,您将能够捕获在队列中发送的消息,并对其进行检查,如图 26 中所示。


图 26. 捕获的消息
捕获的消息

单击 Additional Properties 下的 Messages,以查看 CBE 消息本身,如图 27 中所示。


图 27. 查看消息
查看消息

您现在可以看到 Business Events 所生成并发送到 CEI 的 CBE 消息的内容。如果您要查看完整消息,请确保更改 Displayed message body size,使其与 Approximate total message size 匹配。

小结

在此部分,您了解了 Business Events、CBE 和 CEI 间的关系。您了解了如何从 Business Events 操作配置生成 CBE。您还了解了在正确配置的情况下,如何检查通过 CEI 分发的 CBE 消息。

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/14789789/viewspace-610867/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/14789789/viewspace-610867/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值