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