Я пытаюсь реализовать hystrix с помощью @Transactional в методе весенней загрузки.
@Transactional(transactionManager = "primaryTrnsManager")
@HystrixCommand(commandKey = "createRecord", fallbackMethod = "createRecordFallback", commandProperties = {
@HystrixProperty(name = "execution.siolation.thread.timeoutInMilliseconds",value = "1000"),
@HystrixProperty(name = "circuitBreaker.requestVoulumeThreshold",value = "20"),
@HystrixProperty(name = "circuitBreaker.sleepWindowInMilliseconds",value = "5000"),
@HystrixProperty(name = "circuitBreaker.errorThresholdPercentage",value = "50")})
public String createRecord(String name){
...............
//Dbcall
}
@Transactional(transactionManager = "backUptranManager",propagation=propagation.REQUIRES_NEW)
public String createRecordFallback(){
//dbcall
}
Что происходит, так это то, что когда происходит тайм-аут hystrix, вызов, который я сделал для базы данных, не получает откат, а hystrix возвращается к вторичному и снова вызывает базу данных с тем же запросом sql. В случае тайм-аута я хочу прервать предыдущую транзакцию и начать другую. Обычно это делает @Transactional, но с hystrix я вставляю повторяющиеся записи.
Любая помощь?




Это происходит потому, что HistryxCommand запускается в совершенно другом потоке, поэтому, когда «Histryx Admin Thread» (тот, который наблюдает за вашим командным потоком) достигает тайм-аута, он отмечает прерывание командного потока, но что происходит внутри Hyxtrix не может управлять им.
Итак, лучший подход для достижения желаемого поведения - это установить тайм-аут для транзакции или даже на уровне библиотеки jdbc, поэтому тайм-аут будет управляться изнутри командного потока, если он достигнут, исключение тайм-аута будут выброшены из командного потока, и Hyxtrix будет управлять им должным образом.