2015-01-03 2 views
0

Я пишу проект Java, в котором пользователь может сразу отправить несколько запросов, и они одновременно отправляются для обработки на одном из моих серверов.Параллельная обработка удаленных данных

Чтобы проиллюстрировать это, допустим, пользователь вводит несколько номеров счетов одновременно. Программа должна отправлять каждый из этих номеров счета на мой сервер и ждать результатов обработки. Когда каждый результат возвращается сервером, программа обновляет Java Swing JList, чтобы показать эти результаты пользователю.

Так, скажем, пользователь входит:

00001 
00002 
00003 
00004 

Программа будет затем одновременно направить 4 различных запросов к:

http://example.com/process_account.php?accountNumber=00001 
http://example.com/process_account.php?accountNumber=00002 
http://example.com/process_account.php?accountNumber=00003 
http://example.com/process_account.php?accountNumber=00004 

Результаты затем будут отображаться пользователю в jlist_AccountResults как сервер завершает их. Таким образом, сервер может вернуть: 43 на счет 00004 запрос; 12 - на счет 00002 запрос; 36 - на счет 00001 запрос; и 29 на счет 00003 запрос. Таким образом, результат будет что-то вроде:

Account 00004: 43 
Account 00002: 12 
Account 00001: 36 
Account 00003: 29 

Ключевым моментом здесь является то, что, что результаты отображаются как только они становятся доступными и обработки одновременно, а не последовательно.

В настоящее время программа может последовательно обрабатывать несколько запросов, но когда список запросов довольно длинен, обработка может занять очень много времени. Конечно, общее время обработки растет с увеличением количества запросов, но если, например, программа может обрабатывать 4 запроса за раз, это резко сократит общее время.

Чтобы справиться с этим, я изучал использование многопоточности или ExecutorService, но мне хотелось бы услышать некоторые альтернативные идеи. Если кто-нибудь может предоставить примеры или ссылки на примеры, которые справятся с аналогичными проблемами, это будет очень признательно.

Заранее спасибо.

+1

Исполнитель * является * многопоточным, за исключением того, что он управляет всеми волосатыми деталями и позволяет вам отправлять задания на него. Это почти всегда путь (хотя более крупные рамки, такие как Spring, могут дополнительно абстрагировать некоторые из асинхронных логик для вас). – chrylis

ответ

1

ExecutorService является многопоточным и кажется правильным инструментом для работы. Если вы знаете основы потоков и ограничиваете связь между потоками до минимума, это должен быть самый простой вариант. Я бы сделал что-то вроде этого:

public static void get(URI[] uris) { 
    ExecutorService executor = Executors.newFixedThreadPool(4); 
    for (final URI uri : uris) { 
     executor.submit(new Callable<Void>() { 
      @Override 
      public Void call() throws Exception { 
       InputStream input = uri.toURL().openStream(); 
       try { 
        Result result = readIntput(input); 
        SwingUtilities.invokeAndWait(new Runnable() { 
         @Override 
         public void run() { 
          // notify UI 
         } 
        }); 
       } finally { 
        input.close(); 
       } 
       return null; 
      } 
     }); 
    } 
} 

Асинхронный IO - еще один вариант. Например: AsyncHttpClient. Но это в значительной степени сводится к тому же.

+0

Отлично! Спасибо за этот ответ. Посмотрев в ExecutorService немного больше, я согласен, что это лучший вариант. Тем не менее, я рассмотрю библиотеку AsyncHttpClient. Спасибо, что привлекли эту библиотеку к моему вниманию. – SpencerD

Смежные вопросы