`
cherami
  • 浏览: 212293 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

URLDataSource请求资源三次的问题

    博客分类:
  • Java
阅读更多

这个是进公司的第二个任务,由于是多个应用服务器集群,而产生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
分享到:
评论

相关推荐

    solr_exploit:Apache Solr远程代码执行突破(CVE-2019-0193)漏洞利用

    声明 此处提供的漏洞检测方法,文件等内容,均仅限于安全从业者在获得法律授权的情况下使用,目的是检测已授权的服务器的安全性。...文档中只有一个item元素骑士实现只执行1次命令 也可以自己启动网络服务器托

    关于JavaMail的两个关键jar

    开发者可以自定义`DataSource`实现,或者直接使用`FileDataSource`处理本地文件,或者使用`URLDataSource`处理网络资源。一旦有了`DataSource`,就可以通过`Message`的`addAttachment`方法将其附加到邮件中。 在...

    Solr data import 中XMLHTTP 数据源的使用.docx

    然而,从1.4版本开始,推荐使用`URLDataSource`。以下是一个配置示例: ```xml baseUrl="http://host:port/" encoding="UTF-8" connectionTimeout="5000" readTimeout="10000"/> <!-- 或者在Solr 1.4及以后的...

    java mail activtion

    它可以与不同的`DataSource`一起工作,如`FileDataSource`、`URLDataSource`等,以读取和写入数据。 2. **MIME类型**: JAF使用MIME(多用途互联网邮件扩展)类型来标识数据的类型,如文本、图像、音频等。`MimeType...

    Java邮件开发Fundamentals of the JavaMail API

    Fundamentals of the JavaMail API Presented by developerWorks, your source for great tutorials ... Table of Contents If you're viewing this document online, you can click any of the topics below ...

Global site tag (gtag.js) - Google Analytics