Java Callable CompletionService представить в FutureTask получить на будущие возвращается null - PullRequest
0 голосов
/ 10 апреля 2020

У меня есть дело с нулем.

Сначала у меня есть что-то вроде:

public List<Account> callService(GetAccountsQuery input, SessionContext sc) {

...

List<Account> outList = getEntityList(Account.class, response);

...

if (outList.size() > 0) {

...

for (Account item : outList) {

...

Моя опция 1 работает правильно при 100% вызовах:

            Callable<List<ProductType>> callableTask = () -> {
                sc.setReferenceNo(systemAppUtil.generateSystemInvocationId());  // return uniq id like 2020-04-09_17.00.26.326.d794188
                log.info("concurrent ref no: " + sc.getReferenceNo());
                List<ProductType> list = getAdapCardsTypesApplicable.callService(toQueryCidCif(Long.parseLong(input.getCifKiRelated()), item.getAccountNumber()), sc);
                return list;
            };

, а моя опция 2 работает правильно примерно на 40-80% звонков:

                Callable<Map<String, List<ProductType>>> callableTask = () -> {
                Map<String, List<ProductType>> mapAccounts = new HashMap<>();   //Map<String, List<ProductType>> mapAccounts = null;
                sc.setReferenceNo(systemAppUtil.generateSystemInvocationId());  // return uniq id like 2020-04-09_17.00.26.326.d794188
                log.info("concurrent ref no: " + sc.getReferenceNo());
                List<ProductType> list = getAdapCardsTypesApplicable.callService(toQueryCidCif(Long.parseLong(input.getCifKiRelated()), item.getAccountNumber()), sc);
                mapAccounts.put(item.getAccountNumber(), list);     
                return mapAccounts;
            };

в 2-м варианте я получаю нулевое значение, когда делаю:

Future<Map<String, List<ProductType>>> resultFuture = completionService.take();

Map<String, List<ProductType>> resList = resultFuture.get();  // here is null

я устанавливаю темы:

            int threadsPool;
            if (outList.size() <= 20) {
                threadsPool = outList.size();
            } else {
                threadsPool = 21;
            }
            if (Runtime.getRuntime().availableProcessors() > 0) {
                threadsPool = Runtime.getRuntime().availableProcessors();
            }

My outList имеет 33 элемента. Первые тесты я установил 21 поток, а затем я изменил на доступные, поэтому в моей среде TST у меня есть 2-4 процессора.

Возможно, проблема существует, когда я ставлю только 2-4 потока, и нет проблем, когда у меня есть о 20 потоков?

что не так? Как помнить getAccountNumber (), чтобы использовать его в возвращаемых результатах? Обратите внимание, что у меня всегда есть значение не нуль в item.getAccountNumber () и список

Так что в варианте 1 у меня нет нулевого значения, но только в варианте 2 у меня есть несколько нулей. Может быть, проблема в добавленной карте в варианте 2?

изменить 1: когда я вызываю: List list = getAdapCardsTypesApplicable.callService (toQueryCidCif (Long.parseLong (input.getCifKiRelated ()), item.getAccountNumber ()), s c);

в бэкэнде у меня есть перехватчик и метод @transactional для записи каждого вызова в таблицу БД. Я получаю s c .getReferenceNo () и помещаю его в индекс уникальный столбец (но этот идентификатор всегда уникален, я вижу это в журнале). И проблема в том, что я вижу в журналах, что примерно для 50% вызовов я получаю исключение нарушения ограничения, но почему?

edit 2:

в строке:

                        List<ProductType> list = getAdapCardsTypesApplicable.callService(toQueryCidCif(Long.parseLong(input.getCifKiRelated()), item.getAccountNumber()), sc);

i получил: на com.myorg.service.services.GetAccountsForCardsAvailableList.lambda $ callService $ 1 (GetAccountsForCardsAvailableList. java: 98)

stacktrace:

Caused by: com.myorg.kernel.exception.StatusException: -2502 ADAP status:400 BAD_REQUEST, error:400, {"errors":[{"code":"1","message":"org.springframework.dao.DataIntegrityViolationException: could not execute statement; SQL [n/a]; constraint [ADAP_MS_PRODUCTCENTER.LOG_SERVICE_IDX_RNA]; nested exception is org.hibernate.exception.ConstraintViolationException: could not execute statement"}]}
at com.myorg.service.adapter.adap.AdapRestService.generateStatusException(AdapRestService.java:120)
at com.myorg.service.adapter.adap.AdapRestService$$FastClassBySpringCGLIB$$dc60eb77.invoke(<generated>)
at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218)
at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:749)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163)
at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:93)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)
at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:688)
at com.myorg.service.adapter.adap.AdapRestService$$EnhancerBySpringCGLIB$$79e13b38.generateStatusException(<generated>)
at com.myorg.service.services.base.AbstractAdapService.generateStatusException(AbstractAdapService.java:81)
at com.myorg.service.services.GetAdapCardsTypesApplicable.callService(GetAdapCardsTypesApplicable.java:37)
at com.myorg.service.services.GetAdapCardsTypesApplicable$$FastClassBySpringCGLIB$$1761c7f2.invoke(<generated>)
at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218)
at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:749)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163)
at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:93)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)
at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:688)
at com.myorg.service.services.GetAdapCardsTypesApplicable$$EnhancerBySpringCGLIB$$2007f589.callService(<generated>)
at com.myorg.service.services.GetAccountsForCardsAvailableList.lambda$callService$1(GetAccountsForCardsAvailableList.java:98)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
... 1 more

Почему с тем же решением у меня есть правильно работающий вариант 1 и вариант 2 имеют здесь только нули?

regards

...