Java 代码发送短信有 三个状态 1 待发送 4 发送中 2 发送成功 ,我想防止 发送过程中 系统重启 导致 状态卡再 4 咋处理
根据代码中的注解@Transactional(propagation = Propagation.REQUIRED, isolation = Isolation.READ_COMMITTED)
,可以推断出send()
方法已经被事务管理了,因此不需要额外添加事务提交的代码。
如果你想在send()
方法内部的某一部分进行事务提交,可以将该部分代码提取出来,放到一个单独的方法中,并在该方法上添加事务注解@Transactional
,然后在send()
方法中调用这个新的方法。这样新的方法将独立执行事务,完成事务提交。例如:
public void send() throws Exception {
// some code
//修改状态为4 代码
// 提交事务的部分代码
commitPart();
// 下面的事务不受上面的提交影响
// rest of the code
}
@Transactional(propagation = Propagation.REQUIRES_NEW)
public void commitPart() throws Exception {
// 需要提交事务的部分代码
}
这里使用了@Transactional(propagation = Propagation.REQUIRES_NEW)
注解来创建一个新的事务。这样在commitPart()
方法内部的代码会单独执行,并完成事务提交。
在发送短信方法上加一个事务 重启会自己回滚事务的事务没提交
@Transactional(propagation = Propagation.REQUIRED, isolation = Isolation.READ_COMMITTED)
为了防止系统重启导致状态卡在4,可以在发送短信时使用Java的事务处理机制。在事务中,将状态从1改为4,然后执行发送短信的操作,如果发送成功,则将状态改为2,如果发送失败,则将状态改为1。如果在发送过程中系统重启,事务会自动回滚,状态会回到1,这样就可以避免状态卡在4的问题。
以下是一个简单的示例代码:
@Transactional(propagation = Propagation.REQUIRED, isolation = Isolation.READ_COMMITTED)
public void send(String phoneNumber, String message) {
Connection conn = null;
PreparedStatement pstmt = null;
try {
conn = getConnection();
conn.setAutoCommit(false); // 开启事务
pstmt = conn.prepareStatement("UPDATE sms SET status = ? WHERE phone_number = ?");
pstmt.setInt(1, 4); // 将状态改为4
pstmt.setString(2, phoneNumber);
pstmt.executeUpdate();
// 执行发送短信的操作
boolean success = sendSms(phoneNumber, message);
if (success) {
pstmt.setInt(1, 2); // 将状态改为2
pstmt.executeUpdate();
conn.commit(); // 提交事务
} else {
pstmt.setInt(1, 1); // 将状态改为1
pstmt.executeUpdate(); conn.rollback(); // 回滚事务
}
} catch (SQLException e) {
e.printStackTrace();
} finally {
closeConnection(conn, pstmt);
}
}