У меня есть дело с нулем.
Сначала у меня есть что-то вроде:
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