2012-07-05 88 views
-1

我試着運行幾個請求來做不同的服務器和調試程序的行爲。首先,我創建並運行多個asynctasks這使得多個請求Spring RestTemplate正確的多線程使用

public class MyTask extends AsyncTask<Object, Void, Void> { 
    int runnnigDownloadThreadsCount = 0; 

    @Override 
    protected Void doInBackground(Object... params) { 
     runnnigDownloadThreadsCount++; 
     try { 
      // TODO здесь необходимо исправить serverName на оригинальный урл с указанием параметра сервера 
      List<TravelTicket> ticketsList = TravelTicket.downloadTickets((TravelTicket.RequestServerParams) params[0], (String) params[1]); 
      if (ticketsList != null) 
       synchronized (TravelBookingApplication.travelTicketsList) { 
        TravelBookingApplication.travelTicketsList.addAll(ticketsList); 
       } 
      return null; 
     } catch (Exception e) { 
      throw new Error(e); 
     } 
    } 

    @Override 
    protected void onPostExecute(Void result) { 
     runnnigDownloadThreadsCount--; 
     if (runnnigDownloadThreadsCount == 0) { 
      Intent i = new Intent(getActivity().getApplicationContext(), HotelsAndTicketsResponseListActivity.class); 
      i.putExtra("requestType", "tickets"); 
      getActivity().startActivity(i); 
      if (dialog != null) 
       dialog.dismiss(); 
     } 
    } 
} 

    String[] urls = new String[]{ 
      "http://dl.dropbox.com/u/34053723/provider1.json" 
      , 
      "http://dl.dropbox.com/u/34053723/provider2.json", 
      "http://dl.dropbox.com/u/34053723/provider3.json", 
      "http://dl.dropbox.com/u/34053723/provider4.json" 
    }; 
    for (final String serverName : urls) { 
     // TODO ЗАМЕНИТЬ!!! 
     // for (final String serverName : params.serverNames) { 
     new MyTask().execute(params, serverName); 
    } 

下一個函數TravelTicket.downloadTickets(...)我加載數據與RestTemplate

public static ArrayList<TravelTicket> downloadTickets(RequestServerParams requestServerParams, String serverName) throws Exception { 
    // Запрос к серверу с указанием конретного провайдера и идентификторов запроса 

    // Заголовки 
    HttpHeaders requestHeaders = new HttpHeaders(); 

    requestHeaders.setUserAgent(TravelBookingApplication.USER_AGENT); 

    HttpEntity requestEntity = new HttpEntity(requestHeaders); 
    RestTemplate restTemplate = new RestTemplate(); 

每個線程與最後一行HttpEntity requestEntity = new HttpEntity(requestHeaders);方法但在第一次運行後,調試器凍結。它看起來像停在斷點上,但沒有人。

回答

3

我不確定發生了什麼(沒有足夠的信息),但我可以肯定地告訴您,RestTemplate是線程安全的,並且被設計爲一次配置並在線程之間共享,這與所有的春天*Template對象。

這個聲明在幾個地方被spring 4.0文檔支持。

Section 11.6.1 Using the TransactionTemplate

TransactionTemplate採用相同的方法和其他Spring模板,如JdbcTemplate的。 ... 最後,TransactionTemplate的類的實例是線程安全的JdbcTemplate類的

Section 13.2.1 JdbcTemplate best practices

實例是線程安全的配置一次。

堅持不懈,您可以找到關於JmsTemplate的類似陳述。關於RestTemplatedocumentation merely states

...這是概念上類似於在Spring其它模板類,如JdbcTemplate類JmsTemplate的和其他模板類的其他投資組合春季項目中。

從這我推測,意圖是線程安全的其他核心模板類相同的方式。這當然意味着它不能保證只有線程安全,否則它是一個錯誤。

+0

好吧,我理解你。我認爲這個問題非常具體。也許它與我的環境或其他方面有關。 – user826776 2012-07-06 08:59:33

+0

你有沒有參考你的陳述? – 2014-01-23 14:30:12

+1

@ChristopherRoscoe剛剛添加了一些支持性參考文獻,希望比我更好,我只是希望某些事情是真實的。 – 2014-01-24 10:42:54