Тайм-аут Hystrix не выполняет откат транзакции при весенней загрузке - PullRequest
0 голосов
/ 26 октября 2018

Я пытаюсь реализовать 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 я вставляю дублирующиеся записи.

Любая помощь?

1 Ответ

0 голосов
/ 12 марта 2019

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

Итак, лучший подход для достижения желаемого поведения - установить тайм-аут для транзакции или даже на уровне библиотеки jdbc, поэтому тайм-аут будет управляться изнутри командного потока, если онпо истечении этого времени исключение тайм-аута будет выдано из потока команд, и Hyxtrix будет управлять им должным образом.

...