-1

我尝试运行几个请求来执行不同的服务器并调试程序行为。首先,我创建并运行了几个异步任务,它们发出了几个请求

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);但在第一次运行后调试器冻结。看起来它在断点处停止,但没有断点。

4

1 回答 1

3

我不确定发生了什么(没有足够的信息),但我可以肯定地告诉你这RestTemplate是线程安全的,并且设计为配置一次并在线程之间共享,这与所有 spring*Template对象一致。

spring 4.0 文档在多个地方支持此声明。

11.6.1 节使用 TransactionTemplate

TransactionTemplate 采用与其他 Spring 模板(例如 JdbcTemplate)相同的方法。...最后,TransactionTemplate 类的实例是线程安全的

第 13.2.1 节 JdbcTemplate 最佳实践

JdbcTemplate 类的实例在配置后是线程安全的。

通过持久性,您可以找到关于JmsTemplate. 关于文档仅RestTemplate说明:

...它在概念上类似于 Spring 中的其他模板类,例如 JdbcTemplate 和 JmsTemplate 以及其他 Spring 组合项目中的其他模板类。

从这里我推断出它的意图是线程安全的,就像其他核心模板类一样。这当然意味着它不能保证是线程安全的,如果不是,它就是一个错误。

于 2012-07-05T14:49:44.800 回答