首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> J2EE

Apache CXF 實戰 (五):啟用 GZIP 壓縮傳輸 Web Service 大數據

     編輯:J2EE

應用場景

Web Service 傳輸大型資料物件 (如報表、文檔、圖片 Base64) 或在低頻寬網路環境下調用,啟用資料流壓縮可顯著減小封包體積、提升傳輸效能。CXF 內建 GZIP 攔截器支援雙向壓縮/解壓。

完整範例

1. 大數據模型類

package com.googlecode.garbagecan.cxfstudy.compress;

public class BigData {
    private String name;
    private String data; // 模擬大字串

    public BigData() {}
    public BigData(String name, int size) {
        this.name = name;
        StringBuilder sb = new StringBuilder(size);
        for (int i = 0; i < size; i++) sb.append('0');
        this.data = sb.toString();
    }
    // getter/setter 略
}

2. Web Service 介面


@WebService
public interface BigDataService {
    @WebMethod
    @WebResult
    BigData getBigData(@WebParam String name, @WebParam int size);
}

3. 實現類


public class BigDataServiceImpl implements BigDataService {
    public BigData getBigData(String name, int size) {
        return new BigData(name, size);
    }
}

4. JUnit 整合測試 (關鍵:註冊 GZIP 攔截器)


public class BigDataServiceTest {
    private static final String ADDRESS = "https://localhost:9000/ws/compress/bigDataService";

    @BeforeClass
    public static void setUpBeforeClass() {
        JaxWsServerFactoryBean factory = new JaxWsServerFactoryBean();
        factory.getInInterceptors().add(new LoggingInInterceptor());
        factory.getOutInterceptors().add(new LoggingOutInterceptor());
        // 伺服端:解壓請求、壓縮回應
        factory.getInInterceptors().add(new GZIPInInterceptor());
        factory.getOutInterceptors().add(new GZIPOutInterceptor());

        factory.setServiceClass(BigDataServiceImpl.class);
        factory.setAddress(ADDRESS);
        factory.create();
    }

    @Test
    public void testGetBigData() {
        JaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean();
        factory.setAddress(ADDRESS);
        factory.setServiceClass(BigDataService.class);
        Object proxy = factory.create();

        Client client = ClientProxy.getClient(proxy);
        Endpoint endpoint = client.getEndpoint();
        // 客戶端:壓縮請求、解壓回應
        endpoint.getInInterceptors().add(new GZIPInInterceptor());
        endpoint.getOutInterceptors().add(new GZIPOutInterceptor());

        BigDataService service = (BigDataService) proxy;
        String name = "my big data";
        int size = 10 * 1024 * 1024; // 10 MB 字串

        long start = System.currentTimeMillis();
        BigData result = service.getBigData(name, size);
        long elapsed = System.currentTimeMillis() - start;

        assertNotNull(result);
        assertEquals(name, result.getName());
        assertEquals(size, result.getData().length());
        System.out.println("Transfer 10MB took " + elapsed + " ms");
    }
}

關鍵點

  • GZIPInInterceptor:自動解壓帶有 Content-Encoding: gzip 的輸入流。
  • GZIPOutInterceptor:自動壓縮輸出流並加上 Content-Encoding: gzip 標頭。
  • 伺服端與客戶端雙方都必須註冊對應攔截器,否則協議不匹配。
  • 日誌攔截器 (LoggingIn/OutInterceptor) 可觀察壓縮前後報文大小差異。
  • 大物件建議搭配 MTOM/XOP (附件流式傳輸) 進一步優化記憶體佔用。

系列文章

  1. CXF 實戰之一:Hello World Web Service
  2. CXF 實戰之二:整合 Spring 與 Web 容器
  3. CXF 實戰之三:傳輸 Java 物件
  4. CXF 實戰之四:構建 RESTful Web Service
  5. CXF 實戰之五:壓縮 Web Service 數據 (本文)

啟用 GZIP 壓縮僅需幾行攔截器配置,即可大幅降低大數據 Web Service 的頻寬與延遲成本。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved