Enterprise Integration Zone is brought to you in partnership with:

Dirt-proven 40+ developer. Currently signed up as group head development at t8y.com Thomas is a DZone MVB and is not an employee of DZone and has posted 5 posts at DZone. You can read more from them at their website. View Full User Profile

RAP, OSGi & HibernateSearch Infinispan Cluster

08.22.2013
| 6003 views |
  • submit to reddit

While trying to setup Hibernate search on an Infinspan cluster for my Remote Application Platform application I came across another "Hibernate doesn't like OSGi" oddity.

The JMS setup for Hibernate Search is configured through JNDI. That wouldn't be a problem when running while deployed on my tomcat instances, but how should this work in my develepment setup, where I use the RAP tooling and run on the embedded Jetty HTTP service? No JNDI there.

So I created a replacement for the JMSBackendprocessor from Hibernate Search that looks up the JMS connection by means of OSGi. Bye bye good old JNDI, never liked you either.

Now if I only had a failover for the workbench...

package de.eiswind.mango.hibernate.osgi;

import java.util.List;

import javax.jms.Queue;
import javax.jms.QueueConnectionFactory;

import org.apache.log4j.Logger;
import org.hibernate.search.backend.IndexingMonitor;
import org.hibernate.search.backend.LuceneWork;
import org.hibernate.search.backend.impl.jms.JMSBackendQueueProcessor;
import org.hibernate.search.backend.impl.jms.JMSBackendQueueTask;
import org.osgi.framework.BundleContext;
import org.osgi.framework.Filter;
import org.osgi.framework.InvalidSyntaxException;
import org.osgi.framework.ServiceReference;
import org.osgi.util.tracker.ServiceTracker;

import de.eiswind.org.hibernate.Activator;

public class OSGIJmsBackendQueueProcessor extends JMSBackendQueueProcessor {

	private static final Logger log = Logger.getLogger(OSGIJmsBackendQueueProcessor.class);
	private QueueConnectionFactory jmsConnectionFactory;
	private Queue jmsQueue;

	private BundleContext ctx;

	@Override
	public void prepareJMSTools() {
		
		if(jmsConnectionFactory!=null && jmsQueue!=null){
			return;
		}
		ctx = Activator.getContext();
		ServiceTracker<QueueConnectionFactory, Object> tracker = new ServiceTracker<QueueConnectionFactory, Object>(ctx, QueueConnectionFactory.class, null) {

			@Override
			public Object addingService(ServiceReference<QueueConnectionFactory> reference) {
				log.info("Found JMS Connection Factory");
				OSGIJmsBackendQueueProcessor.this.jmsConnectionFactory = ctx.getService(reference);
				return OSGIJmsBackendQueueProcessor.this.jmsConnectionFactory;
			}

		};
		tracker.open();
		Filter filter;
		try {
			filter = ctx.createFilter("(&(objectClass=javax.jms.Queue)(queue=hibernatesearch))");
			ServiceTracker<Queue, Object> tracker2 = new ServiceTracker<Queue, Object>(ctx, filter, null) {

				@Override
				public Object addingService(ServiceReference<Queue> reference) {
					log.info("Found JMS Queue");
					OSGIJmsBackendQueueProcessor.this.jmsQueue = ctx.getService(reference);
					return OSGIJmsBackendQueueProcessor.this.jmsQueue;
				}

			};
			tracker2.open();
		} catch (InvalidSyntaxException e) {
			log.error("Create filter", e);
		}

	}

	public QueueConnectionFactory getJMSFactory() {
		if(this.jmsConnectionFactory==null){
			throw new IllegalStateException("Connection not ready.");
		}
		return jmsConnectionFactory;
	}

	public Queue getJmsQueue() {
		if(this.jmsQueue==null){
			throw new IllegalStateException("Queue not ready");
		}
		return jmsQueue;
	}

}




Published at DZone with permission of Thomas Kratz, author and DZone MVB. (source)

(Note: Opinions expressed in this article and its replies are the opinions of their respective authors and not those of DZone, Inc.)