Over a million developers have joined DZone.

RAP, OSGi & HibernateSearch Infinispan Cluster

· Java Zone

Discover how AppDynamics steps in to upgrade your performance game and prevent your enterprise from these top 10 Java performance problems, brought to you in partnership with AppDynamics.

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;
	}

}




The Java Zone is brought to you in partnership with AppDynamics. AppDynamics helps you gain the fundamentals behind application performance, and implement best practices so you can proactively analyze and act on performance problems as they arise, and more specifically with your Java applications. Start a Free Trial.

Topics:

Published at DZone with permission of Thomas Kratz , DZone MVB .

Opinions expressed by DZone contributors are their own.

{{ parent.title || parent.header.title}}

{{ parent.tldr }}

{{ parent.urlSource.name }}