2013-12-15 64 views
0

我的GWT項目出現了一些問題。GWT項目在部署時不從RPC加載數據

我有一個類A(客戶端)與列表對象L1。當單擊A中的按鈕時,將在服務器端讀取文件,並通過RPC返回列表,然後將該列表存儲在L1中,然後顯示在表格中。這一切都可以很好地離線。但是,如果我部署應用程序它似乎不工作。最奇怪的是:1個文件正在工作,我可以在表中顯示它的數據(最小的文件)。如果我按下另一個按鈕(並因此讀取服務器端的其他文件),桌面上不會顯示任何內容。它似乎在A上讀取並存儲在L1上,但我對此不太確定。 在日誌文件上我沒有收到錯誤或警告,所以我不明白爲什麼它不起作用。也許它運行得不夠快或什麼?

我從日誌中獲得的唯一信息(只有信息而不是警告/錯誤):「此請求導致您的應用程序啓動一個新進程,從而導致您的應用程序代碼首次加載。因此,這個請求可能需要更長的時間,並且比您的應用程序的典型請求使用更多的CPU。「它出現在隨機點擊按鈕(否則根本沒有任何信息...只是一個日誌,它被推送)和信息等待時間真的很高(3-7k毫秒),但在罰款沒有信息的人。它給我的例子不存在。

這是該方法被稱爲類(不是滿級):

public class DatasetMenu{ 
    private DataImportServiceClientImpl importer; 
    public void historyChangeState(String Abstimmung){ 
     importer.readInput(Abstimmung); 
    } 

這是客戶方代碼:

public class DataImportServiceClientImpl{ 
    private DataImportServiceAsync service; 
    public DatasetMenu menu; 
    public DataImportServiceClientImpl(String url){ 
     this.service = GWT.create(DataImportService.class); 
     ServiceDefTarget endpoint = (ServiceDefTarget) this.service; 
     endpoint.setServiceEntryPoint(url); 

     this.menu=new DatasetMenu(this); 
    } 
    public void readInput(String Abstimmung){ 
     this.service.readInput(Abstimmung, new DefaultCallback()); 
    } 
    private class DefaultCallback implements AsyncCallback { 

     @Override 
     public void onFailure(Throwable caught) { 
      System.out.println("An Error has occured!"); 
     } 

     @Override 
     public void onSuccess(Object result) { 
      if(result instanceof List<?>){ 
      List<List<Raumeinheit>> temp = (List<List<Raumeinheit>>) result; 
      menu.setData(temp); 
      } 
     } 

    } 

} 

這是在服務器端的代碼:

public class DataImportServiceImpl extends RemoteServiceServlet implements DataImportService{ 

    @Override 
    public List<List<Raumeinheit>> readInput(String Abstimmung){ 
     List<String> fileList=new ArrayList<String>(); 
     fileList.add("files/" + Abstimmung + ".b.csv"); 
     fileList.add("files/" + Abstimmung + ".k.csv"); 
     System.out.println(fileList.get(0)); 
     List<List <String[]> > total2 = new ArrayList<List <String[]> >(); 
     String[] values; 
     for(int i =0;i<fileList.size();i++){ 
     List<String[]> total = new ArrayList<String[]>(); 
     File file = new File(fileList.get(i)); 
     try{ 
      Scanner inputStream = new Scanner(file); 
      while(inputStream.hasNext()){ 
       String data = inputStream.nextLine(); 
       values = data.split(";"); 
       total.add(values); 
      } 
      inputStream.close(); 
     }catch(FileNotFoundException e){ 
      e.printStackTrace(); 
     } 
     total2.add(total); 
     } 
     List< List<Raumeinheit> > result = new ArrayList<List<Raumeinheit>>(); 
     for(int i = 0;i<total2.size();i++){ 
      List<Raumeinheit> temp = new ArrayList<Raumeinheit>(); 
      for(int j=0;j<total2.get(i).size();j++){ 
       if(i==1){ 
       temp.add(new Raumeinheit(total2.get(i).get(j)[0],Integer.parseInt(total2.get(i).get(j)[1]),Integer.parseInt(total2.get(i).get(j)[2]),Integer.parseInt(total2.get(i).get(j)[3]),Double.parseDouble(total2.get(i).get(j)[4]), Double.parseDouble(total2.get(i).get(j)[5]), Double.parseDouble(total2.get(i).get(j)[6]))); 
       } 
       else{ 
       temp.add(new Raumeinheit(Integer.parseInt(total2.get(i).get(j)[0]),total2.get(i).get(j)[1],Integer.parseInt(total2.get(i).get(j)[2]),Integer.parseInt(total2.get(i).get(j)[3]),Integer.parseInt(total2.get(i).get(j)[4]),Double.parseDouble(total2.get(i).get(j)[5]), Double.parseDouble(total2.get(i).get(j)[6]), Double.parseDouble(total2.get(i).get(j)[7]))); 
       } 
      } 
      result.add(temp); 
     } 
     return result; 
    } 
} 

正如我所說的,它完全脫機工作,所以不用擔心服務器端代碼。在線它只與我們擁有的8個文件一起工作。

Servlet的:

<servlet> 
    <servlet-name>DataImportServlet</servlet-name> 
    <servlet-class>com.se.sprint1.server.DataImportServiceImpl</servlet-class> 
    </servlet> 

    <servlet-mapping> 
    <servlet-name>DataImportServlet</servlet-name> 
    <url-pattern>/sprint1/DataImport</url-pattern> 
    </servlet-mapping> 

希望你能幫助我。 由於提前

編輯:代碼

+0

沒有發佈一些代碼,它不可能提供幫助。你可以發佈服務器電話嗎? –

+0

我不確定要發佈什麼,因爲我不知道發生了什麼問題,並且我有一大堆代碼。增加了幾個可能有用的東西。 – R6D1H2

回答

0

我的服務電話更改爲:

public void readInput(String Abstimmung){ 
     this.service.readInput(Abstimmung, new AsyncCallback<List<List<Raumeinheit>>(){ 
      @Override 
      public void onFailure(Throwable caught) { 
       System.out.println("An Error has occured!"); 
       // show an error message 
       Window.alert("An error has occured!!"); 
      } 

      @Override 
      public void onSuccess(List<List<Raumeinheit>> result) { 
       menu.setData(result); 
      } 
     }); 
    } 

有沒有必要檢查結果。如果在更改後發生錯誤,請檢查接口。不要使用返回類型的對象。這會讓GWT產生很多不必要的代碼。

此外,我會改變這一點:如果服務器上存在問題,則拋出異常。在你的服務器發生異常的情況下,你會打印一個異常,並且代碼繼續,就好像什麼也沒有發生。這可能是你的問題。如果您得到FileNotFoundException則拋出異常並在客戶端處理此問題。

+0

之後我添加了對結果的檢查(沒有它也沒有工作)。我也嘗試不使用對象作爲返回類型,並且filenotfound異常不應該解決它,因爲:1。它正在離線工作,除非部署不會搞亂「文件系統」,否則它應該沒問題。 2.我們有另外一種功能用相同的技術訪問文件並在那裏工作。不過謝謝你的努力。 – R6D1H2