In OSGi-related contexts like a number of Application Servers (e.g. Glassfish ) and Eclipse-based systems, Neo4j can be set up explicitly rather than being discovered by the Java Service Loader mechanism.
As seen in the following example, instead of relying on the Classloading of the Neo4j kernel, the Neo4j bundles are treated as library bundles, and services like the IndexProviders and CacheProviders are explicitly instantiated, configured and registered. Just make the necessary jars available as wrapped library bundles, so all needed classes are exported and seen by the bundle containing the Activator.
public class Neo4jActivator implements BundleActivator { private static GraphDatabaseService db; private ServiceRegistration serviceRegistration; private ServiceRegistration indexServiceRegistration; @Override public void start( BundleContext context ) throws Exception { //the cache providers ArrayList<CacheProvider> cacheList = new ArrayList<CacheProvider>(); cacheList.add( new SoftCacheProvider() ); //the kernel extensions LuceneKernelExtensionFactory lucene = new LuceneKernelExtensionFactory(); List<KernelExtensionFactory<?>> extensions = new ArrayList<KernelExtensionFactory<?>>(); extensions.add( lucene ); //the database setup GraphDatabaseFactory gdbf = new GraphDatabaseFactory(); gdbf.setKernelExtensions( extensions ); gdbf.setCacheProviders( cacheList ); db = gdbf.newEmbeddedDatabase( "target/db" ); //the OSGi registration serviceRegistration = context.registerService( GraphDatabaseService.class.getName(), db, new Hashtable<String, String>() ); System.out.println( "registered " + serviceRegistration.getReference() ); indexServiceRegistration = context.registerService( Index.class.getName(), db.index().forNodes( "nodes" ), new Hashtable<String, String>() ); Transaction tx = db.beginTx(); try { Node firstNode = db.createNode(); Node secondNode = db.createNode(); Relationship relationship = firstNode.createRelationshipTo( secondNode, DynamicRelationshipType.withName( "KNOWS" ) ); firstNode.setProperty( "message", "Hello, " ); secondNode.setProperty( "message", "world!" ); relationship.setProperty( "message", "brave Neo4j " ); db.index().forNodes( "nodes" ).add( firstNode, "message", "Hello" ); tx.success(); } catch ( Exception e ) { e.printStackTrace(); throw new RuntimeException( e ); } finally { tx.finish(); } } @Override public void stop( BundleContext context ) throws Exception { serviceRegistration.unregister(); indexServiceRegistration.unregister(); db.shutdown(); } }
Tip | |
---|---|
The source code of the example above is found here. |
Copyright © 2013 Neo Technology