我有一个接收数据的 websocket,我想用这些数据进行一些数据库操作。这是我的代码的简化版本:
import javax.enterprise.context.ApplicationScoped;
import javax.enterprise.event.Event;
import javax.inject.Inject;
import javax.websocket.OnMessage;
import javax.websocket.server.ServerEndpoint;
@ServerEndpoint("/my_socket")
@ApplicationScoped
public class MySocket {
@Inject
Event<MySocketMessage> messageEvent;
@OnMessage
public void onMessage(String message) {
messageEvent.fire(new MySocketMessage(message));
}
}
public class MySocketMessage {
private final String message;
public MySocketMessage(String message) {
this.message = message;
}
public String getMessage() {
return this.message;
}
}
import javax.enterprise.context.ApplicationScoped;
import javax.enterprise.event.Observes;
import javax.inject.Inject;
import javax.persistence.EntityManager;
@ApplicationScoped
public class MyDatabaseHandler {
@Inject
EntityManager entityManager;
public void handleMessage(@Observes MySocketMessage message) {
// Do some blocking database operations
Object entity = new Object(message.getMessage());
entityManager.persist(entity);
}
}
在单元测试中执行此代码不会出现任何问题。但是当我运行该应用程序时,我收到此异常:
2021-07-27 15:35:14,667 ERROR [ch.scs.mbv.veg.web.ScannerSocket] (vert.x-eventloop-thread-7) The my socket encountered the following error: : java.lang.IllegalStateException: You have attempted to perform a blocking operation on a IO thread. This is not allowed, as blocking the IO thread will cause major performance issues with your application. If you want to perform blocking EntityManager operations make sure you are doing it from a worker thread.
at io.quarkus.hibernate.orm.runtime.session.TransactionScopedSession.checkBlocking(TransactionScopedSession.java:110)
at io.quarkus.hibernate.orm.runtime.session.TransactionScopedSession.persist(TransactionScopedSession.java:134)
at io.quarkus.hibernate.orm.runtime.session.ForwardingSession.persist(ForwardingSession.java:53)
at
...
我知道我不应该在 IO 线程上执行阻塞操作,但我不关心程序的性能,因为它只有一个用户。这也是我没有(也不想)使其成为反应性的原因。快速搜索表明,这里已经回答了一个非常相似的问题:阻塞 EntityManager 操作 https://stackoverflow.com/questions/60778512/blocking-entitymanager-operations因此,我尝试将 @Blocking 注释放在代码中的多个位置,但这根本没有任何效果,异常不断弹出。我缺少什么?任何帮助将非常感激!!!