這個是進公司的第二個任務,由於是多個應用服務器集羣,而產生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 String getContentType() {
return DEFAULT_CONTENT_TYPE;
}
public InputStream getInputStream() throws IOException {
return url.openStream();
}
public String getName() {
return url.getFile();
}
作者: 解惑/Cherami
原載: URLDataSource請求資源三次的問題
版權所有。轉載時必須以鏈接形式註明作者和原始出處及本聲明。
分類: Java