|
|
|
Любителям поломать голову над многопоточным кодом
|
|||
|---|---|---|---|
|
#18+
Petro123забыл никПока пользователь заполняет следующую страницу, таск выполняется асинхронно. а если первый таск - "Удалить и выйти"? )) такие таски тоже есть, они выполняются по-другому, именно для них и нужен метод - ПодождиПокаВсеТаскиВыполнятся ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.12.2013, 22:20:51 |
|
||
|
Любителям поломать голову над многопоточным кодом
|
|||
|---|---|---|---|
|
#18+
Краткое резюме. Сейчас у меня есть блокирующая очередь для тасков, есть распределятор, есть лист с номерами выполняющихся тасков, все накрыто одним локом, кроме блокирующего метода take() у очереди, в принципе можно было бы уйти от блокирующей очереди и опрашивать очередь в цикле, и накрыть это опрашивание тем же локом, тогда все будет корректно. Но CPU будет жечься немеренно(состояние когда тасков нет достаточно обычно), пока в раздумьях ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.12.2013, 22:25:24 |
|
||
|
Любителям поломать голову над многопоточным кодом
|
|||
|---|---|---|---|
|
#18+
ну да и конечено есть экзекьютор, который выполняет таски и ему все фиолетово. По сути вся логика хитрая именно в распределяторе. Проблема в методе ПодождиКомплитВсехТасков - я под локом проверяю - есть ли в очереди задачи для такого айди и выполняется ли что-нибудь для айди, пока эти условия соблюдаются - я жду, если нет - сразу выхожу. Проблема в том, что метод take() вне лока, то есть может случиться что ничего не выполняется для айди, распределятор выгреб таск из очереди, но не взял лок, чтобы положить айли в лист выполняющихся. Фейл ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.12.2013, 22:29:04 |
|
||
|
Любителям поломать голову над многопоточным кодом
|
|||
|---|---|---|---|
|
#18+
забыл никПо сути вся логика хитрая именно в распределяторе. ну например, ВИ №1 - шаг1 - Ввести адрес = проверка веб сервисом наличия города - шаг2 - если города нет, то форма ввода города. Если есть, то возврат его ID. Это классический визард. И как тут решать в потоках? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.12.2013, 22:41:03 |
|
||
|
Любителям поломать голову над многопоточным кодом
|
|||
|---|---|---|---|
|
#18+
Petro123забыл никПо сути вся логика хитрая именно в распределяторе. ну например, ВИ №1 - шаг1 - Ввести адрес = проверка веб сервисом наличия города - шаг2 - если города нет, то форма ввода города. Если есть, то возврат его ID. Это классический визард. И как тут решать в потоках? Нет, не до конца понятно обьяснил наверное. То что на странице - никого не колышет, все разруливается javascriptом. Вызовов сторонних сервисов нет. Сервис вызывается только если форма отвалидирована и все ок, этот сервис просто сохраняет ответы юзера, но работает долго, поэтому нужна асинхронность. Про веб можешь вообще забыть, речь идет о бэкэнде ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.12.2013, 23:02:14 |
|
||
|
Любителям поломать голову над многопоточным кодом
|
|||
|---|---|---|---|
|
#18+
забыл никcdtyjvЭто бага. Все равно есть проблема. Смотрите, в вашем варианте пришел таск с айди=1 например, стал выполняться (тупо спит 20 сек), через 2с приходит новый таск с айди =1, в вашем коде он реджектнется. А мне нужно чтобы он выполнился сразу после того как выполнится первый. Если пока выполняется первый пришли еще таски с айди =1, то должен выполниться только последний. Я говорю, задача далеко не такая тривиальная как кажется. Вот Я буквально добавил пару сообщений логирования и метод мэйн - Просто запустите Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79. 80. 81. 82. 83. 84. 85. 86. 87. 88. 89. 90. 91. 92. 93. 94. 95. 96. 97. 98. 99. 100. 101. 102. 103. 104. 105. 106. 107. 108. 109. 110. 111. 112. 113. 114. 115. 116. 117. 118. 119. 120. 121. 122. 123. 124. 125. 126. 127. 128. 129. 130. 131. 132. 133. 134. 135. 136. 137. 138. 139. 140. 141. 142. 143. 144. 145. 146. 147. 148. 149. 150. 151. 152. 153. 154. 155. 156. 157. 158. 159. 160. 161. 162. 163. 164. 165. 166. 167. 168. 169. 170. 171. 172. 173. 174. 175. 176. 177. 178. 179. 180. 181. 182. 183. 184. 185. 186. 187. 188. 189. 190. Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79. 80. 81. 82. 83. 84. 85. 86. 87. 88. 89. 90. 91. 92. 93. 94. 95. 96. 97. 98. 99. 100. 101. 102. 103. 104. 105. 106. 107. 108. 109. 110. 111. 112. 113. 114. 115. 116. 117. 118. 119. 120. 121. 122. 123. 124. 125. 126. 127. 128. 129. 130. 131. 132. 133. 134. 135. 136. 137. 138. 139. 140. 141. 142. 143. 144. 145. 146. 147. 148. 149. 150. 151. 152. 153. 154. 155. 156. 157. 158. 159. 160. 161. 162. 163. 164. 165. 166. 167. 168. 169. 170. 171. 172. 173. 174. 175. 176. 177. 178. 179. 180. 181. 182. 183. 184. 185. 186. 187. 188. 189. 190. 191. 192. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.12.2013, 23:23:27 |
|
||
|
Любителям поломать голову над многопоточным кодом
|
|||
|---|---|---|---|
|
#18+
забыл никПро веб можешь вообще забыть, речь идет о бэкэнде дело твоё. Я не понимаю, как можно писать код бэкенд без оглядки на код клиента. И наоборот. Без разницы на чём он написан. ВИ или прецендент - он вообще без кода. Но потоковость работы очень сильно от него зависит. Ты упорно выбрал себе "Таск" как метод решения. То веб, то не веб....то визард, но ОДНА форма. Может просто ты бэкенд-программист, но вероятно есть более простое решение (с участием клиента). IMHO Удачи! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.12.2013, 23:31:06 |
|
||
|
Любителям поломать голову над многопоточным кодом
|
|||
|---|---|---|---|
|
#18+
Petro123забыл никПро веб можешь вообще забыть, речь идет о бэкэнде дело твоё. Я не понимаю, как можно писать код бэкенд без оглядки на код клиента. И наоборот. Без разницы на чём он написан. ВИ или прецендент - он вообще без кода. Но потоковость работы очень сильно от него зависит. Ты упорно выбрал себе "Таск" как метод решения. То веб, то не веб....то визард, но ОДНА форма. Может просто ты бэкенд-программист, но вероятно есть более простое решение (с участием клиента). IMHO Удачи! Емае, клиент сайд тут вообще не при чем, приложение уже год в продакшене, все ок, и все разруливается. Проблема была - долгое ожидание пользователей, вот она и решается, для этого сохранение формы решено перенести в асинхронный режим, клиент сайд как работал так и продолжает работать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.12.2013, 23:54:21 |
|
||
|
Любителям поломать голову над многопоточным кодом
|
|||
|---|---|---|---|
|
#18+
cdtyjvНу здрасти :-) Вы сами сказали, что более новая задача должна перезаписывать более старые, если они еще не начались. Именно это здесь и происходит, и никакого реджекта там нет. Запустите код ниже сначала как есть, а потом с раскомментированной строкой в методе main: Да, убедили, я был не прав. Согласен, что решение гораздо лучше моего. Пока вижу одну проблему, но некритичную на данный момент, пока еще гоняю тесты, но вроде все требования соблюдены. А проблема такая - Представим что одновременно визард проходят 11 юезров(на 1 больше чем в экзекьюторе). Проходят активно, то есть пока таск выполняется они успевают заполнить еще одну страницу. 10 юзеров будут в шоколаде, а 11 получит starvation. Ситуация малореальная с нашей текущей нагрузкой, но вдруг? Что скажете? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.12.2013, 23:59:02 |
|
||
|
Любителям поломать голову над многопоточным кодом
|
|||
|---|---|---|---|
|
#18+
OFF забыл никЕмае Емае. Напиши более конкретный ВИ. Иначе по твоему тексту подойдёт AJAX вызов на JS асинхронно с клиента с доп.текстом "На сервер ВСЁ отправлено".....ожидать не надо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.12.2013, 00:08:58 |
|
||
|
Любителям поломать голову над многопоточным кодом
|
|||
|---|---|---|---|
|
#18+
Petro123OFF забыл никЕмае Емае. Напиши более конкретный ВИ. Иначе по твоему тексту подойдёт AJAX вызов на JS асинхронно с клиента с доп.текстом "На сервер ВСЁ отправлено".....ожидать не надо. Блин я твоя не понимать, примерно так все и будет работать, как ты написал, только к чему это? Клиент готов и в него никаких правок не планируется, а вот логика перехода между страницами на бэкэнде поменяется, раньше сохранение было синхронным, а теперь асинхронное, как это сделать с некоторыми рестрикшенами и был разговор, а ты о чем? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.12.2013, 00:14:12 |
|
||
|
Любителям поломать голову над многопоточным кодом
|
|||
|---|---|---|---|
|
#18+
забыл ник, я спрашивал выше про: "и чем данная задача отличается от классики - "Набор товаров в корзину"? И потом, один Run - купить?" Которая решена ещё при Иване Грозном? Не увидел или не понял твой ответ. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.12.2013, 00:23:54 |
|
||
|
Любителям поломать голову над многопоточным кодом
|
|||
|---|---|---|---|
|
#18+
забыл ник , Ну вообще это достаточно серьезный косяк. Решений несколько, и все они разрливаются через мануальное создание пула. 1) Использовать ThreadPoolExecutor.CallerRunsPolicy. Это самый простой вариант - если не получается выполнить асинхронно, то выполнить синхронно. Но не факт, что он вас устроит по двум причинам: - Долгий ответ клиенту, от которого хотелось избавиться. - Starvation никуда не делся, а просто переместился в другое место - теперь у вас может застарвиться один клиент, если он в первом окне браузера начал синхронное выполнение, а во втором окне постоянно тыкает вперед-назад. В этом случае, вы рискуете в первом окне браузера так и не получить ответ :-) В общем, сомнительное решение. 2) Более заморочный вариант: 2.1) Создать руками BlockingQueue. 2.2) Передать его в ThreadPoolExecutor. 2.3) Класть задачи не в ThreadPoolExecutor, а напрямую в BlockingQueue. 2.4) Если какой-то TaskRunnable слишком долго выполняется, то форсировать его завершение, и класть в конец этой очереди. Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79. 80. 81. 82. 83. 84. 85. 86. 87. 88. 89. 90. 91. 92. 93. 94. 95. 96. 97. 98. 99. 100. 101. 102. 103. 104. 105. 106. 107. 108. 109. 110. 111. 112. 113. 114. 115. 116. 117. 118. 119. 120. 121. 122. 123. 124. 125. 126. 127. 128. 129. 130. 131. 132. 133. 134. 135. 136. 137. 138. 139. 140. 141. 142. 143. 144. 145. 146. 147. 148. 149. 150. 151. 152. 153. 154. 155. 156. 157. 158. 159. 160. 161. 162. 163. 164. 165. 166. 167. 168. 169. 170. 171. 172. 173. 174. 175. 176. 177. 178. 179. 180. 181. 182. 183. 184. 185. 186. 187. 188. 189. 190. 191. 192. 193. 194. 195. 196. 197. 198. 199. 200. 201. 202. 203. 204. 205. 206. 207. 208. 209. 210. 211. 212. 213. 214. 215. 216. 217. 218. 219. 220. 221. 222. 223. 224. 225. 226. 227. 228. 229. 230. P.S.: Ну и помните дисклеймер про наличие багов. Это не production code, а демонстрация идеи. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.12.2013, 00:25:28 |
|
||
|
Любителям поломать голову над многопоточным кодом
|
|||
|---|---|---|---|
|
#18+
забыл ник, Вы знаете, у меня когда-то тоже была подобная проблема, унаследованная система, куча кода (вызов soap-сервиса из jsf-бина был довольно долгий после 6-ти шагов визарда). Правда, долго (около 1 минуты ) выполнялся только последний шаг (возможно это у Вас не так). Так вот, в результате, в голове тоже начались появляться куча мыслей там, асинхронность...., пулы, оптимизации и прочие технические пакости. Все это естественно требовало время, тем более что код не мой. Так вот, ломая голову, ко мне подошел чел из UX и предложил очень простой вариант: давать фид-бек пользователю о состоянии выполнения запроса. Т.е. юзер кликает финиш, и вместо того чтобы страница "зависала" на целую минуту, выводилось просто окно состояния выполнения операции (с апдейтом в каждые 7-8 сек.) т.к. "самое страшное для нас это не знание" (С) не помню кто) Например: 1) Подготовка запроса 2) Передача данных 3) Обработка данных ну и т.д. Для кого-то это может показаться смешным, однако это работает, причем работает очень хорошо. После этого использовал этот метод еще пару раз (Естественно главное не перегнуть палку ;) ) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.12.2013, 02:20:53 |
|
||
|
Любителям поломать голову над многопоточным кодом
|
|||
|---|---|---|---|
|
#18+
А использовать для этого quartz не получится? тынц Очередная кнопка Next пользователя в другой jvm случайно не может быть обработана по какой-нибудь причине? А так все ж fail-over будет. Правда в БД придется таблички под это создавать, но как вариант рассмотреть quartz? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.12.2013, 03:07:16 |
|
||
|
Любителям поломать голову над многопоточным кодом
|
|||
|---|---|---|---|
|
#18+
cdtyjv забыл ник , ... 2) Более заморочный вариант 2.1) Создать руками BlockingQueue. 2.2) Передать его в ThreadPoolExecutor. 2.3) Класть задачи не в ThreadPoolExecutor, а напрямую в BlockingQueue. 2.4) Если какой-то TaskRunnable слишком долго выполняется, то форсировать его завершение, и класть в конец этой очереди. ...Практически тот вариант, который я предложил... И ещё вопрос на понимание к забыл ник , а вообще-то, по определению, визард предполагает исполнение задач уже после того как все данные в ходе его прохождения будут получены... может рассмотреть вариант набора данных в ходе прохождения визарда и только по нажатию кнопки "Готово" запускать на выполнение задачи? Ну и соответственно, исходя из условий задачи, (ну и здравой логики), не давать выполняться новым задачам от одного и того-же пользователя, пока предыдущие не будут выполнены, а то получается что он может сначала запустить что-то на создание информации в базе, а затем следом на изменение, при этом создание ещё не завершилось, а изменение не понятно чего уже началось => неконсистентность данных... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.12.2013, 06:46:22 |
|
||
|
Любителям поломать голову над многопоточным кодом
|
|||
|---|---|---|---|
|
#18+
забыл ник , Я тут подумал - не катит мое решение. Не могу толком сказать почему, но прям вот нутром чую, что это засада какая-то. Более того, у нас тут есть еще один источник starvation - это метод awaitCompletion. Если юзер кликнул F5 в одном окне, а в другом постоянно плодит новые задачи, то мы никогда не выйдем из awaitCompletion, то есть рефреш по F5 никогда не завершится. Я предлагаю поменять данное требование: ждать не окончание всех задач для данного id, а окончание той задачи, которая была последней на момент клика на F5. Тогда решение может выглядеть так (помним про баги): Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79. 80. 81. 82. 83. 84. 85. 86. 87. 88. 89. 90. 91. 92. 93. 94. 95. 96. 97. 98. 99. 100. 101. 102. 103. 104. 105. 106. 107. 108. 109. 110. 111. 112. 113. 114. 115. 116. 117. 118. 119. 120. 121. 122. 123. 124. 125. 126. 127. 128. 129. 130. 131. 132. 133. 134. 135. 136. 137. 138. 139. 140. 141. 142. 143. 144. 145. 146. 147. 148. 149. 150. 151. 152. 153. 154. 155. 156. 157. 158. 159. 160. 161. 162. 163. 164. 165. 166. 167. 168. 169. 170. 171. 172. 173. 174. 175. 176. 177. 178. 179. 180. 181. 182. 183. 184. 185. 186. 187. 188. 189. 190. 191. 192. 193. 194. 195. 196. 197. 198. 199. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.12.2013, 10:56:40 |
|
||
|
Любителям поломать голову над многопоточным кодом
|
|||
|---|---|---|---|
|
#18+
забыл никЕсть визард, юзер заполнил страницу, нажал некст - по бизнес-логике мне надо заслать данные в веб-сервис, но он калечный и время выполнения 5-20 сек, которые юзер вынужден ждать, прежде чем ему покажется новый скрин(оно и так на аяксе работает). Так как страница 2 содержит в скрытых полях и данные с первой страницы, и так далее - то пришла идея - а зачем мучать пользователя, то есть мы ацептаем данные, ложим их в какую-то очередь, рендерим следующую страницу. Пока пользователь заполняет следующую страницу, таск выполняется асинхронно. Т.е. есть должна быть hashmap<ID пользователя, состояние мастера> Когда приходит submit с формы смотрим, что там с сохранённым состоянием. Если пришёл следующий к сохранённому шаг- всё хорошо, дополняем данными. Если нет- что-то там говорим. Вызов сервиса- наверное в отдельных сервисных потоках. -------------- Хотя вообще интересно- первоначально было " То есть если выполняется таск для 1 страницы, в это время пришли со 2 и с 3, надо сделать так чтобы 2 вообще не выполнялся, а сразу 3(когда закончится таки 1)." А что если сервис звать только для шага 4, а до этого копить данные? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.12.2013, 16:36:11 |
|
||
|
Любителям поломать голову над многопоточным кодом
|
|||
|---|---|---|---|
|
#18+
cdtyjv 2) Более заморочный вариант: 2.1) Создать руками BlockingQueue. 2.2) Передать его в ThreadPoolExecutor. 2.3) Класть задачи не в ThreadPoolExecutor, а напрямую в BlockingQueue. 2.4) Если какой-то TaskRunnable слишком долго выполняется, то форсировать его завершение, и класть в конец этой очереди. Вот что-то такое я и пытался сделать первоначально cdtyjvP.S.: Ну и помните дисклеймер про наличие багов. Это не production code, а демонстрация идеи. угу, это все понятно. В общем ладно, я видел ваш последний вариант, пока занят другими делами, думаю в течение недели дойдут руки посмотреть, потом отпишусь, на самом деле допилил свой вариант, но он выглядит коряво, если ваш работает корректно, покажу разработчикам, что им понятнее пусть и выбирают, им же поддерживать ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.12.2013, 17:50:11 |
|
||
|
Любителям поломать голову над многопоточным кодом
|
|||
|---|---|---|---|
|
#18+
mvn3забыл ник, Вы знаете, у меня когда-то тоже была подобная проблема, унаследованная система, куча кода (вызов soap-сервиса из jsf-бина был довольно долгий после 6-ти шагов визарда). Правда, долго (около 1 минуты ) выполнялся только последний шаг (возможно это у Вас не так). Так вот, в результате, в голове тоже начались появляться куча мыслей там, асинхронность...., пулы, оптимизации и прочие технические пакости. Все это естественно требовало время, тем более что код не мой. Так вот, ломая голову, ко мне подошел чел из UX и предложил очень простой вариант: давать фид-бек пользователю о состоянии выполнения запроса. Т.е. юзер кликает финиш, и вместо того чтобы страница "зависала" на целую минуту, выводилось просто окно состояния выполнения операции (с апдейтом в каждые 7-8 сек.) т.к. "самое страшное для нас это не знание" (С) не помню кто) Например: 1) Подготовка запроса 2) Передача данных 3) Обработка данных ну и т.д. Для кого-то это может показаться смешным, однако это работает, причем работает очень хорошо. После этого использовал этот метод еще пару раз (Естественно главное не перегнуть палку ;) ) Все правильно, только в момем случае юзерам наплевать на статус задачи, для них просто нужно чтобы было быстро и корректно, они понятия не имеют что там вызываются какие-то веб-сервисы и тп. Если бы нужно было следить за статусом, непременно делал бы что-то похожее на то что вы предложили. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.12.2013, 17:51:46 |
|
||
|
Любителям поломать голову над многопоточным кодом
|
|||
|---|---|---|---|
|
#18+
kagaxА использовать для этого quartz не получится? тынц Очередная кнопка Next пользователя в другой jvm случайно не может быть обработана по какой-нибудь причине? А так все ж fail-over будет. Правда в БД придется таблички под это создавать, но как вариант рассмотреть quartz? а чем тут quartz помог бы? Разверните мысль, хотя в принципе скажу сразу - что у нас БД в принципе нет:) SOA мать ее ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.12.2013, 17:52:53 |
|
||
|
Любителям поломать голову над многопоточным кодом
|
|||
|---|---|---|---|
|
#18+
Alex KuznetsovИ ещё вопрос на понимание к забыл ник , а вообще-то, по определению, визард предполагает исполнение задач уже после того как все данные в ходе его прохождения будут получены... может рассмотреть вариант набора данных в ходе прохождения визарда и только по нажатию кнопки "Готово" запускать на выполнение задачи? Ну и соответственно, исходя из условий задачи, (ну и здравой логики), не давать выполняться новым задачам от одного и того-же пользователя, пока предыдущие не будут выполнены, а то получается что он может сначала запустить что-то на создание информации в базе, а затем следом на изменение, при этом создание ещё не завершилось, а изменение не понятно чего уже началось => неконсистентность данных... Вопросы хорошие, но специфика задачи такова, что все эти места обдуманы, там все удет ок. А выполнять все по кнопке Готово нельзя - потому что юзер может нажать Ф5 на любой странице и тп. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.12.2013, 17:56:35 |
|
||
|
Любителям поломать голову над многопоточным кодом
|
|||
|---|---|---|---|
|
#18+
Alexey TominА что если сервис звать только для шага 4, а до этого копить данные? Нельзя, юзер может нажать ф5, плюс в любой момент нажать сейвЕкзит - и в этот момент опять надо ждать пока все таски выполнятся. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.12.2013, 17:59:47 |
|
||
|
Любителям поломать голову над многопоточным кодом
|
|||
|---|---|---|---|
|
#18+
забыл ника чем тут quartz помог бы? Разверните мысль, хотя в принципе скажу сразу - что у нас БД в принципе нет:) SOA мать ее 1) при нажатии на кнопку создаем новую job1 в quartz с идентификатором entityNumber (с указанием, что запускать нужно сразу) 2) при нажатии очередной раз кнопки "Next" создаем новую job2. После чего создаем ( JobChangedJobListener ), в котором указываем, что запускать job2 нужно после job1. База данных не обязательна - она нужна только на тот случай, чтобы, если jvm остановится, то запланированные job-ы будут выполнены после нового запуска jvm. Ну, или их подхватит и довыполнит другая jvm из кластера. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.12.2013, 18:28:02 |
|
||
|
Любителям поломать голову над многопоточным кодом
|
|||
|---|---|---|---|
|
#18+
kagax 1) при нажатии на кнопку создаем новую job1 в quartz с идентификатором entityNumber (с указанием, что запускать нужно сразу) 2) при нажатии очередной раз кнопки "Next" создаем новую job2. После чего создаем ( JobChangedJobListener ), в котором указываем, что запускать job2 нужно после job1. А что если пока выполняется таск 1 пришли таск2-4, мне нужно выполнить только 4. Ну и плюс нужна возможность ждать пока все джобы выполняться и тд. В общем теже яйца, вид сбоку, смысла тянуть либу нет никакого. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.12.2013, 18:45:34 |
|
||
|
|

start [/forum/topic.php?fid=59&msg=38515583&tid=2127881]: |
0ms |
get settings: |
6ms |
get forum list: |
16ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
270ms |
get topic data: |
7ms |
get forum data: |
2ms |
get page messages: |
37ms |
get tp. blocked users: |
1ms |
| others: | 201ms |
| total: | 546ms |

| 0 / 0 |
