传输参数【JAX-WS入门系列】第06章_使用MTOM处理二进制文件
生活随笔
收集整理的這篇文章主要介紹了
传输参数【JAX-WS入门系列】第06章_使用MTOM处理二进制文件
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
最近應用開發的過程中出現了一個小問題,順便記錄一下原因和方法--傳輸參數
????首先示例服務端代碼
????
????
????上面這個SEI,是以byte[]為參數的服務端接口類BinaryService.java
package com.jadyer.service;import javax.jws.WebParam; import javax.jws.WebService;@WebService(targetNamespace="http://blog.csdn.net/jadyer") public interface BinaryService {public void upload(@WebParam(name="uploadFile")byte[] file); }????上面這個SEI,是以DataHandler為參數的服務端接口類BinaryHandlerService.java
package com.jadyer.service;import javax.activation.DataHandler; import javax.jws.WebParam; import javax.jws.WebService; import javax.xml.bind.annotation.XmlMimeType;@WebService(targetNamespace="http://blog.csdn.net/jadyerHandler") public interface BinaryHandlerService {public void uploadUseHandler(@WebParam(name="uploadFile")@XmlMimeType("application/octet-stream")DataHandler file); }????接下來分別是兩個SEI對應的SIB
package com.jadyer.service;import java.io.File; import java.io.IOException;import javax.jws.WebService; import javax.xml.ws.soap.MTOM;import org.apache.commons.io.FileUtils;@WebService(endpointInterface="com.jadyer.service.BinaryService", targetNamespace="http://blog.csdn.net/jadyer") @MTOM public class BinaryServiceImpl implements BinaryService {@Overridepublic void upload(byte[] file) {try {//FileUtils類引用自commons-io-2.4.jarFileUtils.writeByteArrayToFile(new File("D:/test.jpg"), file);} catch (IOException e) {e.printStackTrace();}} } package com.jadyer.service;import java.io.File; import java.io.IOException;import javax.activation.DataHandler; import javax.jws.WebService; import javax.xml.ws.BindingType; import javax.xml.ws.soap.SOAPBinding;import org.apache.commons.io.FileUtils;@WebService(endpointInterface="com.jadyer.service.BinaryHandlerService",targetNamespace="http://blog.csdn.net/jadyerHandler") @BindingType(SOAPBinding.SOAP11HTTP_MTOM_BINDING) public class BinaryHandlerServiceImpl implements BinaryHandlerService {@Overridepublic void uploadUseHandler(DataHandler file) {try {//FileUtils類引用自commons-io-2.4.jarFileUtils.copyInputStreamToFile(file.getDataSource().getInputStream(), new File("D:/test2.jpg"));} catch (IOException e) {e.printStackTrace();}} }????最后是發布服務的ServerApp.java
每日一道理成熟是一種明亮而不刺眼的光輝,一種圓潤而不膩耳的音響,一種不需要對別人察顏觀色的從容,一種終于停止了向周圍申訴求告的大氣,一種不理會哄鬧的微笑,一種洗刷了偏激的淡漠,一種無須聲張的厚實,一種并不陡峭的高度。
package com.jadyer.server;import javax.xml.ws.Endpoint;import com.jadyer.service.BinaryHandlerService; import com.jadyer.service.BinaryHandlerServiceImpl; import com.jadyer.service.BinaryServiceImpl;/*** 應用MTOM處理二進制文件* @see ---------------------------------------------------------------------------------------------------* @see 比擬傳統做法是:服務端頒布的方法參數為byte[],客戶端調用時直接傳進去一個文件的byte[]便可* @see 此時應用TcpMon監聽報文會發現,字節數組在傳送的過程中,都是在SOAPBody里頭傳送的,而且是一次性全部傳送* @see 那么問題就來了:如果傳送的文件比擬大,就有可能形成內存溢出* @see 對此,有一種解決方案是應用MTOM機制傳輸文件* @see ---------------------------------------------------------------------------------------------------* @see MTOM(Message Transmission Optimization Mechanism),翻譯過來就是消息優化傳輸機制* @see 應用了MTOM后,我們再應用tcpmon監聽報文會發現,文件傳輸是通過附件(以流的形式)傳送的,而不是通過SOAPBody* @see 這里有須要提一下:當應用Apache的TcpMon監聽MTOM時,由于JAXWS版本問題,可能會呈文上面的異常* @see javax.xml.ws.WebServiceException: java.io.IOException: Error writing to server* @see 這時,我們可以應用GoogleCode上的tcpmon或者Eclipse提供的TCP/IP Monitor* @see 有關三者的描述,可參考我的博客http://blog.csdn.net/jadyer/article/details/8967447* @see 好了,回歸正題.關于MTOM,有兩種實現方式,分別為傳輸byte[]和傳輸javax.activation.DataHandler* @see ---------------------------------------------------------------------------------------------------* @see MTOM實現之傳輸byte[]* @see 1)SEI中定義開放服務的方法參數為byte[]* @see 2)應用@MTOM注解SIB,表現打開MTOM傳輸功能* @see 3)客戶端調用時,為getServicePort()方法傳入new MTOMFeature()參數,表現啟用MTOM傳輸* @see 如new BinaryServiceImplService().getBinaryServiceImplPort(new MTOMFeature()).upload(....)* @see ---------------------------------------------------------------------------------------------------* @see MTOM實現之傳輸javax.activation.DataHandler* @see 1)SEI中定義開放服務的方法參數為DataHandler,并為該參數增長注解@XmlMimeType("application/octet-stream")* @see 2)應用@BindingType(SOAPBinding.SOAP11HTTP_MTOM_BINDING)注解SIB* @see 3)客戶端調用時應用(SOAPBinding)((BindingProvider)service).setMTOMEnabled(true)啟用MTOM傳輸* @see BinaryHandlerService service = new BinaryHandlerServiceImplService().getBinaryHandlerServiceImplPort()* @see BindingProvider bp = (BindingProvider)service* @see SOAPBinding binding = (SOAPBinding)bp.getBinding()* @see binding.setMTOMEnabled(true)* @see service.uploadUseHandler(new DataHandler(new FileDataSource(new File("D:/玄玉.png"))));* @see ---------------------------------------------------------------------------------------------------* @see MTOM總結* @see 其實在應用DataHandler時,第二步和第三步都可以應用<code>MTOM實現之傳輸byte[]</code>的第二,三步編寫方式* @see 即應用@MTOM和new MTOMFeature()來打開MTOM傳輸并啟用之,也就是說這兩種方式的區分就在于開放服務的方法參數不同* @see 一個是upload(byte[] file),一個是upload(@XmlMimeType("application/octet-stream")DataHandler file)* @see ---------------------------------------------------------------------------------------------------* @create May 26, 2013 12:15:53 AM* @author 玄玉<http://blog.csdn.net/jadyer>*/ public class ServerApp {public static void main(String[] args) {Endpoint.publish("http://127.0.0.1:8086/upload", new BinaryServiceImpl());Endpoint.publish("http://127.0.0.1:8086/uploadHandler", new BinaryHandlerServiceImpl());} }
????OK,服務端代碼示例完畢,上面是客戶端代碼
????
????
????客戶端只有一個演示調用服務的類ClientApp.java
????注意:具體客戶端代碼是由wsimport生成的,詳見http://blog.csdn.net/jadyer/article/details/8692108
package com.jadyer.client;import java.io.File; import java.io.IOException; import java.net.URL;import javax.activation.DataHandler; import javax.activation.FileDataSource; import javax.xml.namespace.QName; import javax.xml.ws.BindingProvider; import javax.xml.ws.soap.SOAPBinding;import net.csdn.blog.jadyerhandler.BinaryHandlerService; import net.csdn.blog.jadyerhandler.BinaryHandlerServiceImplService;/*** wsimport -d D:/Download/ -keep -verbose http://127.0.0.1:8086/upload?wsdl* @create May 26, 2013 1:47:40 AM* @author 玄玉<http://blog.csdn.net/jadyer>*/ public class ClientApp {public static void main(String[] args) throws IOException { // URL url = new URL("http://127.0.0.1:8086/upload?wsdl"); // QName qname = new QName("http://blog.csdn.net/jadyer", "BinaryServiceImplService"); // byte[] uploadFile = FileUtils.readFileToByteArray(new File("D:/玄玉.png")); // //普通的傳文件 // new BinaryServiceImplService(url, qname).getBinaryServiceImplPort().upload(uploadFile); // //MTOM方式 // new BinaryServiceImplService(url, qname).getBinaryServiceImplPort(new MTOMFeature()).upload(uploadFile);URL urlHandler = new URL("http://127.0.0.1:8086/uploadHandler?wsdl");QName qnameHandler = new QName("http://blog.csdn.net/jadyerHandler", "BinaryHandlerServiceImplService");BinaryHandlerService service = new BinaryHandlerServiceImplService(urlHandler, qnameHandler).getBinaryHandlerServiceImplPort();BindingProvider bp = (BindingProvider)service;SOAPBinding binding = (SOAPBinding)bp.getBinding();binding.setMTOMEnabled(true);service.uploadUseHandler(new DataHandler(new FileDataSource(new File("D:/玄玉.png"))));} }文章結束給大家分享下程序員的一些笑話語錄: 看到有人回帖“不頂不是中國人”,他的本意是想讓帖子沉了。
--------------------------------- 原創文章 By
傳輸和參數
---------------------------------
總結
以上是生活随笔為你收集整理的传输参数【JAX-WS入门系列】第06章_使用MTOM处理二进制文件的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: javascript:可以运行的噪音
- 下一篇: 查找域名、由名字查找某个熟知的端口、由名