|
分類:[Java]
こんにちは。
SpringBoot2.6.6、JDK1.8で開発してます。
下記の様な2つのServiceを呼んだ処理を実装し、正常系では@DB登録AMQ送信は正しく動いてます。
ここでMQ側でエラーを起こ(MQサーバを落とす)し、その場合@のDB登録もロールバックしてくれるよう、Serviceそれぞれに@Transactionalを
メソッドに付与しているのですが、ロールバックされてません。
ぐぐるとメソッドは必ずpublic、ExceptionはRuntimeException以下のものでなければ関知しないとの事でラップしているつもりなのですが、コミットされてしまいます。。
こちら、何が悪いかご存じの方いらっしゃいましたら、宜しくお願いします。
●Controller
@RestController
public class TestController {
@Autowired
private MqService mqService;
@Autowired
private DbService dbService;
@GetMapping("/a")
public JsonResult execute_a(@Validated ARequestInfo form, BindingResult validate) throws Exception {
JsonResult result = new JsonResult();
// 複数件登録
for (int i = 0; i < 3; i++) {
try {
// @DB登録
String[] params = {String.valueOf(i + 1), form.getName(), form.getAge()};
dbService.insert(params);
// AMQ送信
mqService.execute(form);
result.setResult("success");
} catch (Exception e) {
e.printStackTrace();
result.setResult("error");
// break;
}
}
return result;
}
●Service1
@Configuration
@Service
public class DbService {
@Autowired
private JdbcTemplate jdbcTemplate;
@Transactional
public void insert(String[] values) {
String sql = "insert into test_user values(";
for (int i = 0 ; i < values.length; i++) {
sql = sql + " ?,";
}
sql = sql.substring(0, sql.length() - 1);
sql = sql + ")";
jdbcTemplate.update(sql, values);
}
}
●Service2
@Service
public class MqService {
@Autowired
private sendGateway gateway;
@Transactional
public void execute(Object requestInfo) throws RuntimeException {
try {
gateway.execute(message);
} catch (Exception e) {
throw new RuntimeException(e);
}
}
}
|