无法在 Quarkus 中使用托管执行程序保留实体
Unable to persist entity with managed executor in Quarkus
我无法在 Quarkus 中使用 ManagedExecutor 持久化实体。
managedExecutor.runAsync(() -> {
User user = User.findById(userId);
if (user == null) {
return;
}
BigDecimal amount;
try {
amount = new BigDecimal(split[1]);
} catch (NumberFormatException e) {
throw new BadRequestException("Invalid amount: " + split[1] + ", " + e.getMessage());
}
managedExecutor.runAsync(threadContext.contextualRunnable(new Runnable() {
@Override
@Transactional
@ActivateRequestContext
public void run() {
user.minimumAmount = amount;
user.persistAndFlush();
}
}));
sendMessage(userId, new NewMinimumAmountMessage(user.minimumAmount));
});
现在没有抛出异常,执行 persistAndFlush() 后也没有任何异常。
我试图将持久化放在初始的 runAsync 中,但这也不起作用。
这里的代码是一个用@OnMessage注解的websocket函数,把@Transactional放在这里没有任何作用。
ManagedExecutor 和 ThreadContext 都被注入了。
我能够修复它,但我知道这不是正确的方法。
Response response = given()
.auth().oauth2(token)
.header("Bearer", token)
.header("Content-Type", "application/json")
.when().put("/api/user/amount/" + split[1])
.thenReturn();
我在资源中添加了一个路径,并使用测试函数调用它。
我无法在 Quarkus 中使用 ManagedExecutor 持久化实体。
managedExecutor.runAsync(() -> {
User user = User.findById(userId);
if (user == null) {
return;
}
BigDecimal amount;
try {
amount = new BigDecimal(split[1]);
} catch (NumberFormatException e) {
throw new BadRequestException("Invalid amount: " + split[1] + ", " + e.getMessage());
}
managedExecutor.runAsync(threadContext.contextualRunnable(new Runnable() {
@Override
@Transactional
@ActivateRequestContext
public void run() {
user.minimumAmount = amount;
user.persistAndFlush();
}
}));
sendMessage(userId, new NewMinimumAmountMessage(user.minimumAmount));
});
现在没有抛出异常,执行 persistAndFlush() 后也没有任何异常。 我试图将持久化放在初始的 runAsync 中,但这也不起作用。
这里的代码是一个用@OnMessage注解的websocket函数,把@Transactional放在这里没有任何作用。
ManagedExecutor 和 ThreadContext 都被注入了。
我能够修复它,但我知道这不是正确的方法。
Response response = given()
.auth().oauth2(token)
.header("Bearer", token)
.header("Content-Type", "application/json")
.when().put("/api/user/amount/" + split[1])
.thenReturn();
我在资源中添加了一个路径,并使用测试函数调用它。