Springboot API возвращает перекрывающиеся результаты для параллельного запуска
Привет, я новичок в springboot. Я создал API, который запускает какой-то процесс, который занимает около одного часа, и возвращает результат. Проблема в том, что если я отправляю два процесса параллельно, то получаю один и тот же результат. Пожалуйста, проверьте приведенный ниже код и дайте мне предложения
Похоже, ProcessService работает над одним и тем же экземпляром класса, потому что я последний отправленный вывод для обоих случаев. Что не так в этом коде? Любое решение. пожалуйста посоветуйте
Что я уже пробовал:
--КОНТРОЛЛЕР
@RestController @RequestMapping("/task") public class ProcessController { @Autowired TaskRepository taskRepository; @Autowired ProcessService processService; @RequestMapping(value = "/process", method = RequestMethod.POST, consumes = "application/json", produces = "application/json") public Map<String, Object> process(@RequestBody String requestBody) throws Exception { Map<String, Object> result = new LinkedHashMap<String, Object>(); long taskId=0; try { ParameterClass param =null ; JSONObject requestJson = new JSONObject(requestBody); taskId = Long.valueOf(requestJson.getString("taskid")); List<Task> lst = taskRepository.findByTaskId(taskId); Task task = lst.stream().filter(p -> p.getParameterName().equals("process_task")) .findFirst().orElse(null); if (task != null) { String parameterArgs = task.getParameterArg(); param = setParameters(parameterArgs); //Log process take around one hour result = processService.ProcessJob(param); } } catch (Exception ex) { result.put("taskid", taskId); result.put("status", "failed"); result.put("message", ex.getMessage()); ex.printStackTrace(); } finally { return result; } } }
--ОБСЛУЖИВАНИЕ
@Service public class ProcessServiceImpl implements ProcessService { //Oracle DB connection private dataLayer dbLayer = null; //Setting the parameters private ProcessParameter inputParam = null; //Storing output private LinkedHashMap<String, Object> outputResult = null; //storing Log details private StringBuilder sbLog = null; @Override public Map<String, Object> ProcessJob(ProcessParameter param) throws Exception { try { outputResult.put("jobid", param.getTask_id()); outputResult.put("startdate", new SimpleDateFormat("dd/MM/yyyy hh:mm:ss a").format(System.currentTimeMillis())); sbLog.append("taskid= " + param.getTask_id() + ")\n"); inputParam = param; // Initialize the dabaLayer object dbLayer = new dataLayer(param.getServer_name(), param.getDatasource(), param.getUsername(),param.getPassword()); if (!dbLayer.openConnection()) throw new Exception("Unable to open oracle database connection "); //Here do the process //Loop through the job details and get the details from oracle db sStatus = "success"; } } catch (Exception ex) { ex.printStackTrace(); sStatus = "failed"; outputResult.put("message", ex.getMessage()); } finally { outputResult.put("status",sStatus ); sbLog.append("returing output for " + param.getJob_id() + "\n"); outputResult.put("log", sbLog.toString() ); return outputResult; } } }
--ВХОД1
{ "taskid"= 201 }
--ВЫХОД1
{ "taskid": 260, "status": "success", "log" : "taskid=260 returning output for 260" }
--ВХОД2
{ "taskid"= 260 }
--ВЫХОД2
{ "taskid": 260, "status": "success", "log" : "taskid=260 returning output for 260" }
Afzaal Ahmad Zeeshan
Интересно, что, возможно, проблема заключается в том, что новая работа переопределяет предыдущую.
leoiser
Да, это что-то вроде этого, но в некоторых случаях оба задания провалились через некоторое время, потому что есть условие, основанное на задании, которое не удалось найти в БД. Что-нибудь не так в моем коде?
wseng
Вы пробовали использовать postman ?
leoiser
Да используйте только почтальона