Java每5秒轮询5次

Java每5秒轮询5次,java,arrays,timer,polling,Java,Arrays,Timer,Polling,单击下载按钮从SAN位置获取PDF。但有时由于XYZ原因,文档在SAN上不可用。我需要实现一种轮询机制,以便每5秒在SAN位置单击下载搜索文档5次,并在搜索成功时在日志中返回迭代编号 package abc.documentdownload; import abc.util.Email; import java.io.BufferedOutputStream; import java.io.IOException; import java.io.PrintWriter; import ja

单击下载按钮从SAN位置获取PDF。但有时由于XYZ原因,文档在SAN上不可用。我需要实现一种轮询机制,以便每5秒在SAN位置单击下载搜索文档5次,并在搜索成功时在日志中返回迭代编号

package abc.documentdownload;

import abc.util.Email;

import java.io.BufferedOutputStream;
import java.io.IOException;

import java.io.PrintWriter;
import java.io.StringWriter;
import java.io.Writer;

import javax.servlet.*;
import javax.servlet.http.*;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

public class DownloadDocServlet extends HttpServlet {
    private static final Log log = LogFactory.getLog(DownloadDocServlet.class);
    private static final String CONTENT_TYPE = "text/html; charset=windows-1252";

    public void init(ServletConfig config) throws ServletException {
        super.init(config);
    }

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

    public void doPost(HttpServletRequest request,
                       HttpServletResponse response) throws ServletException,
                                                            IOException {
        response.setContentType(CONTENT_TYPE);
        DownloadDocDAO DownloadInstance = new DownloadDocDAO();
        String downloadType = request.getParameter("downloadType");
        String pNumber = request.getParameter("PNumber");
        BufferedOutputStream output = null;
        String strFileName = pNumber + ".pdf";
        if(downloadType != null && downloadType.equalsIgnoreCase("download")){
            try{
                byte[] content=DownloadInstance.getP(pNumber);                
                log.info("COnverting content into PDF in EmailServlet");
                System.out.println("COnverting content into PDF in EmailServlet");
                response.setContentType("application/pdf");
                response.setHeader("Content-Disposition","attachment; filename=\"" + strFileName + "\"");
                response.setHeader("Cache-Control","no-cache"); 
                response.setHeader("Cache-Control","no-store"); 
                response.setHeader("Pragma","no-cache");
                response.setDateHeader("Expires", 0);
                output = new BufferedOutputStream(response.getOutputStream());
                output.write(content);
                output.flush();                            
                output.close();                

            }
            catch (Exception ex) {
                ex.printStackTrace();
                log.error("Error in DownloadDocServlet ", ex);
                /* Using the below block to trigger the email whenever there is a error*/
                Writer result = new StringWriter();
                PrintWriter printWriter = new PrintWriter(result);
                ex.printStackTrace(printWriter);
                Email emailSend = new Email();                                  
                int strEmailConfirm = emailSend.sendEmail("Exception in DownloadDocServlet of documentdownload package for pno :"+pNumber,"<B>Please find Exception Details for the DownloadDocServlet of documentdownload package</b><br><br>"+result.toString());
                log.info("strEmailConfirm in DownloadDocServlet"+strEmailConfirm); // if value is 1 ,  mail will be trigger is successful 
            } 
        }        
    }


}
包abc.documentdownload;
导入abc.util.Email;
导入java.io.BufferedOutputStream;
导入java.io.IOException;
导入java.io.PrintWriter;
导入java.io.StringWriter;
导入java.io.Writer;
导入javax.servlet.*;
导入javax.servlet.http.*;
导入org.apache.commons.logging.Log;
导入org.apache.commons.logging.LogFactory;
公共类DownloadDocServlet扩展了HttpServlet{
私有静态最终日志Log=LogFactory.getLog(DownloadDocServlet.class);
私有静态最终字符串内容\u TYPE=“text/html;charset=windows-1252”;
public void init(ServletConfig config)抛出ServletException{
super.init(config);
}
公共无效数据集(HttpServletRequest请求,
HttpServletResponse响应)抛出ServletException,
IOException{
doPost(请求、响应);
}
public void doPost(HttpServletRequest请求,
HttpServletResponse响应)抛出ServletException,
IOException{
response.setContentType(内容类型);
DownloadDocDAO DownloadInstance=新的DownloadDocDAO();
String downloadType=request.getParameter(“downloadType”);
字符串pNumber=request.getParameter(“pNumber”);
BufferedOutputStream输出=null;
字符串strFileName=pNumber+“.pdf”;
if(downloadType!=null&&downloadType.equalsIgnoreCase(“下载”)){
试一试{
byte[]content=DownloadInstance.getP(pNumber);
info(“在EmailServlet中将内容转换为PDF”);
System.out.println(“在EmailServlet中将内容转换为PDF”);
response.setContentType(“application/pdf”);
response.setHeader(“内容处置”、“附件;文件名=\”+strFileName+“\”);
setHeader(“缓存控制”、“无缓存”);
setHeader(“缓存控制”,“无存储”);
setHeader(“Pragma”,“无缓存”);
response.setDateHeader(“Expires”,0);
输出=新的BufferedOutputStream(response.getOutputStream());
输出。写入(内容);
output.flush();
output.close();
}
捕获(例外情况除外){
例如printStackTrace();
log.error(“DownloadDocServlet中的错误”,ex);
/*每当出现错误时,使用下面的块触发电子邮件*/
编写器结果=新建StringWriter();
PrintWriter PrintWriter=新的PrintWriter(结果);
例如printStackTrace(printWriter);
Email emailSend=新电子邮件();
int strEmailConfirm=emailSend.sendEmail(“针对pno的documentdownload软件包的DownloadDocServlet中的异常:“+pNumber”,请查找documentdownload软件包的DownloadDocServlet的异常详细信息”

“+result.toString()); log.info(“DownloadDocServlet中的strEmailConfirm”+strEmailConfirm);//如果值为1,则成功触发邮件 } } } }
您需要的是某种计时器。下面是一个关于如何使用
TimerTasks
的示例

首先是
计时器

Timer downloadTimer = new Timer();
在您计划一个
TimerTask
之前,它不会执行任何操作:

TimerTask downloadTask = new TimerTask() {
    @Override
    public void run() {
       //try to download here
    };
}
现在您需要安排任务:

downloadTimer.schedule(downloadTask,1000,5000); 
这会告诉您的
下载计时器
,您希望
计划
下载任务
在1秒(
1000毫秒
)内第一次执行,然后每5秒(
5000毫秒
)执行一次

但是,除非您在成功下载或任务执行5次后停止任务,否则它将持续运行:

private int count;
public void run() {
   if(count++==5){
       downloadTimer.cancel();  // will stop the timer
       downloadTimer.purge();   // will remove all canceled tasks from the timer
       return;   // makes sure the task will not be executed to the end
   }
   // try to download here
   // if download successful cancel and purge as well
};

这应该可以解决问题,但我不能说这是否是解决您问题的最佳方案

你需要的是某种计时器。下面是一个关于如何使用
TimerTasks
的示例

首先是
计时器

Timer downloadTimer = new Timer();
在您计划一个
TimerTask
之前,它不会执行任何操作:

TimerTask downloadTask = new TimerTask() {
    @Override
    public void run() {
       //try to download here
    };
}
现在您需要安排任务:

downloadTimer.schedule(downloadTask,1000,5000); 
这会告诉您的
下载计时器
,您希望
计划
下载任务
在1秒(
1000毫秒
)内第一次执行,然后每5秒(
5000毫秒
)执行一次

但是,除非您在成功下载或任务执行5次后停止任务,否则它将持续运行:

private int count;
public void run() {
   if(count++==5){
       downloadTimer.cancel();  // will stop the timer
       downloadTimer.purge();   // will remove all canceled tasks from the timer
       return;   // makes sure the task will not be executed to the end
   }
   // try to download here
   // if download successful cancel and purge as well
};

这应该可以解决问题,但我不能说这是否是解决您问题的最佳方案

线程睡眠对我很有效

 for(int i=0;i<5;i++)
                 {
                     content=getPDAO.getPFromEb( strPN);
                      DateFormat df = new SimpleDateFormat("dd/MM/yy HH:mm:ss");
                      Date dateobj = new Date();
                    if(content==null) 

                     {  
                        Thread.sleep(5000);
                        }
                    else {
                        content=getPDAO.getPFromEb( strPN);
                        break;
                    }
                 } 

for(inti=0;i线程睡眠对我来说很好

 for(int i=0;i<5;i++)
                 {
                     content=getPDAO.getPFromEb( strPN);
                      DateFormat df = new SimpleDateFormat("dd/MM/yy HH:mm:ss");
                      Date dateobj = new Date();
                    if(content==null) 

                     {  
                        Thread.sleep(5000);
                        }
                    else {
                        content=getPDAO.getPFromEb( strPN);
                        break;
                    }
                 } 

用于(int i=0;i你也可以通过使用
等待性来实现这一点。请检查如何使用
等待性
,你也可以通过使用
等待性来实现这一点。请检查如何使用
等待性
。这很好-有问题吗?@ScaryWombat-我不知道如何使用计时器/轮询机制。如果你能帮助代码,用五秒钟sleep@ScaryWombat我很害怕,一个简单的循环加上睡眠就可以了。这很好-有问题吗?@ScaryWombat-我不知道如何使用定时器/轮询机制。如果你能帮我编写代码,一个5秒钟的简单循环怎么样sleep@ScaryWombat我很害怕,一个简单的睡眠循环就可以完成游戏机器人的任务,但是你能帮我吗pl