Android SpringRESTTemplate正确使用多线程

Android SpringRESTTemplate正确使用多线程,android,spring,jackson,Android,Spring,Jackson,我尝试运行多个请求来执行不同的服务器和调试程序行为。首先,我创建并运行几个异步任务,这些任务发出几个请求 public class MyTask extends AsyncTask<Object, Void, Void> { int runnnigDownloadThreadsCount = 0; @Override protected Void doInBackground(Object... params) { runnnigDownlo

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

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);
    }
公共类MyTask扩展了AsyncTask{
int runnigdownloadthreadscont=0;
@凌驾
受保护的Void doInBackground(对象…参数){
runnigdownloadthreadsont++;
试一试{
//TODO服务器名称服务器名称服务器名称服务器名称服务器名称服务器名称服务器名称服务器名称服务器名称服务器名称服务器名称服务器名称服务器名称服务器名称服务器名称服务器名称服务器名称服务器名称服务器名称服务器名称服务器名称服务器名称服务器名称服务器名称服务器名称服务器名称服务器名称服务器名称服务器名称服务器名称服务器名称服务器名称服务器名称服务器名称服务器名称服务器名称服务器名称服务器名称服务器名称服务器名称服务器名称服务器名称服务器名称服务器名称服务器名称服务器名称服务器名称服务器名称服务器名称服务器名称服务器名称服务器名称服务器名称服务器名称服务器名称服务器名称服务器名称服务器名称服务器名称服务器名称服务器名称服务器名称服务器名称服务器名称服务器名称服务器名称服务器名称服务器名称
List ticketsList=TravelTicket.downloadTickets((TravelTicket.RequestServerParams)params[0],(String)params[1]);
if(ticketsList!=null)
已同步(TravelBookingApplication.travelTicketsList){
TravelBookingApplication.travelTicketsList.addAll(ticketsList);
}
返回null;
}捕获(例外e){
抛出新错误(e);
}
}
@凌驾
受保护的void onPostExecute(void结果){
RunnigDownloadThreadsCount--;
如果(runnigdownloadthreadscont==0){
意图i=新意图(getActivity().getApplicationContext(),hotelsandTicketsResponseListativity.class);
i、 putExtra(“请求类型”、“票证”);
getActivity().startActivity(i);
如果(对话框!=null)
dialog.dismise();
}
}
}
字符串[]URL=新字符串[]{
"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(最终字符串serverName:url){
//待办事项3АММБПа!!!
//for(最终字符串serverName:params.serverNames){
new MyTask().execute(参数,服务器名);
}
下一个函数是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();
publicstaticarraylistdownloadtickets(RequestServerParams RequestServerParams,stringservername)引发异常{
// Запрос к серверу с указанием конретного провайдера и идентификторов запроса
// Заголовки
HttpHeaders requestHeaders=新的HttpHeaders();
requestHeaders.setUserAgent(TravelBookingApplication.USER\u AGENT);
HttpEntity requestEntity=新的HttpEntity(requestHeaders);
RestTemplate RestTemplate=新RestTemplate();

每个线程都会使用最后一行
HttpEntity requestEntity=new HttpEntity(requestHeaders);
进行处理,但在第一次运行之后,调试器会冻结。它看起来会在断点处停止,但没有断点。

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

Spring4.0文档在多个地方支持此语句

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

JdbcTemplate类的实例在配置后即为线程安全的

使用persistence,您可以找到关于
JmsTemplate
的类似语句。关于
restemplate

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


从这一点上,我推断出该类与其他核心模板类一样是线程安全的。这当然意味着它不能保证线程安全,除非它不是线程安全,否则它就是一个bug。

好的,我理解你的意思。我认为问题非常具体。可能与我的DenEnvironment或smth其他方面有关。你有r吗你的声明可以参考吗?@ChristopherRoscoe刚刚添加了一些支持性的参考资料,希望这比我只是承诺一些事情是真实的要好一点。另请参见