Over a million developers have joined DZone.
{{announcement.body}}
{{announcement.title}}

RAP, OSGi & HibernateSearch Infinispan Cluster

DZone's Guide to

RAP, OSGi & HibernateSearch Infinispan Cluster

· Java Zone ·
Free Resource

The CMS developers love. Open Source, API-first and Enterprise-grade. Try BloomReach CMS for free.

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

}




BloomReach CMS: the API-first CMS of the future. Open-source & enterprise-grade. - As a Java developer, you will feel at home using Maven builds and your favorite IDE (e.g. Eclipse or IntelliJ) and continuous integration server (e.g. Jenkins). Manage your Java objects using Spring Framework, write your templates in JSP or Freemarker. Try for free.

Topics:

Published at DZone with permission of

Opinions expressed by DZone contributors are their own.

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

{{ parent.tldr }}

{{ parent.urlSource.name }}