如何在Alfresco中执行并行CMIS请求?

如何在Alfresco中执行并行CMIS请求?,alfresco,Alfresco,我有几个CMIS请求,需要并行执行。但当我尝试(使用CompletableFutire或stream().parallel()时,我得到了: 为此,我: @Autowired @Qualifier("searchService") private org.alfresco.service.cmr.search.SearchService searchService; .... searchService.query(searchParameters);

我有几个CMIS请求,需要并行执行。但当我尝试(使用CompletableFutire或stream().parallel()时,我得到了:

为此,我:

 @Autowired
    @Qualifier("searchService")
    private org.alfresco.service.cmr.search.SearchService searchService;
....
 searchService.query(searchParameters);
我做错了什么? 以下代码是我并行执行CMIS的尝试之一:

    List<CompletableFuture<Form14Row>> requests =  Arrays.asList(setUpRow(1,beginnigString, endString, docType, NDBaseDocumentModel.DOC_KIND_GOST_R, searchParameters, "ГОСТ Р"),
                setUpRow(2,beginnigString, endString, docType, NDBaseDocumentModel.DOC_KIND_GOST, searchParameters, "ГОСТ") );
        CompletableFuture<Void> allRequests = CompletableFuture.allOf(
                requests.toArray(new CompletableFuture[requests.size()])
        );
        CompletableFuture<List<Form14Row>> allPageContentsFuture = allRequests.thenApply(v -> {
            return requests.stream()
                    .map(pageContentFuture -> pageContentFuture.join())
                    .collect(Collectors.toList());
        });

        //java.util.concurrent.ExecutionException: net.sf.acegisecurity.AuthenticationCredentialsNotFoundException: A valid SecureContext was not provided in the RequestContext
        try {
            List<Form14Row> rowss = allPageContentsFuture.get();
        } catch (InterruptedException e) {
            e.printStackTrace();
        } catch (ExecutionException e) {
            e.printStackTrace();
        }

...
    private CompletableFuture<Form14Row> setUpRow(Integer index, String beginnigString, String endString, String docType, String docKind, SearchParameters searchParameters, String groupPosition) {
        return CompletableFuture.supplyAsync(() -> {
            String cql = "SELECT p.cmis:objectId  FROM  ecmcnddoc:common_attr_aspect  AS d JOIN ecmcnddoc:biblio_attr_aspect AS p ON d.cmis:objectId = p.cmis:objectId JOIN ecmcnddoc:reg_attr_aspect AS s  ON s.cmis:objectId = p.cmis:objectId JOIN ecmcnddoc:spec_attr_aspect AS asp ON asp.cmis:objectId = p.cmis:objectId WHERE p.cmis:objectTypeId='D:" + docType + "' AND d.ecmcnddoc:doc_kind_cp_ecmcdict_value='" + docKind + "' AND p.ecmcnddoc:biblio_fond='" + NDBaseDocumentModel.BIBLIO_FUND + "' AND s.ecmcnddoc:doc_reg_date >= TIMESTAMP  '" + beginnigString + "T00:00:00.000+00:00' AND s.ecmcnddoc:doc_reg_date <= TIMESTAMP  '" + endString + "T00:00:00.000+00:00' AND (asp.ecmcnddoc:doc_status='draft' OR asp.ecmcnddoc:doc_status='actual')";
            searchParameters.setQuery(cql);
            ResultSet rs = customSearchService.query(searchParameters); // Exception here
            Form14Row isoRow = new Form14Row();
            isoRow.setCount(rs.length());
            isoRow.setIndex(index);
            isoRow.setKindName(groupPosition);
            return isoRow;
        });
    }
List requests=Arrays.asList(setUpRow(1,开始字符串,结束字符串,docType,NDBaseDocumentModel.DOC_KIND_GOST_R,searchParameters,“ГССП”),
setUpRow(2,开始字符串,结束字符串,docType,NDBaseDocumentModel.DOC_KIND_GOST,searchParameters,“ГöСС”);
CompletableFuture allRequests=CompletableFuture.allOf(
requests.toArray(新的CompletableFuture[requests.size()]))
);
CompletableFuture AllPageContents未来=所有请求。然后应用(v->{
返回请求。stream()
.map(pageContentFuture->pageContentFuture.join())
.collect(Collectors.toList());
});
//java.util.concurrent.ExecutionException:net.sf.acegisecurity.AuthenticationCredentialsNotFoundException:RequestContext中未提供有效的SecureContext
试一试{
List rowss=allPageContentsFuture.get();
}捕捉(中断异常e){
e、 printStackTrace();
}捕获(执行例外){
e、 printStackTrace();
}
...
私有CompletableFuture setUpRow(整数索引、字符串开始字符串、字符串结束字符串、字符串docType、字符串docKind、搜索参数搜索参数、字符串组位置){
返回CompletableFuture.SupplySync(()->{

String cql=“从ecmcnddoc中选择p.cmis:objectId:从s.cmis中选择公共属性作为d加入ecmcnddoc:biblio\u attr\u aspect作为d.cmis中的p.cmis:objectId=p.cmis:objectId加入ecmcnddoc:reg\u attr\u aspect作为s上的s加入ecmcnddoc:spec\u attr\u aspect作为asp上的asp.cmis:objectId=p.cmis:objectId:objectId其中p.cmis:objectTypeId=d:”+docType+“'和d.ecmcnddoc:doc_kind_cp_ecmcdict_value=”+docKind+“'和p.ecmcnddoc:biblio_found=”+NDBaseDocumentModel.biblio_FUND+“'和s.ecmcnddoc:doc_reg_date>=TIMESTAMP'+begingstring+“T00:00:00.000+00:00'和s.ecmcnddoc:doc_reg_date安全上下文已绑定到主线程,且未传播到子线程,您需要设置一个。 也许您可以尝试改编以下片段:

CompletableFuture.runAsync(()->{
试一试{
AuthenticationUtil.pushAuthentication();
AuthenticationUtil.SetFullyAuthenticationDuser(用户名);
//做你的事。。。
}最后{
AuthenticationUtil.popAuthentication();
}
});

Hi,很可能securitycontext绑定到您创建它的线程。我通常为每个工作线程创建专用会话,但这并不真正适合您的实现。如果我是您,我会尝试新概念(可能不是那么新:)。
    List<CompletableFuture<Form14Row>> requests =  Arrays.asList(setUpRow(1,beginnigString, endString, docType, NDBaseDocumentModel.DOC_KIND_GOST_R, searchParameters, "ГОСТ Р"),
                setUpRow(2,beginnigString, endString, docType, NDBaseDocumentModel.DOC_KIND_GOST, searchParameters, "ГОСТ") );
        CompletableFuture<Void> allRequests = CompletableFuture.allOf(
                requests.toArray(new CompletableFuture[requests.size()])
        );
        CompletableFuture<List<Form14Row>> allPageContentsFuture = allRequests.thenApply(v -> {
            return requests.stream()
                    .map(pageContentFuture -> pageContentFuture.join())
                    .collect(Collectors.toList());
        });

        //java.util.concurrent.ExecutionException: net.sf.acegisecurity.AuthenticationCredentialsNotFoundException: A valid SecureContext was not provided in the RequestContext
        try {
            List<Form14Row> rowss = allPageContentsFuture.get();
        } catch (InterruptedException e) {
            e.printStackTrace();
        } catch (ExecutionException e) {
            e.printStackTrace();
        }

...
    private CompletableFuture<Form14Row> setUpRow(Integer index, String beginnigString, String endString, String docType, String docKind, SearchParameters searchParameters, String groupPosition) {
        return CompletableFuture.supplyAsync(() -> {
            String cql = "SELECT p.cmis:objectId  FROM  ecmcnddoc:common_attr_aspect  AS d JOIN ecmcnddoc:biblio_attr_aspect AS p ON d.cmis:objectId = p.cmis:objectId JOIN ecmcnddoc:reg_attr_aspect AS s  ON s.cmis:objectId = p.cmis:objectId JOIN ecmcnddoc:spec_attr_aspect AS asp ON asp.cmis:objectId = p.cmis:objectId WHERE p.cmis:objectTypeId='D:" + docType + "' AND d.ecmcnddoc:doc_kind_cp_ecmcdict_value='" + docKind + "' AND p.ecmcnddoc:biblio_fond='" + NDBaseDocumentModel.BIBLIO_FUND + "' AND s.ecmcnddoc:doc_reg_date >= TIMESTAMP  '" + beginnigString + "T00:00:00.000+00:00' AND s.ecmcnddoc:doc_reg_date <= TIMESTAMP  '" + endString + "T00:00:00.000+00:00' AND (asp.ecmcnddoc:doc_status='draft' OR asp.ecmcnddoc:doc_status='actual')";
            searchParameters.setQuery(cql);
            ResultSet rs = customSearchService.query(searchParameters); // Exception here
            Form14Row isoRow = new Form14Row();
            isoRow.setCount(rs.length());
            isoRow.setIndex(index);
            isoRow.setKindName(groupPosition);
            return isoRow;
        });
    }