Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/313.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从java类调用DoGetServlet方法_Java_Web Applications_Servlets_Httpurlconnection_Urlconnection - Fatal编程技术网

从java类调用DoGetServlet方法

从java类调用DoGetServlet方法,java,web-applications,servlets,httpurlconnection,urlconnection,Java,Web Applications,Servlets,Httpurlconnection,Urlconnection,我有一个计划的作业类,实现了Quartz作业类,我想从中调用一个Servlet类来更新DB表中的标志,然后它将电子邮件发送到适当的电子邮件列表 我得到一个java.net.ConnectException。尽管servlet是通过在浏览器中输入URL或通过JSP页面中的JavaScript正确调用的 我的Java类如下所示: public class ExpirationJob implements Job { org.apache.log4j.Logger log = org.apac

我有一个计划的作业类,实现了Quartz作业类,我想从中调用一个Servlet类来更新DB表中的标志,然后它将电子邮件发送到适当的电子邮件列表

我得到一个
java.net.ConnectException
。尽管servlet是通过在浏览器中输入URL或通过JSP页面中的JavaScript正确调用的

我的Java类如下所示:

public class ExpirationJob implements Job {
    org.apache.log4j.Logger log = org.apache.log4j.Logger.getLogger("ExpirationJob.class");

    public void execute(JobExecutionContext context)
            throws JobExecutionException {
        try {
            URL serv = new URL("http://localhost:8080/app/emailExpirationServlet");
            URLConnection sr = serv.openConnection();
            sr.connect();
            InputStream is = sr.getInputStream();
            InputStreamReader isr = new InputStreamReader(is);
            BufferedReader in = new BufferedReader(isr);

            String inputLine;
            int i =0;
            while ((inputLine = in.readLine()) != null)
                i = i +1;
            log.debug("Input line: " + inputLine);
            in.close();
        } catch (MalformedURLException e) {
            log.debug("Error while calling the emailExpirationServlet -- MalformedURLException: "+ e.getMessage());
            e.printStackTrace();
        } catch (IOException e) {
            log.debug("Error while calling the emailExpirationServlet -- IOException: "+ e.getMessage());
            e.printStackTrace();
        }
    }
}
我的servlet代码是:

public class emailExpireServlet extends HttpServlet {
    private static final String CONTENT_TYPE = "text/html; charset=UTF-8";
    org.apache.log4j.Logger log = org.apache.log4j.Logger.getLogger("emailExpireServlet.class");

    public void init(ServletConfig config) throws ServletException {
        super.init(config);
        log.debug("Initializing emailExpireServlet");
    }

    public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        request.setCharacterEncoding("UTF-8");
        response.setContentType("text/html;charset=UTF-8");
        response.setDateHeader("Expires", 0);
        response.setHeader("Cache-Control", "no-cache");
        log.debug("Starting emailExpireServlet");

        //do some business logic here - I have commented it out to rule out any other blocking issue
        response.setStatus(200);
        response.getOutputStream().print("Invoked emailExpireServlet! Status is OK");

    }

    public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request, response);
    }
}
我得到的例外是:

java.net.ConnectException: Connection refused: connect
    at java.net.PlainSocketImpl.socketConnect(Native Method)
    at java.net.PlainSocketImpl.doConnect(PlainSocketImpl.java:333)
    at java.net.PlainSocketImpl.connectToAddress(PlainSocketImpl.java:195)
    at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:182)
    at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:366)
    at java.net.Socket.connect(Socket.java:525)
    at java.net.Socket.connect(Socket.java:475)
    at sun.net.NetworkClient.doConnect(NetworkClient.java:163)
    at sun.net.www.http.HttpClient.openServer(HttpClient.java:394)
    at sun.net.www.http.HttpClient.openServer(HttpClient.java:529)
    at sun.net.www.http.HttpClient.<init>(HttpClient.java:233)
    at sun.net.www.http.HttpClient.New(HttpClient.java:306)
    at sun.net.www.http.HttpClient.New(HttpClient.java:323)
    at sun.net.www.protocol.http.HttpURLConnection.getNewHttpClient(HttpURLConnection.java:860)
    at sun.net.www.protocol.http.HttpURLConnection.plainConnect(HttpURLConnection.java:801)
    at sun.net.www.protocol.http.HttpURLConnection.connect(HttpURLConnection.java:726)
    at schedulers.ExpirationJob.execute(Unknown Source)
    at org.quartz.core.JobRunShell.run(JobRunShell.java:213)
    at org.quartz.simpl.SimpleThreadPool$WorkerThread.run(SimpleThreadPool.java:557)

您应该重构代码,将此功能移出servlet,并放入一个公共类中,该类可以从servlet和计划作业访问。

URLConnection
打开指向URL引用的资源的通信链接(如果尚未建立此类连接)。
URL.openConnection()
返回一个
URLConnection
对象,该对象表示与URL引用的远程对象的连接。
每次通过调用此URL的协议处理程序的
openConnection
方法打开一个新连接。

只需检查一下:执行quartz作业的应用程序与tomcat服务器在同一台机器上运行,对吗?在浏览器中打开URL,会出现什么?另外,您不应将GET用于非幂等操作。请关闭防火墙并绑定到inet地址。@JB是的,它在同一台计算机上。这是我的下一步。实际上,这个servlet是遗留代码,它过去是从jsp/javascript调用的。但我还是忍不住想知道出了什么问题。这似乎是一种常见的做法,我不知道为什么我不能让它正常工作。这是一种连接故障。我们帮不了你;您的代码使用了错误的IP地址或端口。我目前正在本地主机8080(或使用IP)上对此进行测试。在这方面会出什么问题呢?重构确实按照预期工作。我在servlet调用中遇到的问题似乎是一个奇怪的连接问题。谢谢大家的回答。使用/EmailExpirationServlet谢谢回复。我将url改为,再次出现相同的异常。删除此
sr.connect()我删除了它,当我试图获取输入流中连接的响应“InputStream is=sr.getInputStream();”我想这可能是windows 7中的套接字/端口。。。
<servlet>
    <servlet-name>emailExpireServlet</servlet-name>
    <servlet-class>emailExpireServlet</servlet-class>
</servlet>
...
<servlet-mapping>
    <servlet-name>emailExpireServlet</servlet-name>
    <url-pattern>/emailExpireServlet</url-pattern>
</servlet-mapping>