- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
使用 Java 的 play Framework 2.5
我想创建一个应用程序,它使用来自 ActiveMQ 的数据,并根据收到的消息对数据库执行一个 hibernate 查询并存储一个 User 对象。我简化了我的消费者类,以便在那里创建一个对象并同时调用持久性。
当我从接收测量的线程(或调用另一个类)调用持久性时,我的问题就出现了。然后 EntityManager 不存在,我无法创建一个新的,或者坦率地说,我不知道如何在 Play 中创建它。
package controllers;
import javax.jms.Connection;
import javax.jms.Destination;
import javax.jms.ExceptionListener;
import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.MessageConsumer;
import javax.jms.Session;
import javax.jms.TextMessage;
import org.apache.activemq.ActiveMQConnectionFactory;
import models.User;
import play.Logger;
import play.db.jpa.JPA;
public class MessageConsumerController implements Runnable, ExceptionListener {
private static final String TOPIC_NAME = "miguelTopic";
private static Thread consumerService;
public static synchronized void initService() {
Logger.info("Message Consumer initialized");
MessageConsumerController MessageConsumer = new MessageConsumerController();
if (consumerService != null) {
Logger.info("STOPPING MessageConsumer thread.");
consumerService.interrupt();
}
Logger.info("Starting MessageConsumer thread.");
consumerService = new Thread(MessageConsumer);
consumerService.setDaemon(true);
consumerService.setName("MessageConsumer Service");
consumerService.start();
Logger.info("MessageConsumer thread started.");
}
@Override
public void run() {
try {
ActiveMQConnectionFactory connectionFactory = new ActiveMQConnectionFactory("admin", "admin",
"tcp://localhost:61616");
Logger.info("Creating ActiveMQ connection");
Connection connection = connectionFactory.createConnection();
connection.start();
connection.setExceptionListener(this);
Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
Logger.info("Connecting to topic " + TOPIC_NAME);
Destination destination = session.createTopic(TOPIC_NAME);
Logger.info("Creating consumer");
MessageConsumer consumer = session.createConsumer(destination);
while (!Thread.currentThread().isInterrupted()) {
Logger.info("Wait for messages...");
Message message = consumer.receive();
if (message instanceof TextMessage) {
TextMessage textMessage = (TextMessage) message;
String text = textMessage.getText();
Logger.info("Received: " + text);
User user = new User();
user.setId(555);
user.setName("miguel");
user.setTime_of_start("time");
Logger.info("insert user");
//JPAApi jpa = Play.current().injector().instanceOf(JPAApi.class);
JPA.em().getTransaction().begin();
JPA.em().persist(user); //
JPA.em().getTransaction().commit();
} else {
Logger.info("Received: " + message.getClass().getSimpleName());
}
}
Logger.info("Message consumer interrupted.");
consumer.close();
session.close();
connection.close();
} catch (Exception e) {
if (e instanceof InterruptedException) {
Logger.info("Message Consumer thread interrupted.");
} else {
Logger.error(e.getLocalizedMessage(), e);
}
}
}
public synchronized void onException(JMSException ex) {
Logger.error("JMS Exception occured. Shutting down client.");
Logger.error("ErrorCode=" + ex.getErrorCode() + " , " + ex.getMessage(), ex);
}
}
我尝试过注入(inject) JPaapi 以及许多其他不同的东西,但我对 Play Framework 几乎是新手
最佳答案
首先,在 Play Framework 中我建议使用 Akka actor 而不是传统的 java 线程。乍一看可能很复杂,但是一旦掌握了它的窍门,它将节省大量调试时间。 Akka 已经集成到 Play 中,所以这应该不是问题。
现在,关于您的实体管理器。首先,确保 sbt 构建文件中有 java JDBC:libraryDependency += javaJdbc
接下来,在配置文件中确保配置了默认 DS:db.default.jndiName=DefaultDS
以及持久性单元(更多信息:https://www.playframework.com/documentation/2.5.x/JavaJPA)
现在,您的 Controller (我在您发布的代码中没有看到实际的 Controller )必须具有 @Transactional
注释。
关于java - Play Framework 2.5 在另一个线程中接收数据时没有 EntityManager 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40792049/
有一些使用多个数据源的示例: @Inject @DataSource("users") AgroalDataSource dataSource1; @Inject @DataSource("inven
我试图使用持久性和 servlet guice 扩展,让简单的 webapp 在 Jetty 上与 Guice 和 JPA 一起工作。 我写了这个服务实现类: public class PersonS
我使用 Hibernate 5.1.0.Final、Guice、Jersey。我有创建 EntityManagerFactory 的 HibernateModule并管理EntityManager实例
我正在使用 ThreadLocal 和请求/实体模式来获取实体。这种情况发生时,我关闭了一个实体管理器,并且在后台有一些实体可以编辑、复制和修改,然后我想将其保留或与新的实体管理器合并。我不知道这是一
好的,我正在使用 EJB 3.0 和 hibernate,我们将 .ear 文件放入嵌入 Apache Tomcat 6.0.18 的 Easy-Beans 1.0.1(带有 Hibernate)部署
我正在使用 Spring + JPA + Hibernate + EntityManager 与数据库对话。我收到“A JTA EntityManager cannot use getTransact
更新数据库时我应该更喜欢什么?这两种方法的优缺点是什么?我什么时候应该使用其中一种? public void disemployEmployee(Integer employeeId, Date en
我正在尝试在存储库中注入(inject) EntityManager。 编译成功,但是当我运行应用程序并发送一个发布请求时,我收到了这个错误: Unexpected error occurred: F
我正在尝试在 Spring Tools Suite 和 Pivotal tc Server Developer Edition 上开发 Spring+Hibernate+EntityManager+S
我有一个使用 spring boot + spring data JPA 的示例项目。在日志中,我观察到 EntityManagers 在我进行第一次 rest 调用之前被创建了几次。请澄清为什么会发
给定网络应用程序中的以下情况: // EntityManager em, one per Request with Spring's OpenEntityManagerInViewFilter //
当我们在 JAVA EE 环境中的 EntityManager 上使用 @PersistenceContext 注释时,容器将创建 entityManagerFactory(我猜是整个 session
我遇到了一种情况(我认为这很奇怪,但可能很正常),我使用 EntityManager.getReference(LObj.getClass(), LObj.getId()) 来获取数据库实体,然后通过
我有以下服务... @Stateless @LocalBean public class RandomService { @EJB RandomString stringTokenizer;
我在实体类中有这个函数,但 getDoctrine 不喜欢...... public function getObject() { $em = $this->getDoctrine()->ge
我正在尝试以级联方式保存某个对象并检索它。 我有 3 个对象超过 3 个实体。 实体: class Order { /** * @var integer $id *
我正在开发一个 JPA 应用程序(使用 hibernate ),我正在与 作斗争。自动冲洗 特征。 默认情况下,每当我们处理对任何实体的查询时,完整的 实体管理器 被冲洗。在大多数情况下这是可以的:我
我刚刚建立了一个到目前为止仍然非常小的项目 maven/jpa/hibernate 项目,我试图在其中持久化一个对象。 我的类(class)是一个非常简单的类(class): @Entity publ
我当前的项目使用 HSQLDB2.0 和 JPA2.0 。 场景是:我查询数据库以获取 contactDetails 的列表的 person .我删单contactInfo在 UI 中,但不保存该数据
我是 jpa 和 spring 世界的新手,我目前正在对一个简单的方法进行一些单元测试,但只有当我在单元测试模式下运行我的测试类时才会继续收到此错误消息: java.lang.IllegalState
我是一名优秀的程序员,十分优秀!