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

Learn how to troubleshoot and diagnose some of the most common performance issues in Java today. 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;
	}

}




Understand the needs and benefits around implementing the right monitoring solution for a growing containerized market. Brought to you in partnership with AppDynamics.

Topics:

Published at DZone with permission of Thomas Kratz, DZone MVB. See the original article here.

Opinions expressed by DZone contributors are their own.

The best of DZone straight to your inbox.

SEE AN EXAMPLE
Please provide a valid email address.

Thanks for subscribing!

Awesome! Check your inbox to verify your email so you can start receiving the latest in tech news and resources.
Subscribe

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

{{ parent.tldr }}

{{ parent.urlSource.name }}