leoiser Ответов: 0

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

Да используйте только почтальона

0 Ответов