Bug 757052

Summary: Hibernate Search 4 is incompatible with HornetQ
Product: [Retired] JBoss Enterprise WFK Platform 2 Reporter: Karel Piwko <kpiwko>
Component: HibernateSearchAssignee: Strong Liu <stliu>
Status: CLOSED CURRENTRELEASE QA Contact:
Severity: urgent Docs Contact:
Priority: urgent    
Version: 2.0.0.DR4CC: mnovotny, sjacobs
Target Milestone: ---   
Target Release: 2.0.0.DR07   
Hardware: Unspecified   
OS: Unspecified   
Whiteboard:
Fixed In Version: 4.0.0.CR2 Doc Type: Bug Fix
Doc Text:
Story Points: ---
Clone Of: Environment:
Last Closed: 2012-04-05 13:48:52 UTC Type: ---
Regression: --- Mount Type: ---
Documentation: --- CRM:
Verified Versions: Category: ---
oVirt Team: --- RHEL 7.3 requirements from Atomic Host:
Cloudforms Team: --- Target Upstream Version:

Description Karel Piwko 2011-11-25 11:17:52 UTC
I'm trying to create a JMS based indexer for Hibernate Search 4 running on AS7.

Supposing following producer:

@GET
    @Produces("text/xml")
    public Index indexMembers() throws Exception {
   
        Connection connection = connectionFactory.createConnection();
        Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
        MessageProducer producer = session.createProducer(hibernateSearchQueue);
        ObjectMessage message = session.createObjectMessage();

        // this is not working on hornetq
        message.setStringProperty(JMSBackendQueueTask.INDEX_NAME_JMS_PROPERTY, "default");
        
        producer.send(message);
        session.close();

        return getIndexSize();

    }
and following configuration:

<persistence version="2.0" xmlns="http://java.sun.com/xml/ns/persistence" 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">
    <persistence-unit name="primary">
        <provider>org.hibernate.ejb.HibernatePersistence</provider>

        <!-- If you are running in a production environment, add a managed data source, the example data source is just for proofs
            of concept! -->
        <jta-data-source>java:jboss/datasources/ExampleDS</jta-data-source>
        <properties>
            <!-- Properties for Hibernate -->
            <property name="hibernate.hbm2ddl.auto" value="create-drop" />
            <property name="hibernate.show_sql" value="false" />

            <!-- Properties for Hibernate Search -->

            <property name="hibernate.search.default.indexBase" value="target" />

            <!-- optional -->
            <property name="hibernate.search.default.directory_provider" value="ram" />

            <!-- Set worker to be a JMS based -->
            <property name="hibernate.search.default.worker.backend" value="jms" />
            <!-- Set worker to work in a sync way -->
            <property name="hibernate.search.default.worker.execution" value="sync" />

            <property name="hibernate.search.default.worker.jms.connection_factory" value="/ConnectionFactory" />
            <property name="hibernate.search.default.worker.jms.queue" value="queue/hibernatesearch" />

            <!-- optional, not used at the moment -->
            <!--
                <property name="hibernate.search.default.worker.jndi.*" />
            -->
        </properties>
    </persistence-unit>
</persistence>
and

@MessageDriven(activationConfig = {
        //@ActivationConfigProperty(propertyName = "destinationType", propertyValue = "org.hornetq.jms.client.HornetQQueue"),
        @ActivationConfigProperty(propertyName = "destinationType", propertyValue = "javax.jms.Queue"),
        @ActivationConfigProperty(propertyName = "destination", propertyValue = "queue/hibernatesearch"),
        @ActivationConfigProperty(propertyName = "DLQMaxResent", propertyValue = "1") })
public class HSearchController extends AbstractJMSHibernateSearchController implements MessageListener {
    @Inject
    EntityManager em;

    // method retrieving the appropriate session
    protected Session getSession() {
        return (Session) em.getDelegate();
    }

    // potentially close the session opened in #getSession(), not needed here
    protected void cleanSessionIfNeeded(Session session) {
    }
}
This leads to the error when triggered on AS7 with HQ:

java.lang.IllegalArgumentException: The property name 'hibernate.search.jms.indexNameProperty' is not a valid java identifier.
	org.hornetq.jms.client.HornetQMessage.checkProperty(HornetQMessage.java:1032)
	org.hornetq.jms.client.HornetQMessage.setStringProperty(HornetQMessage.java:793)
	org.jboss.as.quickstarts.kitchensink.rest.HSearchIndexationRESTService.indexMembers(HSearchIndexationRESTService.java:57)
	org.jboss.as.quickstarts.kitchensink.rest.HSearchIndexationRESTService$Proxy$_$$_WeldClientProxy.indexMembers(HSearchIndexationRESTService$Proxy$_$$_WeldClientProxy.java)
	sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
	sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
	java.lang.reflect.Method.invoke(Method.java:597)
	org.jboss.resteasy.core.MethodInjectorImpl.invoke(MethodInjectorImpl.java:140)
	org.jboss.resteasy.core.ResourceMethod.invokeOnTarget(ResourceMethod.java:255)
	org.jboss.resteasy.core.ResourceMethod.invoke(ResourceMethod.java:220)
	org.jboss.resteasy.core.ResourceMethod.invoke(ResourceMethod.java:209)
	org.jboss.resteasy.core.SynchronousDispatcher.getResponse(SynchronousDispatcher.java:519)
	org.jboss.resteasy.core.SynchronousDispatcher.invoke(SynchronousDispatcher.java:496)
	org.jboss.resteasy.core.SynchronousDispatcher.invoke(SynchronousDispatcher.java:119)
	org.jboss.resteasy.plugins.server.servlet.ServletContainerDispatcher.service(ServletContainerDispatcher.java:208)
	org.jboss.resteasy.plugins.server.servlet.HttpServletDispatcher.service(HttpServletDispatcher.java:55)
	org.jboss.resteasy.plugins.server.servlet.HttpServletDispatcher.service(HttpServletDispatcher.java:50)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:847)
	org.jboss.weld.servlet.ConversationPropagationFilter.doFilter(ConversationPropagationFilter.java:67)
*which is indeed correct, check http://docs.oracle.com/javaee/5/api/javax/jms/Message.html and Message Selector / Identifiers section*.

Without this property, the code fail with:

10:55:41,125 ERROR [org.hornetq.ra.inflow.HornetQMessageHandler] (Thread-18 (group:HornetQ-client-global-threads-898159460)) Failed to deliver message: java.lang.IllegalArgumentException: HSEARCH000113: 'null' is not a valid index name
        at org.hibernate.search.indexes.impl.IndexManagerHolder.getIndexManager(IndexManagerHolder.java:309)
        at org.hibernate.search.backend.impl.jms.AbstractJMSHibernateSearchController.onMessage(AbstractJMSHibernateSearchController.java:101)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) [:1.6.0_27]
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) [:1.6.0_27]
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) [:1.6.0_27]
        at java.lang.reflect.Method.invoke(Method.java:597) [:1.6.0_27]
        at org.jboss.as.ee.component.ManagedReferenceMethodInterceptorFactory$ManagedReferenceMethodInterceptor.processInvocation(ManagedReferenceMethodInterceptorFactory.java:72)
        at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:288)
        at org.jboss.invocation.InterceptorContext$Invocation.proceed(InterceptorContext.java:374)
        at org.jboss.as.weld.ejb.Jsr299BindingsInterceptor.doMethodInterception(Jsr299BindingsInterceptor.java:122)
        at org.jboss.as.weld.ejb.Jsr299BindingsInterceptor.processInvocation(Jsr299BindingsInterceptor.java:130)
        at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:288)
        at org.jboss.invocation.WeavedInterceptor.processInvocation(WeavedInterceptor.java:53)
        at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:288)
        at org.jboss.as.weld.ejb.EjbRequestScopeActivationInterceptor.processInvocation(EjbRequestScopeActivationInterceptor.java:59)
        at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:288)
        at org.jboss.as.ee.component.NamespaceContextInterceptor.processInvocation(NamespaceContextInterceptor.java:44)
        at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:288)
        at org.jboss.as.ee.component.TCCLInterceptor.processInvocation(TCCLInterceptor.java:45)
        at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:288)
        at org.jboss.invocation.InitialInterceptor.processInvocation(InitialInterceptor.java:21)
        at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:288)
        at org.jboss.invocation.ChainedInterceptor.processInvocation(ChainedInterceptor.java:61)
        at org.jboss.as.ee.component.ViewDescription$ComponentDispatcherInterceptor.processInvocation(ViewDescription.java:225)
        at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:288)
        at org.jboss.as.ejb3.component.pool.PooledInstanceInterceptor.processInvocation(PooledInstanceInterceptor.java:51)
        at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:288)
        at org.jboss.as.ejb3.component.interceptors.CurrentInvocationContextInterceptor.processInvocation(CurrentInvocationContextInterceptor.java:41)
        at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:288)
        at org.jboss.as.ejb3.component.interceptors.EjbClientContextInterceptorFactory$1.processInvocation(EjbClientContextInterceptorFactory.java:45)
        at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:288)
        at org.jboss.invocation.ChainedInterceptor.processInvocation(ChainedInterceptor.java:61)
        at org.jboss.as.ee.component.ViewService$View.invoke(ViewService.java:156)
        at org.jboss.as.ee.component.ViewDescription$1.processInvocation(ViewDescription.java:166)
        at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:288)
        at org.jboss.invocation.ChainedInterceptor.processInvocation(ChainedInterceptor.java:61)
        at org.jboss.as.ee.component.ProxyInvocationHandler.invoke(ProxyInvocationHandler.java:72)
        at javax.jms.MessageListener$$$view28.onMessage(Unknown Source)
        at sun.reflect.GeneratedMethodAccessor68.invoke(Unknown Source)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) [:1.6.0_27]
        at java.lang.reflect.Method.invoke(Method.java:597) [:1.6.0_27]
        at org.jboss.as.ejb3.inflow.MessageEndpointInvocationHandler.doInvoke(MessageEndpointInvocationHandler.java:140)
        at org.jboss.as.ejb3.inflow.AbstractInvocationHandler.invoke(AbstractInvocationHandler.java:73)
        at $Proxy162.onMessage(Unknown Source)  at org.hornetq.ra.inflow.HornetQMessageHandler.onMessage(HornetQMessageHandler.java:278)
        at org.hornetq.core.client.impl.ClientConsumerImpl.callOnMessage(ClientConsumerImpl.java:866)
        at org.hornetq.core.client.impl.ClientConsumerImpl.access$100(ClientConsumerImpl.java:44)
        at org.hornetq.core.client.impl.ClientConsumerImpl$Runner.run(ClientConsumerImpl.java:983)
        at org.hornetq.utils.OrderedExecutorFactory$OrderedExecutor$1.run(OrderedExecutorFactory.java:100)
        at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886) [:1.6.0_27]
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908) [:1.6.0_27]
        at java.lang.Thread.run(Thread.java:662) [:1.6.0_27]

Comment 1 Karel Piwko 2011-11-25 11:18:18 UTC
Tracking for https://hibernate.onjira.com/browse/HSEARCH-984

Comment 3 Karel Piwko 2011-11-25 11:55:12 UTC
Problem manifests itself if following URL is accessed:

http://localhost:8080/kitchensink-search-hq/rest/index

Comment 4 Strong Liu 2011-12-09 04:29:15 UTC
HSEARCH-984 has been back ported into this cr2 prod build, give it a try
https://hudson.qa.jboss.com/hudson/job/hibernate-search-4.0-wfk-all/

Comment 5 Karel Piwko 2012-01-05 15:09:01 UTC
WFK 2.0.0.DR06 does not container required fix for HSEARCH-984, waiting for DR7 release.

Comment 7 Karel Piwko 2012-04-05 13:48:52 UTC
Verified in WFK 2.0.0.ER3 (a.k.a. 2.0.0.Beta1).