Мы разрабатываем веб-интерфейс с использованием JSF 2 и Weld Cdi на Tomcat.
Теперь у меня возникла проблема с одновременным запуском нескольких веб-сервисов для оптимизации времени запроса.
Пользователь может выбрать несколько элементов из списка .
Для каждого выбранного элемента процесс собирает информацию из одного веб-сервиса, используя ключ списка в качестве параметра.
В моем текущем подходе используется производитель, который возвращает интерфейс порта веб-службы, который вводится в компонент. Компонент вызывает эту веб-службу в цикле для каждого выбранного ключа.
@Inject
private WSAnzeigeAssetsummen serviceAccess;
:
for ( Integer pfNr : sessionKeys.getPfnrList() ) {
summaryTable = serviceAccess.execute(snr, pfnr, requestType, "", desiredRows, userName);
processResult(summaryTable):
}
Чтобы работать быстрее, я попытался использовать ExecutorService и столько рабочих, сколько нужно, которые возвращают Futures.
Проблема этой конструкции в том, что я не могу внедрить порт службы в рабочий, потому что рабочий не управляется. Создание порта службы вручную работает, но не приветствуется, поскольку игнорирует класс производителя.
Кроме того, при тестировании невозможно внедрить фиктивный порт службы, который предоставляет предопределенные наборы результатов.
Поскольку я ничего не нашел о параллельном выполнении в среде со сварным швом, должно быть, что-то не так с моим подходом.
Как правильно решить такую ситуацию?
Изменить: чтобы было более понятно, что я пробовал ...
public class DataCollector implements ISumRequest<Integer, Integer, String, FutureResult> {
ExecutorService pool = Executors.newCachedThreadPool();
@Inject
SessionBean sessionBean;
public Future<FutureResult> collectInformation(Integer snr, Integer pfnr, String requestType) {
CollectWorker worker = new CollectWorker (snr,pfnr,requestType,sessionBean.getUserName());
return pool.submit(worker);
}
}
При этом рабочий не управляется.