2013-07-01 3 views
0

Я работаю над приложением типа управления задачами. Поэтому, когда кто-то завершает задачу, создатель задачи отправляет сообщение с URL-адресом задачи. Я использую Spring MVC для создания этого приложения. Таким образом, теперь проблема заключается в том, что две задачи создаются почти в одно и то же время, для электронной почты для первой задачи я получаю URL-адрес, сгенерированный для второй задачи.лучший способ синхронизации метода

Я написал следующий метод для выполнения этой функциональности

@RequestMapping(value = "commentTask", method = RequestMethod.POST) 
@ResponseBody public List<List<Task>> reply(@ModelAttribute Task task,@RequestParam ("parentId") long parentId,HttpSession session) { 
    List<List<Task>> listTasks = null; 

    taskEntryService.insertTask(task,session); 

    listTasks = taskEntryService.selectAssignedTask(task.getAssignTo(), parentId); 

    String taskurl = siteUrl + "showAssignedTask?assignto="+ task.getAssignTo() + "&taskId="+parentId; 

    if(task.getTaskUpdateEmailNotify().equalsIgnoreCase("1")){ 

      try { 

       if(task.getStatus() == 4){ 

        String completedTaskBody = taskCompletedEmailBody(taskurl, task.getAssignToName(), task.getTaskTitle(), task.getAssignerName(), task.getSummary()); 

        sendmailService.sendMail("[email protected]", task.getTaskCreatorEmail(), "Your Task has been Completed", completedTaskBody); 
      } 
      } catch (AddressException e) { 
       e.printStackTrace(); 
      } 

    } 

    return listTasks; 
} 

Так что это лучший способ синхронизировать этот метод.

Пожалуйста, дайте мне знать, если требуется более подробная информация

+2

Каков тип 'sendmailService' и является классом потокобезопасным? То же для 'taskEntryService' –

+0

Как этот метод вызывается? Нажимает ли пользователь URL-адрес? Вы уверены, что этот метод не вызван с неправильной «Задачей» (возможно, ошибкой в ​​интерфейсе)? –

+0

@EmilSit этот метод, когда кто-то отвечает на созданную задачу. Таким образом, этот метод сохраняет значение в базе данных и отправляет электронное письмо разработчику задачи. Это случается только один раз для меня, когда кто-то отвечает на задание в то же время, в противном случае его рабочий штраф. – user965884

ответ

1

Самый простой способ синхронизации доступа к этому методу, конечно, будет, чтобы пометить его как synchronized в подписи.

@RequestMapping(value = "commentTask", method = RequestMethod.POST) 
@ResponseBody 
public synchronized List<List<Task>> reply(@ModelAttribute Task task, 
     @RequestParam ("parentId") long parentId, 
     HttpSession session) { 

Это кажется маловероятным мне, что синхронизация здесь будет решить вашу проблему, так как код не кажется, что это имеет какое-либо конкретное состояние гонки: он заботится, чтобы построить полный URL из предоставленных Task объекта. Я подозреваю, что как-то либо ваш объект Task не является потокобезопасным, либо что ошибочно передается parentId.

+0

за ваш ответ. как я могу найти, что этот метод не имеет каких-либо условий гонки. Я попробовал еще раз, комментируя задачи в то же время, но это не происходит со мной снова, но беспокоило меня о том, как данные задачи могут быть заменены. – user965884

+0

Вы не вызываете никаких мутаторов 'Task' в этом методе (по крайней мере, предполагая методы' get' не мутируйте), поэтому мне кажется маловероятным, что в этом методе происходит любая расы. –

+0

Привет Эмиль, извините за поздний ответ. Я думаю, вы правы в том, что мой объект Task не является потокобезопасным. Не могли бы вы помочь мне, как я могу сделать объект своей задачи потокобезопасным? – user965884