2012-07-05 89 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