Make PersistenceManager Less Error Prone #83
@ -28,15 +28,13 @@ public final class PersistenceManager {
|
||||
* @since Envoy Server Standalone v0.1-alpha
|
||||
*/
|
||||
private PersistenceManager() {
|
||||
Runtime.getRuntime().addShutdownHook(new Thread(() -> {
|
||||
transaction.begin();
|
||||
Runtime.getRuntime().addShutdownHook(new Thread(() -> transaction(() -> {
|
||||
ConnectionManager.getInstance()
|
||||
.getOnlineUsers()
|
||||
.stream()
|
||||
.map(this::getUserByID)
|
||||
.forEach(user -> { user.setStatus(UserStatus.OFFLINE); user.setLastSeen(Instant.now()); entityManager.merge(user); });
|
||||
transaction.commit();
|
||||
}));
|
||||
})));
|
||||
}
|
||||
|
||||
/**
|
||||
@ -239,10 +237,7 @@ public final class PersistenceManager {
|
||||
c2.getContacts().add(c1);
|
||||
|
||||
// Synchronize changes with the database
|
||||
transaction.begin();
|
||||
entityManager.merge(c1);
|
||||
entityManager.merge(c2);
|
||||
transaction.commit();
|
||||
transaction(() -> { entityManager.merge(c1); entityManager.merge(c2); });
|
||||
}
|
||||
|
||||
/**
|
||||
@ -254,47 +249,33 @@ public final class PersistenceManager {
|
||||
return entityManager.createNamedQuery(User.findContacts).setParameter("user", user).getResultList();
|
||||
}
|
||||
|
||||
private void persist(Object obj) {
|
||||
private void persist(Object obj) { transaction(() -> entityManager.persist(obj)); }
|
||||
|
||||
private void merge(Object obj) { transaction(() -> entityManager.merge(obj)); }
|
||||
|
||||
private void remove(Object obj) { transaction(() -> entityManager.remove(obj)); }
|
||||
|
||||
/**
|
||||
* Performs a transaction with the given Runnable, that should somewhere call
|
||||
* {@link EntityManager}.
|
||||
*
|
||||
* @param entityManagerRelatedAction the action that changes something in the
|
||||
* database
|
||||
* @since Envoy Server v0.3-beta
|
||||
*/
|
||||
private void transaction(Runnable entityManagerRelatedAction) {
|
||||
try {
|
||||
transaction.begin();
|
||||
entityManager.persist(obj);
|
||||
entityManagerRelatedAction.run();
|
||||
transaction.commit();
|
||||
|
||||
// Last transaction threw an error resulting in the transaction not being closed
|
||||
} catch (final IllegalStateException e) {
|
||||
if (transaction.isActive()) {
|
||||
transaction.rollback();
|
||||
persist(obj);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void merge(Object obj) {
|
||||
try {
|
||||
transaction.begin();
|
||||
entityManager.merge(obj);
|
||||
entityManagerRelatedAction.run();
|
||||
transaction.commit();
|
||||
|
||||
// Last transaction threw an error resulting in the transaction not being closed
|
||||
} catch (final IllegalStateException e) {
|
||||
if (transaction.isActive()) {
|
||||
transaction.rollback();
|
||||
merge(obj);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void remove(Object obj) {
|
||||
try {
|
||||
transaction.begin();
|
||||
entityManager.remove(obj);
|
||||
transaction.commit();
|
||||
|
||||
// Last transaction threw an error resulting in the transaction not being closed
|
||||
} catch (final IllegalStateException e) {
|
||||
if (transaction.isActive()) {
|
||||
transaction.rollback();
|
||||
remove(obj);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user