Доступ к параллельным веб-сервисам в среде Weld CDI

Мы разрабатываем веб-интерфейс с использованием 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);        
}

}

При этом рабочий не управляется.


person Stefan Lechner    schedule 15.05.2013    source источник
comment
Здесь явно недостаточно кода, чтобы понять, что происходит. Почему рабочий не управляется?   -  person John Ament    schedule 15.05.2013
comment
Хорошо, я добавил код, чтобы объяснить, что я пытался сделать. Надеюсь, это проясняет ситуацию. Я понятия не имею, как динамически создавать управляемые экземпляры.   -  person Stefan Lechner    schedule 15.05.2013
comment
Это то, что заставило меня переключиться на OWB вместо сварки, потому что я мог использовать действительно плавный CdiControl для этих проблем. Struberg.wordpress.com/2012 / 03/17 / issues.apache.org/jira/browse/DELTASPIKE -284   -  person Karl Kildén    schedule 16.05.2013


Ответы (1)


Вы можете обернуть созданного воркера в контекст создания CDI, примерно так:

@Inject
private BeanManager beanManager;

public <T extends Object> T performInjection(final T obj) {
    if (this.beanManager != null) { // only do injection if the bean manager is present.
        // Create a creational context from the BeanManager
        final CreationalContext creationalContext = this.beanManager.createCreationalContext(null);
        // Create an injection target with the Type of the instance we need to inject into
        final InjectionTarget injectionTarget = this.beanManager.createInjectionTarget(this.beanManager.createAnnotatedType(obj.getClass()));
        // Perform injection into the instance
        injectionTarget.inject(obj, creationalContext);
        // Call PostConstruct on instance
        injectionTarget.postConstruct(obj);
    }
    return obj;
}
person John Ament    schedule 15.05.2013
comment
Да, это, наверное, лучшее, что ты мог сделать. - person LightGuard; 15.05.2013
comment
Не могли бы вы объяснить return container; дальше? Означает ли это return obj;? - person Charlee Chitsuk; 16.05.2013
comment
Исправлено, в моем локальном примере в конце была опечатка. - person John Ament; 16.05.2013
comment
@JohnAment. Каков объем obj, @Dependent? Если да, то в зависимости от кого? - person Uluk Biy; 15.07.2013
comment
в этом случае объект не имеет области видимости, потому что вы создали его экземпляр. цели инъекции, которые входят в объект, будут зависеть от того, что доступно в данный момент, поэтому у него могут быть цели с ограничением по запросу и т. д., если они активны и доступны. - person John Ament; 15.07.2013