[
http://opensource.atlassian.com/projects/hibernate/browse/HSEARCH-640?pag...
]
Mario Winterer commented on HSEARCH-640:
----------------------------------------
I was wrong. {{MassIndexer}} must not call {{session.beginTransaction()}} inside a Java EE
container, even if a JTA transaction is active.
What do you think about the following workaround for 3.3.0?
# Add a method {{setTransactionFactory(TransactionFactory)}} to {{MassIndexerImpl}} (not
the API), so the caller can optionally set a properly configured {{TransactionFactory}}.
# Pass the factory via {{BatchCoordinator}} to {{BatchIndexingWorkspace}} which itself
passes it to the producers.
# If a producer has a TransactionFactory, it will call factory.createTransaction(...)
instead of delegating to hibernate via session.beginTransaction().
By setting a properly configured {{JTATransactionFactory}}, the {{MassIndexer}} will start
and stop a JTA transaction and will be able to work inside a Java EE container.
Not a very nice solution, but a non-API-compromising workaround with little effort as I
think.
I've already tested it with the current trunk and it seems to work in JBoss 6. If you
like I could prepare a patch or something...
MassIndexer/JBoss 6: Could not register synchronization for container
transaction
---------------------------------------------------------------------------------
Key: HSEARCH-640
URL:
http://opensource.atlassian.com/projects/hibernate/browse/HSEARCH-640
Project: Hibernate Search
Issue Type: Bug
Components: massindexer
Affects Versions: 3.3.0.CR1
Environment: Hibernate 3.6.0.Final, JBoss 6.0.0.CR1, HSQL 1.8.0 (shipped with
JBoss 6.0.0.CR1)
Java(TM) SE Runtime Environment (build 1.6.0_20-b02)
Reporter: Mario Winterer
Assignee: Sanne Grinovero
Priority: Critical
Fix For: 3.3.0.Final
Attachments: contacts.ear
If a mass indexer is used inside a CMP bean in JBoss 6 to rebuild the search index, an
org.hibernate.TransactionException is thrown:
{noformat}
2010-12-06 14:01:30,720 ERROR
[org.hibernate.search.batchindexing.EntityConsumerLuceneworkProducer]
(Hibernate Search: collectionsloader-1) error during batch indexing:
: org.hibernate.TransactionException: Could not register synchronization for container
transaction
at org.hibernate.transaction.CMTTransaction.begin(CMTTransaction.java:76)
[:3.6.0.Final]
at
org.hibernate.ejb.transaction.JoinableCMTTransaction.begin(JoinableCMTTransaction.java:89)
[:3.6.0.Final]
at org.hibernate.impl.SessionImpl.beginTransaction(SessionImpl.java:1473)
[:3.6.0.Final]
at
org.hibernate.search.batchindexing.EntityConsumerLuceneworkProducer.run(EntityConsumerLuceneworkProducer.java:90)
[:3.3.0.CR1]
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
[:1.6.0_20]
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
[:1.6.0_20]
at java.lang.Thread.run(Thread.java:619) [:1.6.0_20]
{noformat}
I've included an example EAR (see attachment) that can be deployed to JBoss 6.0.0.CR1
without any modifications.
It contains the required hibernate search libraries and defines one single indexed entity
bean {{Contact}} as well as a JBoss service EJB named {{at.mw.contacts:ContactsService}}
that can be accessed via JMX console.
Use this service to do one of the following things:
* add new contacts by specifying firstName/lastName
* list all contacts
* search for contacts using the search index
* rebuild the entire search index (using a MassIndexer)
Rebuilding the index fails with the exception listed above.
Sources included.
(the example uses an in-memory HSQL-DB and the ram directory provider for the lucene
index).
(see also forum discussion: [Could not register synchronization for container
transaction|https://forum.hibernate.org/viewtopic.php?f=9&t=1004515&a...])
--
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators:
http://opensource.atlassian.com/projects/hibernate/secure/Administrators....
-
For more information on JIRA, see:
http://www.atlassian.com/software/jira