是否可以在@RequestScope bean中创建新线程

时间:2019-05-23 13:54:15

标签: java asynchronous jboss wildfly jakarta-ee

我正在使用@RequestScope注释的Service类,问题是有一种方法花费的时间太长,我想知道是否有可能创建新的Thread,其中代码将被执行。

我尝试使用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 :(得分:0)

您的问题似乎与此other question on StackOverflow相同。

  

这是因为请求绑定到处理请求的服务器线程。当您切换线程时,将无法再访问该请求上下文。

您可能不需要@RequestScoped注释。