URLDataSource請求資源三次的問題

這個是進公司的第二個任務,由於是多個應用服務器集羣,而產生pdf報表和發送郵件是通過JMS的異步方式,因此可能是服務器A產生PDF文件,而服務器B發送郵件,原來的實現是通過FileDataSource從本機取,因此有時候就不能成功發送郵件,後來修改爲使用URLDataSource從自己寫的一個Servlet取,但是很奇怪的是對於每個資源都會被請求三次,上網找了下,有個人也遇到同樣的問題,但是他最後的解決方案不行,最後看了下URLDataSource的源代碼(有興趣的可以自己看看,注意getContentType和getInputStream的實現,每次都會開始一個新的請求),然後把URLDataSource重命名爲自己的類試了下,發現getContentType方法會被調用兩次,getInputStream方法被調用一次,對類稍稍做了修改,就是getContentType直接返回application/octet-stream類型,不真正請求服務器,問題解決,連帶着昨天不能刪除文件的問題也解決了,因爲這樣程序運行比較順利,文件指針沒有被佔用,刪除總是比較成功。
修改後的源代碼:

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.UnsupportedEncodingException;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;

import javax.activation.DataSource;

public class MyURLDataSource implements DataSource {
    private final static String DEFAULT_CONTENT_TYPE = "application/octet-stream";

    private URL url;

    public MyURLDataSource(URL url) throws MalformedURLException,
            UnsupportedEncodingException {
        this.url = url;
    }

    public String getContentType() {
        return DEFAULT_CONTENT_TYPE;
    }

    public InputStream getInputStream() throws IOException {
        return url.openStream();
    }

    public String getName() {
        return url.getFile();
    }

    public OutputStream getOutputStream() throws IOException {
        URLConnection connection = url.openConnection();
        connection.setDoOutput(true);
        return connection.getOutputStream();
    }

}

最後需要注意的是,getInputStream被調用兩次:

javax.mail.internet.MimeUtility.getEncoding(MimeUtility.java:177) javax.activation.DataHandler.writeTo(DataHandler.java:304)

分別是保存郵件和發送郵件的時候。


作者:
解惑/Cherami
原載: URLDataSource請求資源三次的問題
版權所有。轉載時必須以鏈接形式註明作者和原始出處及本聲明。
分類: Java
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章