2014-09-19 42 views
0

我寫,我想用來執行FTP任務(下載)的Tomcat 7的Servlet產生線程

我已經安裝在Tomcat中的Apache服務器FTPS和Java客戶端準備發起傳輸一個Web應用程序。

客戶端將被Servlet調用。

例如:

http://laptop:8080/MyServlet?action=download&from=desktop&file=C:/home/fred/file.xml 

會告訴我的筆記本實例從我桌面下載file.xml

編輯: 道歉,我從來沒有說得很清楚。

會有在這個過程的兩端的FTP服務器。 1在我的遠程筆記本電腦上,1在我的本地桌面上。所以簡而言之,我向遠程端的Servlet提交一個FTP'get'請求。然後Servlet啓動一個FTP進程來跨文件。

我的Servlet是全部設置爲接收GET參數和做的工作。

如果文件很大,那麼每個請求都需要很長時間才能完成。我希望儘快釋放Servlet資源。

理想情況下,我想下面的事情發生:

  1. 用戶發送URL到Servlet的
  2. Servlet來消化URL,並制定什麼文件,並從那裏等......
  3. Servlet來傳遞信息的線程
  4. Servlet來回來用「進行中」的消息
  5. 請求完成
  6. 線程仍在工作在後臺下載文件

此時我並不太在意有關線程成功知識的Servlet,我只是需要它踢一個而忘了它。對於任何問題,FTP進程將在別處進行單獨記錄。

我感興趣創建的Web應用程序線程池,並從那裏卻又獲取線程的概念,我發現所有的例子都老了,並不能真正滿足我的理解程度。

有StackOverflow上幾個類似的問題,這個是最類似於我要求的,但它只是暗示的東西ExecutorService的,我有沒有先驗知識。我如何在WebApp中設置它? What is recommended way for spawning threads from a servlet in Tomcat

有關信息, 我研究這一點,並找到對需要什麼好多說需要更好地瞭解比我現在有不完整的例子,或提示。 另外我讀過的很多例子都是幾年前的,沒有最近的。我希望可能有一個神奇的單線程來做我需要的所有東西(可疑),這是在去年左右發生的:) 我是新來的線程概念在Java中,我明白線程一般很欣賞你可以爲我提供任何幫助。

特雷弗

+0

您是否想要在標題中使用HTTP協議(您所描述的)或FTP協議(不同的協議和不同的端口)? – 2014-09-19 12:17:10

+0

你好嗶嘰, 我想用HTTP的請求端口8080上的Servlet,然後激發了一個FTP過程,下載端口21 – thonnor 2014-09-19 12:49:22

回答

0

我不知道我已經真正理解你想要的...

client          server 
send request (via HTTP) and wait for 
     HTTP response 
              analyse request and find file to send 
              ... (processing) 
              send HTTP response (1) with ? 
opens FTP connection (could not open it before) 
              receive FTP request (command connection) 
              send file (data connection) 
file is received and saved locally 

如果客戶端是一個瀏覽器,它應該是足夠的響應(1)請重定向到像ftp://host/path/to/file這樣的URL,因爲所有主流瀏覽器都知道FTP協議,並且能夠使用它來下載文件。

這個問題不在服務器端,你可以很容易地產生一個可以充當FTP客戶端或者(可能更難)作爲FTP服務器的線程,但是我無法想象比在客戶端重定向更好:客戶端有打開一個HTTP連接比不能被用於FTP transfert它必須打開該FTP請求一個新的連接。由於這是一個新的連接,你希望如何通過上一步啓動的線程來處理它?在FTP中沒有會話的概念,並且沒有簡單的方法來確定正確的請求。根據註釋

編輯:

好吧,我看來,你只想做延遲執行服務器上的處理請求完成後。您有兩種方法可以做到這一點:

  • 如您所建議的標籤,使用工作線程來完成這項工作。您的servlet是普通的Java,您可以像創建任何其他Java應用程序一樣創建線程。如果您有興趣稍後獲得處理結果,您可以將該會話的引用(或簡單地指向會話屬性)提供給可以提升其進展和/或完成狀態的線程。這需要更多的鍋爐代碼,但保證工作(下面的示例)
  • 您可以在servlet返回之前關閉HTTP連接。它不是明確地按照官方的servlet規範保證,但我發現它至少工作到Tomcat 7你會使用簡單的線程,並存儲狀態找到這個其他職位上更多的細節Servlet - close connection but not method

例會話:

public class ThreadedServlet extends HttpServlet { 

    @Override 
    protected void doGet(HttpServletRequest hsr, HttpServletResponse hsr1) throws ServletException, IOException { 
     String fileName = null; 
     // preliminary work ... 
     Worker worker = new Worker(fileName); 
     final HttpSession session = hsr.getSession(); 
     synchronized (session) { 
      List<Status> statuses = (List<Status>) session.getAttribute("statuses"); 
      if (statuses == null) { 
       statuses = new ArrayList<Status>(); 
      } 
      statuses.add(new Status(fileName)); 
     } 
     Thread thr = new Thread(worker); 
     thr.start(); 
     // write the response either directly or by forwarding to a JSP 
    } 

    public static class Status implements Serializable { 
     private String fileName; 
     private WStatus status; 

     public Status(String fileName) { 
      this.fileName = fileName; 
     } 

     public String getFileName() { 
      return fileName; 
     } 

     public void setFileName(String fileName) { 
      this.fileName = fileName; 
     } 

     public WStatus getStatus() { 
      return status; 
     } 

     public void setStatus(WStatus status) { 
      this.status = status; 
     } 
    } 

    public enum WStatus { 
     STARTED, 
     RUNNING, 
     COMPLETED 
    } 

    private static class Worker implements Runnable { 

     private String fileName; 
     private Status status; 

     public Worker(String fileName) { 
      this.fileName = fileName; 
     } 

     @Override 
     public void run() { 
      status.setStatus(WStatus.RUNNING); 
      // do your stuff ... 
      status.setStatus(WStatus.COMPLETED); 
     } 
    } 
} 
+0

認爲它在文件中的基本元素(忘記了一會兒FTP任務) 在使用瀏覽器本地客戶端... 我想連接到遠程的Servlet。 我想讓那個Servlet在遠程機器上產生一個線程來完成一些工作。 雖然這項工作正在進行中,但我希望Servlet使用200(或任意數量)報告,並且這是它的工作完成 Servlet可以完成這項工作,但我希望它傳遞給工作線程,以便應用程序不掛。 – thonnor 2014-09-19 13:27:29

+0

我已經對現在的主要問題進行了編輯,解釋將會有兩端運行的FTP進程(客戶端和服務器)。 要求servlet從本地客戶端下載/獲取文件。在這個應用程序中沒有文件的推送。道歉。 – thonnor 2014-09-19 13:37:10