Описание проблемы
Я столкнулся с проблемой некоторое время назад, и данные сбивали с толку, когда у меня были повторяющиеся запросы во внутреннем системном вызове.
Условия возникновения: принял запрос, и запрос не был выполнен, и тот же запрос был принят, что привело к ошибке данных (если предыдущий запрос был выполнен, не будет проблем с тем же запросом немедленно)
Анализ проблем : он вызван грязным чтением базы данных
Идеи решения проблем
1. Добавьте большой замок (это самый простой способ его реализовать, но производительность беспокоит, и он будет блокировать запросы)
2. Реализуйте перехват запроса (может быть обмен, но как его реализовать - это проблема, как его реализовать элегантно и облегчить повторное использование)
3. Измените и реализуйте (изменения будут внесены в исходный код, который рискован, и самое главное, что его нельзя поделиться)
Окончательный метод реализации
Реализовано аннотацией +Spring AOP
использовать
Несмотря на любой метод
Класс 1:
Импорт статический java.lang.annotation.elementtype.method; импорт java.lang.annotation.documented; импорт java.lang.annotation.retention; импорт java.lang.annotation.retentionpolicy; импорт. java.lang.annotation.target; @target ({method})@horesting(retentionpolicy.runtime)@documentedPublic @Interface notDuplicate {}Категория 2:
Импорт java.lang.reflect.method; import java.util.set; import java.util.concurrent.concurrentskiplistset; import org.aspectj.lang.proudingjointpoint; импорт org.aspectj.lang.annotation.around; import org.aspectj.lang.lang.annotation.aspect.aspept. org.aspectj.lang.annotation.pointcut; import org.aspectj.lang.reflect.methodsignature; import org.springframework.stepolypement.component;@Ampoory@ComponentPublic Class notduplicateaop {Private Static Final Final Set <strest> key = new concurrentskiplistset <> (); @Pointcut (" @annotation (com.hhly.skeleton.base.filter.notduplicate)") public void duplicate () {} / ** * Параметр проверка после перехвата метода * @param pjp * @retun Methodignature msig = (methodignature) pjp.getSignature (); Метод currentMethod = pjp.getTarget (). GetClass (). GetMethod (msig.getName (), msig.getParameterTypes ()); // Сплит подпись StringBuilder sb = new StringBuilder (currentMethod.toString ()); Object [] args = pjp.getargs (); for (объект объекта: args) {if (object! = null) {sb.append (object.getClass (). toString ()); sb.append (object.tostring ()); }} String sign = sb.toString (); логический успех = key.add (sign); if (! Успех) {бросить новый ServiceRuntimeexception («Этот метод выполняется и не может быть повторен»); } try {return pjp.proecd (); } наконец {key.remove (sign); }}}Вышеуказанное - это все контент и связанные с ними коды, которые я сказал вам на этот раз. Если у вас есть какие -либо вопросы, вы можете обсудить их в области комментариев ниже. Спасибо за поддержку Wulin.com.