Return-Path: X-Original-To: apmail-openjpa-users-archive@minotaur.apache.org Delivered-To: apmail-openjpa-users-archive@minotaur.apache.org Received: from mail.apache.org (hermes.apache.org [140.211.11.3]) by minotaur.apache.org (Postfix) with SMTP id E70EFC437 for ; Tue, 8 May 2012 16:20:45 +0000 (UTC) Received: (qmail 20299 invoked by uid 500); 8 May 2012 16:20:45 -0000 Delivered-To: apmail-openjpa-users-archive@openjpa.apache.org Received: (qmail 20266 invoked by uid 500); 8 May 2012 16:20:45 -0000 Mailing-List: contact users-help@openjpa.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: users@openjpa.apache.org Delivered-To: mailing list users@openjpa.apache.org Received: (qmail 20257 invoked by uid 99); 8 May 2012 16:20:45 -0000 Received: from nike.apache.org (HELO nike.apache.org) (192.87.106.230) by apache.org (qpsmtpd/0.29) with ESMTP; Tue, 08 May 2012 16:20:45 +0000 X-ASF-Spam-Status: No, hits=-0.7 required=5.0 tests=RCVD_IN_DNSWL_LOW,SPF_PASS X-Spam-Check-By: apache.org Received-SPF: pass (nike.apache.org: domain of java.whoover@gmail.com designates 209.85.216.174 as permitted sender) Received: from [209.85.216.174] (HELO mail-qc0-f174.google.com) (209.85.216.174) by apache.org (qpsmtpd/0.29) with ESMTP; Tue, 08 May 2012 16:20:37 +0000 Received: by qcro28 with SMTP id o28so3592049qcr.33 for ; Tue, 08 May 2012 09:20:16 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=from:to:references:in-reply-to:subject:date:message-id:mime-version :content-type:content-transfer-encoding:x-mailer:thread-index :content-language; bh=mn3QbfzpcoIVKFaeooGyGuKZypXn8FjHKBgy0/JzJ3o=; b=zARwKU3iWf++1wJ4kBan5ikAPiRNyRrBBtuNK70c4G8BYMKCv6bPVLUhsKaOLv6v/V Q8i7U0CCaVCvi2nB7n3oEM5wK6AhxYIm4yPFo9zLNFL75Mq/yNlOj9MOgp+lDNPnjw5x JpBifyO+MpS1wme1eWQ/ly3RzZNuMKWESn6GIilz3w3AwY0QLf5wl6+bB8BvTBg1U4SG UKfcnkE51WW3ea+EQJ5hyOUm+Tw2J4qTH20Iq6OMIrM6GWl6cbKFxRpdwOKiOlPJhzMu x3op5c5RkIZ9AaJmUEWo4w9+r+rrOL1Sj79lGtGL8cxaoSwpkOstuTvCmEKO+1d9UQO0 bE3Q== Received: by 10.229.136.5 with SMTP id p5mr9522419qct.134.1336494016370; Tue, 08 May 2012 09:20:16 -0700 (PDT) Received: from HM0076 (fl.nemours.org. [192.234.253.4]) by mx.google.com with ESMTPS id i7sm4768641qae.20.2012.05.08.09.20.15 (version=TLSv1/SSLv3 cipher=OTHER); Tue, 08 May 2012 09:20:15 -0700 (PDT) From: "Will Hoover" To: References: <4fa17916.2215640a.0534.59fb@mx.google.com> In-Reply-To: Subject: RE: OpenJPA 2.2.0 + Atomikos + Embedded Jetty Date: Tue, 8 May 2012 12:20:13 -0400 Message-ID: <4fa947bf.0728e00a.1c29.ffff9f5a@mx.google.com> MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit X-Mailer: Microsoft Office Outlook 12.0 Thread-Index: Ac0tHQCK5x6a5hCATyGSW3n5riddnwAGVTCg Content-Language: en-us Hi Rick, You are correct. It isn't happening inside a transaction. -----Original Message----- From: Rick Curtis [mailto:curtisr7@gmail.com] Sent: Tuesday, May 08, 2012 9:18 AM To: users@openjpa.apache.org Subject: Re: OpenJPA 2.2.0 + Atomikos + Embedded Jetty Will - I'm betting that the em.persist(..) call isn't happening inside a transaction. Can you enable openjpa trace[1] and rerun your scenario? [1] Thanks, Rick On Wed, May 2, 2012 at 1:12 PM, Will Hoover wrote: > I have successfully setup an OpenJPA (2.2.0) + Atomikos (3.7.1) + Embedded > Jetty (8.1.2) stack (example code below). Everything seems to works without > any errors, but OpenJPA doesn't seem to recognize dirty entities after a > call to EntityManager#persist and a new EntityManager is created (see > DefaultAppServlet.java below). Any idea why this would be happening? > > ServiceManager.java > > public class ServiceManager { > > private static final Logger log = > LoggerFactory.getLogger(ServiceManager.class); > public static final String DEFAULT_PERSISTENT_UNIT = "test-pu"; > private static EntityManagerFactory factory; > private static WebServer webServer; > > public static void startServices(final String persistentUnit) { > stopServices(); > setEmFactory(null); > webServer = WebServer.start(9080); > } > public static void stopServices() { > if (webServer != null) { > webServer.stop(); > } > try { > if (factory != null && factory.isOpen()) { > factory.close(); > } > factory = null; > } catch (final Exception e) { > log.error("Unable to close " + > EntityManagerFactory.class.getSimpleName(), e); > } > } > public static final EntityManagerFactory getEmFactory() { > return factory; > } > protected static final void setEmFactory(final EntityManagerFactory > factory) { > if (ServiceManager.factory != null && > ServiceManager.factory.isOpen()) { > ServiceManager.factory.close(); > } > if (factory == null || !factory.isOpen()) { > ServiceManager.factory = Persistence. > > createEntityManagerFactory(DEFAULT_PERSISTENT_UNIT, > System.getProperties()); > } > ServiceManager.factory = factory; > } > } > > WebServer.java > > public class WebServer { > > private static final Logger log = > LoggerFactory.getLogger(WebServer.class); > private final int portNumber; > private Server server; > > private WebServer(final int portNumber) { > this.portNumber = portNumber <=0 ? 80 : portNumber; > } > public static final WebServer start() { > final WebServer webServer = new WebServer(); > final Thread webServerAgent = new > Thread(Thread.currentThread().getThreadGroup(), new Runnable() { > @Override > public void run() { > webServer.startServer(); > } > }, WebServer.class.getSimpleName() + '-' + > System.currentTimeMillis()); > webServerAgent.setDaemon(true); > webServerAgent.start(); > return webServer; > } > protected final void startServer() { > try { > final Resource serverXml = > Resource.newSystemResource("META-INF/jetty.xml"); > final XmlConfiguration configuration = new > XmlConfiguration(serverXml.getInputStream()); > server = (Server) configuration.configure(); > // set the connector based upon user settings > final SelectChannelConnector defaultConnnector = new > SelectChannelConnector(); > defaultConnnector.setPort(getPortNumber()); > server.setConnectors(new Connector[] { > defaultConnnector }); > > final EnumSet dispatchers = > EnumSet.range(DispatcherType.FORWARD, DispatcherType.ERROR); > ServletContextHandler context = new > ServletContextHandler(ServletContextHandler.SESSIONS); > context.setContextPath("/"); > context.addFilter(TransactionFilter.class, "/*", > dispatchers); > context.addServlet(DefaultAppServlet.class, "/"); > server.setHandler(context); > > server.setDumpAfterStart(true); > server.start(); > server.join(); > } catch (final Throwable e) { > log.error("Unable to start web server", e); > } > } > public final void stop() { > try { > if (server != null && !server.isStopped() && > !server.isStopping()) { > server.stop(); > } > server.destroy(); > } catch (final Exception e) { > log.error("Unable to shutdown", e); > } > } > public int getPortNumber() { > return portNumber; > } > } > > DefaultAppServlet.java > > public class DefaultAppServlet extends DefaultServlet { > > private static final Logger log = > LoggerFactory.getLogger(DefaultAppServlet.class); > public DefaultAppServlet() { > super(); > } > @Override > protected void doGet(HttpServletRequest request, HttpServletResponse > response) throws ServletException, IOException { > response.setContentType("text/html;charset=utf-8"); > response.setStatus(HttpServletResponse.SC_OK); > response.getWriter().println("

Hello Message > World

"); > try { > EntityManager em = > ServiceManager.getEmFactory().createEntityManager(); > final Message msg = new Message("Hello Persistence! > " + System.currentTimeMillis()); > em.persist(msg); > em.close(); > > // DOES NOT RECOGNIZE THE ENTITY JUST PERSISTED > EntityManager em2 = > ServiceManager.getEmFactory().createEntityManager(); > Query q = em2.createQuery("select m from Message m"); > for (Message m : (List) q.getResultList()) { > System.out.println(m.getMessage() + " (created on: " + > m.getCreated() + ')'); > response.getWriter().println("

" + m.getMessage() + " > (created on: " + m.getCreated() + ')' + "

"); > } > em2.close(); > } catch (Throwable t) { > log.error("Error: ", t); > } > } > } > > TransactionFilter.java > > public class TransactionFilter implements Filter { > > public void doFilter(ServletRequest request, ServletResponse > response, FilterChain chain) { > try { > > // start a new transaction for this request > getTransaction().setTransactionTimeout(10000); > getTransaction().begin(); > > // delegate the request to the next filter, and > eventually to the > // target servlet or JSP > chain.doFilter(request, response); > > // if no exception happened: commit the transaction > getTransaction().commit(); > } catch (final Throwable t) { > // analyze exception to dermine of rollback is > required or not > // and then call rollback or commit on utx as > appropriate > t.printStackTrace(); > try { > getTransaction().rollback(); > } catch (final Throwable t2) { > t2.printStackTrace(); > } > } > } > @Override > public void destroy() { > } > @Override > public void init(FilterConfig filterConfig) throws ServletException > { > } > protected TransactionManager getTransaction() { > try { > // from Jetty JNDI configuration > return (TransactionManager) new > InitialContext().lookup("UserTransaction"); > } catch (final NamingException e) { > e.printStackTrace(); > } > return null; > } > > } > > META-INF/persistence.xml > > > xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" > xsi:schemaLocation="http://java.sun.com/xml/ns/persistence > http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd" > version="2.0"> > > > org.apache.openjpa.persistence.PersistenceProviderImpl > jdbc/testDS > com.example.jpa.entity.Message > > value="buildSchema(ForeignKeys=true)"/> > > > value="PrettyPrint=true, PrettyPrintLineLength=72" /> > value="DefaultLevel=WARN, Tool=INFO, SQL=WARN"/> > > value="managed" /> > value="managed" /> > > value="jndi(TransactionManagerName=UserTransaction)" /> > > > > > > > Jetty (plus: jetty-all version 8.1.2) configuration > > > "http://www.eclipse.org/jetty/configure.dtd"> > > > > > > > jdbc/testDS > > class="com.atomikos.jdbc.AtomikosDataSourceBean"> > 2 > 50 > name="xaDataSourceClassName">org.h2.jdbcx.JdbcDataSource > name="UniqueResourceName">jdbc/testDS > SELECT 1 and SELECT 1 > FROM DUAL > > > > URL > > > jdbc:h2:~/test;AUTO_SERVER=TRUE;FILE_LOCK=SOCKET;TRACE_LEVEL_FILE=0;TRA > CE_LEVEL_SYSTEM_OUT=1 > > > user > sa > > > password > sa > > > > > > > > > > > > class="org.eclipse.jetty.jndi.DataSourceCloser"> > > > > > > > > > > > > > class="com.atomikos.icatch.jta.UserTransactionManager" /> > > > > ... > > > > -- *Rick Curtis*