2016-10-26 11 views
-1

Нажав на кнопку загрузки, вы выбираете PDF из местоположения SAN. Но иногда документ недоступен в SAN из-за причины XYZ. Мне нужно внедрить механизм опроса, чтобы щелчок по загрузке выполнял поиск документа в месте SAN через каждые 5 секунд в течение 5 раз, а также возвращал номер итерации. в журналах, когда поиск будет успешным.Java-опрос 5 раз за каждые 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 
      } 
     }   
    } 


} 
+2

Это хорошо - никаких проблем? –

+0

@ScaryWombat -I не знаю, как использовать механизм таймера/опроса. если вы можете помочь с кодом –

+0

Как насчет простой петли с 5-секундным сном –

ответ

1

Что вам нужно - это какой-то таймер. Ниже приведен пример использования TimerTasks.

Сначала Timer:

Timer downloadTimer = new Timer(); 

Он ничего не делает, пока вы не запланировать TimerTask:

TimerTask downloadTask = new TimerTask() { 
    @Override 
    public void run() { 
     //try to download here 
    }; 
} 

теперь вам нужно запланировать задачу:

downloadTimer.schedule(downloadTask,1000,5000); 

Это говорит downloadTimer, что вы хотите до scheduledownloadTask будет выполнен в первый раз за 1 секунду (1000 milliseconds), а затем каждые 5 секунд (5000 milliseconds).

Однако она будет работать непрерывно, если вы не остановить задачу, как только вы успешно загрузили или задание было выполнено 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 
}; 

Это должно сделать трюк, но я не могу сказать, что это лучший решение для вашей проблемы.

+0

Thnx @gamedroids, но может помочь вам объяснить, почему таймер здесь особенный , как упомянуто выше scarywombat, обыкновенная простая петля со сном делает то же самое. while (content! = null || counter <5) {content = policyDownloadInstance.getPolicy (policyNumber); counter ++; if (content == null) { log ----} Thread.sleep (5000); } –

+0

'Thread.sleep' может быть хорошим выбором. Это зависит от вашей ситуации, и если поток, который вы ставите для «сна», держится на любых ресурсах и тем самым блокирует их для других потоков. Возможно, [этот пост] (http://stackoverflow.com/q/17826651/896249) может пролить свет на него и помочь вам решить, что лучше. Вы также должны учитывать, если лучше всего повторить попытку «вызывающего» каждые 5 секунд или «сервлет». Просто имейте в виду, что вызывающий может столкнуться с таймаутом, когда сервлет слишком долго реагирует. – GameDroids

+0

Спасибо, я использовал сон, и он работал хорошо .. Как я могу добавить загрузчик ожидания в свой код до тех пор, пока нить не спит? –

0

сна Автор работал хорошо для меня

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; 
        } 
       } 
0

Вы также можете сделать это с помощью awaitility. Пожалуйста, проверьте this link о том, как использовать

 Смежные вопросы

  • Нет связанных вопросов^_^