考慮下面的代碼片段。MQ 偵聽器執行 2 項活動 - 1. 持久化 MQ 中收到的物件 2. 向 100 個設備發送 APNS 通知。
@JmsListener(destination = "${mq.queue.name}")
public void receiveMessage(String user) throws IOException {
try {
UserDetailsVO userObject = mapper.readValue(user, UserDetailsVO.class);
String result=persistUserDetails(userObject);
if(result.equalsIgnoreCase("success")) {
userService.sendAPNS(); //Sends notification to 100 devices
}
}
catch(Exception e)
{
logger.error(Error processing MQ message);
}
}
public String persistUserDetails(UserDetailsVO userObject) {
userDao.save(); // Using hibernate method
return "success";
}
public void sendAPNS() {
// sending APNS to devices
}
這里即使在 sendAPNS() 之前呼叫了 persistUserDetails() 函式,用戶物件也不會立即保存在資料庫中。相反,它等待 sendAPNS() 完成活動,然后將資料保存在表中。我需要立即保留用戶詳細資訊,而不是等待整個執行完成。我應該做出哪些改變?
JPA 配置屬性如下所示:
spring.jpa.hibernate.ddl-auto = update
spring.jpa.properties.hibernate.dialect = org.hibernate.dialect.MySQL5InnoDBDialect
spring.jpa.properties.hibernate.show_sql=false
spring.jpa.properties.hibernate.jdbc.time_zone=UTC
uj5u.com熱心網友回復:
如果需要將 SQL 陳述句發送到資料庫,可以entityManager.flush()在持久化后呼叫。但是在完整的執行完成之前,事務仍然不會被提交。
如果您需要在發送訊息之前提交資料庫事務,則需要將持久呼叫包裝在啟動新事務的服務中。例如,在 EJB 中,這將是具有事務屬性的方法REQUIRES_NEW。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/493981.html
