Возможно ли создать новый поток в компоненте @RequestScope - PullRequest
0 голосов
/ 23 мая 2019

Я работаю над классом Service, который аннотирован @RequestScope, проблема в том, что есть один метод, выполнение которого занимает слишком много времени, и мне интересно, возможно ли создать новый поток, в какой частикод будет выполнен.

Я пытался использовать ManagedExecutorService, CompletableFuture.runAsync (()) и простой поток, но ни один из них, кажется, не работает?

@RequestScoped
public class OfferService 

И метод:

  public List<DTO> createLocation(List<DTO> locationAdressDTOS) {
        List<DTO> lokationLookupList ;

        locationLookupList = offerDao.createMarktlokation(DTOS.get(0).getOfferNo(), DTOS);

        DTOS.forEach(malo -> {
            if (BooleanUtils.isTrue(malo.isShouldUploadHistoricalData()) && malo.getProcessId() != null) {
                callHistoricalDataUpload(malo.getOfferNo(), malo.getProcessId());
            }
        });
        return lokationLookupList;
    }

И я хочу, чтобы часть if выполнялась асинхронно?//

 callHistoricalDataUpload(malo.getOfferNo(), malo.getProcessId());

Я полагаю, причина того, что он не работает, заключается в том, что класс аннотирован @RequestScope, а после возвращения ответ уничтожается, и его контекст тоже?Когда я пытаюсь просто создать новую тему:

2019-05-23 14:45:31,934 ERROR [stderr] (Thread-225) Exception in thread "Thread-225" org.jboss.weld.context.ContextNotActiveException: WELD-001303: No active contexts for scope type javax.enterprise.context.RequestScoped

Что я пробовал:

CompletableFuture.runAsync(() -> {
            try {
                this.uploadHistoricalData(offerNo, processId);
            } catch (DatatypeConfigurationException | ParseException e) {
                logger.severe(e.getMessage());
            }
        });


        managedExecutorService.execute(() -> {
            try {
                this.uploadHistoricalData(offerNo, processId);

            } catch (DatatypeConfigurationException | ParseException e) {
                logger.severe(e.getMessage());
            }
        });


        new Thread((() -> {
            try {

                this.uploadHistoricalData(offerNo, processId);

            } catch (DatatypeConfigurationException | ParseException e) {
                logger.severe(e.getMessage());
            }
        })).start();

Ничего из этого не сработало

1 Ответ

0 голосов
/ 23 мая 2019

Кажется, что ваша проблема такая же, как и этот другой вопрос по StackOverflow .

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

Возможно, вам не нужна аннотация @RequestScoped.

...