Java Web服务性能优化实践(3)
来源:互联网 发布:软件乱码 编辑:程序博客网 时间:2024/06/05 11:11
本文介绍如何提升 Java Web 服务性能,主要介绍了三种方法:一是采用 Web 服务的异步调用,二是引入 Web 服务批处理模式,三是压缩 SOAP 消息。重点介绍在编程过程中如何使用异步 Web 服务以及异步调用和同步调用的差异点。本文还示范了如何在项目中使用以上三种方法,以及各种方法所适合的应用场景。
压缩SOAP
当 Web Service SOAP 消息体比较大的时候,我们可以通过压缩 soap 来提高网络传输性能。通过 GZIP 压缩 SOAP 消息,得到二进制数据,然后把二进制数据作为附件传输。以前常规方法是把二进制数据 Base64 编码,但是 Base64 编码后的大小是二进制数据的 1.33 倍。辛苦压缩的,被 Base64 给抵消差不多了。是否可以直接传输二进制数据呢? JAX-WS 的 MTOM 是可以的,通过 HTTP 的 MIME 规范, SOAP message 可以字符,二进制混合。我们在 client 和 server 端各注册一个 handler 来处理压缩和解压。 由于压缩后的 SOAP 消息附件与消息体中的部分不是基于 MTOM 自动关联的,需要单独处理附件。在生成 client 端和 server 端代码的时候需要 enable MTOM。 Handler 具体代码在本文代码附件中, test.TestClientHanlder, test.TestServerHanlder。 写好了 handler 了之后还要为 service 注册 handler。
客户端 handler 样例代码如下:
客户端代码
- public boolean handleMessage(MessageContext arg0) {
- SOAPMessageContext ct = (SOAPMessageContext) arg0;
- boolean isRequestFlag = (Boolean) arg0
- .get(MessageContext.MESSAGE_OUTBOUND_PROPERTY);
- SOAPMessage msg = ct.getMessage();
- if (isRequestFlag) {
- try {
- SOAPBody body = msg.getSOAPBody();
- Node port = body.getChildNodes().item(0);
- String portContent = port.toString();
- NodeList list = port.getChildNodes();
- for (int i = 0; i < list.getLength(); i++) {
- port.removeChild(list.item(i));
- }
- ByteArrayOutputStream outArr = new ByteArrayOutputStream();
- GZIPOutputStream zip = new GZIPOutputStream(outArr);
- zip.write(portContent.getBytes());
- zip.flush();
- zip.close();
- byte[] arr = outArr.toByteArray();
- TestDataSource ds = new TestDataSource(arr);
- AttachmentPart attPart = msg.createAttachmentPart();
- attPart.setDataHandler(new DataHandler(ds));
- msg.addAttachmentPart(attPart);
- } catch (SOAPException e) {
- e.printStackTrace();
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
- return true;
- }
Web 服务端 handler 样例代码如下:
服务端代码
- public boolean handleMessage(MessageContext arg0) {
- SOAPMessageContext ct = (SOAPMessageContext) arg0;
- boolean isRequestFlag = (Boolean) arg0
- .get(MessageContext.MESSAGE_OUTBOUND_PROPERTY);
- SOAPMessage msg = ct.getMessage();
- if (!isRequestFlag) {
- try {
- Object obj = ct.get("Attachments");
- Attachments atts = (Attachments) obj;
- List list = atts.getContentIDList();
- for (int i = 1; i < list.size(); i++) {
- String id = (String) list.get(i);
- DataHandler d = atts.getDataHandler(id);
- InputStream in = d.getInputStream();
- ByteArrayOutputStream out = new ByteArrayOutputStream();
- GZIPInputStream zip = new GZIPInputStream(in);
- byte[] arr = new byte[1024];
- int n = 0;
- while ((n = zip.read(arr)) > 0) {
- out.write(arr, 0, n);
- }
- Document doc = DocumentBuilderFactory.newInstance()
- .newDocumentBuilder()
- .parse(new ByteArrayInputStream(out.toByteArray()));
- SOAPBody body = msg.getSOAPBody();
- Node port = body.getChildNodes().item(0);
- port.appendChild(doc.getFirstChild().getFirstChild());
- }
- } catch (SOAPException e) {
- e.printStackTrace();
- } catch (IOException e) {
- e.printStackTrace();
- } catch (SAXException e) {
- e.printStackTrace();
- } catch (ParserConfigurationException e) {
- e.printStackTrace();
- }
- }
- return true;
- }
在 web.xml 中 service-ref 部分添加 handler. Server 端 handler 也是同样添加。
配置代码
- <handler-chains>
- <handler-chain>
- <handler>
- <handler-name>TestClientHandler</handler-name>
- <handler-class>test.TestClientHandler
- </handler-class>
- </handler>
- </handler-chain>
- </handler-chains>
- Java Web服务性能优化实践(3)
- Java Web 服务性能优化实践
- Java Web 服务性能优化实践
- Java Web服务性能优化实践(1)
- Java Web服务性能优化实践(2)
- Java Web 服务性能优化实践
- Java Web 服务性能优化实践
- Java Web 服务性能优化实践
- Web性能优化实践
- Web前端性能优化实践
- WEB站点性能优化实践
- Java Web性能优化
- Java Web性能优化
- web性能优化与最佳实践
- 提升 Java Web 服务性能
- ASPX页Web服务调用性能优化
- ASPX页Web服务调用性能优化
- ASPX页Web服务调用性能优化
- 【学习笔记】字符串编辑距离(字符串相似度)
- Java Web服务性能优化实践(1)
- java 正则表达式
- Java Web服务性能优化实践(2)
- 关于#include "stdafx.h"以及预编译头文件的问题
- Java Web服务性能优化实践(3)
- 编程之旅 - - - 记录自己的小白历程003
- 一个程序员的哲学思考(关于编程、关于人生)
- Time Machine 备份教程
- 使用Java测试网络连通性的几种方法
- 井筒
- A. Soft Drinking
- GIT 基础
- 秒杀多线程第六篇 经典线程同步 互斥量Mutex