第 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 接口派生的接口。逻辑处理程序实施逻辑处理程序接口。协议处理程序实施 Handler 接口协议特定的扩展。例如,SOAP 处理程序实施 SOAPHandler 接口。

  • 处理程序可用信息量

    协议处理程序可以访问消息的内容以及与消息内容打包的所有协议特定信息。逻辑处理程序只能访问消息的内容。逻辑处理程序没有了解协议详情。

将处理程序添加到应用程序

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

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

    要实现逻辑处理器,请查看 第 43.2 节 “实施逻辑处理程序”

    要实现协议处理器,请查看 第 43.4 节 “实施协议处理程序”

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