我嘗試在 Quartz 調度程式上創建集成測驗。
我有 2 個表:events和tasks。調度程式通過 cron 觸發器按事件創建任務。
@SneakyThrows
@Test
public void taskGenerationBeanTest() {
RequestData request = requestBuilder(str(), str(), str()).build();
String orderId = String.valueOf(UUID.randomUUID());
Event event1 = getEvent("type1", request, orderId);
Event event2 = getEvent("type2", request, orderId);
eventRepository.save(event1);
eventRepository.save(event2);
Thread.sleep(20000);
List<Event> events = eventRepository.findAll();
Thread.sleep(1000);
List<Task> actual = taskRepository.findAll();
assertAll(
() -> assertEquals(2, actual.size()),
() -> assertTrue(actual.stream().anyMatch(t ->
"type1".equals(t.getEvent().getEventType()))),
() -> assertEquals(event1.getOrderId(), actual.get(0).getEvent().getOrderId())
);
}
首先,我得到例外:
無法初始化代理 - 沒有會話
我使用這個答案Spring Data JPA - “無法初始化代理 - 沒有會話” - 方法標記為事務性并添加spring.jpa.properties.hibernate.enable_lazy_load_no_trans=true
到我的測驗配置中。所以現在我遇到了另一個問題 - 我的測驗有時是正確的,但更多時候它會失敗,因為它只創建了 1 個task。
方法,由Quartz執行:
@Override
@Transactional(isolation = Isolation.REPEATABLE_READ)
public int createAndSaveTasks(EventType eventType) {
List<Task> tasks = eventService.getEvent(eventType)
.stream()
.map(Task::new)
.collect(Collectors.toList());
taskRepository.saveAll(tasks);
return tasks.size();
}
那么如何正確地使用 Quarts 和事務創建集成測驗呢?
uj5u.com熱心網友回復:
測驗類使用存盤庫的 findAll 方法,如果您嘗試獲取 LAZY 初始化方法,則會出現此例外。
在斷言中:
t.getEvent().getEventType() // can throw it
actual.get(0).getEvent() // can throw it
為了避免它,也許您可??以將其設為事務性或優先獲取型別。
在 REPEATABLE READ 下,第二個 SELECT 保證至少顯示從第一個 SELECT 回傳的行不變。一分鐘內并發事務可能會添加新行,但不能洗掉或更改現有行。
“讀已提交”和“可重復讀”之間的區別
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/329752.html
上一篇:Spring引導變數/嵌套請求體
