第 43 章 编写处理程序

摘要

JAX-WS 提供了一个灵活的插件框架,可用于向应用添加消息处理模块。这些模块(称为处理程序)独立于应用程序级别代码,可以提供低级消息处理功能。

43.1. 处理程序:简介

概述

当服务代理在服务上调用操作时,操作的参数将传递到 Apache CXF(其中它们内置到消息中),并放置在线路上。当该服务收到消息时,Apache CXF 从线路读取消息,重新创建消息,然后将操作参数传递给负责实施操作的应用代码。当应用程序代码完成请求时,回复消息会发现其向源自该请求的服务代理的类似事件链。这在 图 43.1 “消息交换路径” 中显示。

图 43.1. 消息交换路径

客户端和服务器间的消息交换路径

JAX-WS 定义了操作应用程序级别代码和网络之间的消息数据的机制。例如,您可能希望通过开放网络传递的消息数据使用专有加密机制加密。您可以编写加密和解密数据的 JAX-WS 处理程序。然后,您可以将处理程序插入到所有客户端和服务器的消息处理链中。

图 43.2 “带有处理程序的消息交换路径” 所示,处理程序放置在应用程序级别代码和将消息放入网络的传输代码之间的遍历的链中。

图 43.2. 带有处理程序的消息交换路径

处理程序放置在传输和应用程序层之间的消息交换路径中

处理程序类型

JAX-WS 规范定义了两个基本处理程序类型:

  • 逻辑处理程序 逻辑处理程序可以处理消息有效负载以及消息上下文中存储的属性。例如,如果应用程序使用纯 XML 消息,逻辑处理程序可以访问整个消息。如果应用程序使用 SOAP 消息,逻辑处理程序可以访问 SOAP 正文的内容。它们无法访问 SOAP 标头或任何附件,除非它们被放入消息上下文中。

    逻辑处理程序被放在处理器链上的应用代码中。这意味着,当信息从应用程序代码传递给传输时,首先执行它们。从网络接收消息并传回应用程序代码时,逻辑处理程序将最后执行。

  • 协议处理程序 协议处理程序可以处理从网络接收的整个消息,以及消息上下文中存储的属性。例如,如果应用程序使用 SOAP 消息,协议处理程序将有权访问 SOAP 正文、SOAP 标头和任何附件。

    协议处理程序被置于处理器链上的传输中。这意味着,当从网络收到信息时,首先执行它们。当消息从应用程序代码发送到网络时,会最后执行协议处理程序。

    注意

    Apache CXF 支持的唯一协议处理程序特定于 SOAP。

处理程序实施

两个处理器类型之间的区别非常小,它们共享一个共同的基本接口。由于其常见父项,逻辑处理程序和协议处理程序共享了多种必须实施的方法,包括:

  • handleMessage() handleMessage() 方法是任意处理程序中的中央方法。它是负责处理普通消息的方法。
  • handleFault() handleFault() 是负责处理故障消息的方法。
  • close() 当消息到达链的末尾时,对处理器链中执行的所有处理程序调用 close()。它用于清理消息处理过程中消耗的所有资源。

逻辑处理程序的实现与协议处理程序的实现之间的不同:

  • 所使用的特定接口

    所有处理程序都实施从 Handler 接口派生的接口。逻辑处理程序实施 LogicalHandler 接口。协议处理程序实施处理程序接口的协议特定扩展。例如,SOAP 处理程序实施 SOAPHandler 接口。

  • 处理程序可用的信息量

    协议处理程序有权访问消息的内容,以及所有使用消息内容打包的协议特定信息。逻辑处理程序只能访问消息的内容。逻辑处理程序不知道协议详情。

在应用程序中添加处理程序

要为应用程序添加处理器,您必须执行以下操作:

  1. 确定处理程序是否将用于服务提供商、使用者或两者。
  2. 确定哪种类型的处理程序最适合该作业。
  3. 实施正确的接口。

    要实现逻辑处理程序,请参阅 第 43.2 节 “实施逻辑处理程序”

    要实现协议处理程序,请参阅 第 43.4 节 “实施协议处理程序”

  4. 将您的端点配置为使用处理程序。请参阅 第 43.10 节 “配置端点以使用处理程序”