Hi Jiri,
I can see several issues in your assembly.
First, there are three MemoryEntityStore assembled in your
infrastructure layer:
- in your config module, with module visibility
- in your indexing module, with application visibility
- in your entitystore module, with application visibility
You should remove the one from your indexing module.
See the "Defining an Entity Store" section in
http://qi4j.org/core-bootstrap-assembly.html
Take special attention to the Configuration state storage.
EntityStores notify each visible indexing of entities state changes.
ConfigurationComposites are entities. You must ensure the EntityStore
you use to store configuration cannot see the indexing service.
Having too much EntityStores assembled is not a good idea.
Second, you can remove the two objects declaration at the beggining
(EntityStateSerializer & EntityTypeSerializer) as they were used by
indexing-rdf and are not needed when using indexing-sql.
Third, the endless loop seems to come from the DataSourceConfiguration
loading and to take place in EntityStore.newUnitOfWork(..) but at first
sight and without a complete test case I can't see why it goes crazy
like that.
Could you please follow my advices above to cleanup your assembly a bit
and report if it still fail?
Cheers
/Paul
jj a écrit :
Hello,
I wrote a simple application using In-Memory EntityStore and RdfIndexing.
Now I want to
switch over to SQL Index/Store but receive the following exception :
java.lang.IllegalStateException: java.lang.StackOverflowError
at
org.qi4j.runtime.activation.ActivationDelegate.activate(ActivationDelegate.java:103)
at
org.qi4j.runtime.activation.ActivationDelegate.activate(ActivationDelegate.java:56)
at
org.qi4j.runtime.service.ServicesInstance.activate(ServicesInstance.java:57)
at
org.qi4j.runtime.activation.ActivationDelegate.activate(ActivationDelegate.java:78)
at
org.qi4j.runtime.activation.ActivationDelegate.activate(ActivationDelegate.java:56)
at
org.qi4j.runtime.structure.ModuleInstance.activate(ModuleInstance.java:281)
at
org.qi4j.runtime.activation.ActivationDelegate.activate(ActivationDelegate.java:78)
at
org.qi4j.runtime.activation.ActivationDelegate.activate(ActivationDelegate.java:56)
at
org.qi4j.runtime.structure.LayerInstance.activate(LayerInstance.java:175)
at
org.qi4j.runtime.activation.ActivationDelegate.activate(ActivationDelegate.java:78)
at
org.qi4j.runtime.activation.ActivationDelegate.activate(ActivationDelegate.java:56)
at
org.qi4j.runtime.structure.ApplicationInstance.activate(ApplicationInstance.java:121)
at
com.somepackage.qi4j.application.abc.bootstrap.AbcApplication.createApplication(AbcApplication.java:63)
at com.somepackage.qi4j.application.abc.Main.setUp(Main.java:15)
at com.somepackage.qi4j.application.abc.Main.main(Main.java:47)
Caused by: java.lang.StackOverflowError
at java.lang.Long.valueOf(Long.java:554)
at $Proxy36.newUnitOfWork(Unknown Source)
at
org.qi4j.spi.entitystore.ConcurrentModificationCheckConcern.newUnitOfWork(ConcurrentModificationCheckConcern.java:49)
at
org.qi4j.entitystore.memory.MemoryEntityStoreService.newUnitOfWork(Unknown
Source)
at
org.qi4j.library.sql.datasource.AbstractDataSourceServiceImporterMixin.getConfiguration(AbstractDataSourceServiceImporterMixin.java:130)
at
org.qi4j.library.sql.datasource.AbstractDataSourceServiceImporterMixin.importService(AbstractDataSourceServiceImporterMixin.java:77)
at
org.qi4j.library.sql.datasource.AbstractDataSourceServiceImporterMixin.importService(AbstractDataSourceServiceImporterMixin.java:1)
at
org.qi4j.library.sql.dbcp.DBCPDataSourceServiceImporter.importService(Unknown
Source)
at
org.qi4j.api.service.importer.ServiceInstanceImporter.importService(ServiceInstanceImporter.java:48)
at $Proxy22.notifyChanges(Unknown Source)
at
org.qi4j.spi.entitystore.StateChangeNotificationConcern$1.commit(StateChangeNotificationConcern.java:42)
at
org.qi4j.spi.entitystore.ConcurrentModificationCheckConcern$ConcurrentCheckingEntityStoreUnitOfWork$1.commit(ConcurrentModificationCheckConcern.java:103)
at
org.qi4j.library.sql.datasource.AbstractDataSourceServiceImporterMixin.getConfiguration(AbstractDataSourceServiceImporterMixin.java:154)
at
org.qi4j.library.sql.datasource.AbstractDataSourceServiceImporterMixin.importService(AbstractDataSourceServiceImporterMixin.java:77)
at
org.qi4j.library.sql.datasource.AbstractDataSourceServiceImporterMixin.importService(AbstractDataSourceServiceImporterMixin.java:1)
at
org.qi4j.library.sql.dbcp.DBCPDataSourceServiceImporter.importService(Unknown
Source)
at
org.qi4j.api.service.importer.ServiceInstanceImporter.importService(ServiceInstanceImporter.java:48)
at $Proxy22.notifyChanges(Unknown Source)
Looks like as a endless loop, but I;m not able to figure out the reason.
Here also the assembly code
that produce the above exception.
private void assembleInfrastructureLayer( LayerAssembly
infrastructureLayer )
throws AssemblyException
{
// 1.) SQL Indexing
ModuleAssembly indexingModule = infrastructureLayer.module(
"INFRASTRUCTURE-Indexing" );
indexingModule
.objects(
EntityStateSerializer.class,
EntityTypeSerializer.class );
ModuleAssembly config = indexingModule.layer().module( "config"
);
config.services( MemoryEntityStoreService.class ).visibleIn(
Visibility.module );
// EntityStore
indexingModule.services( MemoryEntityStoreService.class,
UuidIdentityGeneratorService.class ).visibleIn( Visibility.application );
// DataSourceService + Index/Query's DataSource
new DBCPDataSourceServiceAssembler(
"datasource-service-postgres",
Visibility.module,
config,
Visibility.layer ).assemble(
indexingModule );
DataSourceAssembler dsAssembler = new DataSourceAssembler(
"datasource-service-postgres",
"datasource-postgres",
Visibility.module,
DataSources.newDataSourceCircuitBreaker() );
// Index/Query
new PostgreSQLAssembler( Visibility.application, dsAssembler
).assemble( indexingModule );
config.entities( SQLConfiguration.class ).visibleIn(
Visibility.layer );
// Always re-index because of possible different app structure
of multiple tests.
indexingModule.services(
ReindexingStrategy.ReindexingStrategyService.class ).withMixins(
ReindexingStrategy.AlwaysNeed.class ).identifiedBy( "reindexer" );
config.entities( ReindexerConfiguration.class ).visibleIn(
Visibility.layer );
// 2.) In-memory Entity Store
ModuleAssembly entityStoreModule = infrastructureLayer.module(
"INFRASTRUCTURE-EntityStore" );
entityStoreModule
.services(
MemoryEntityStoreService.class,
UuidIdentityGeneratorService.class )
.instantiateOnStartup()
.visibleIn( application );
}
I try already many combinations - without success. Would be great if one of
you guys
can give me an idea what is wrong with my code.
Thanks,
Cheers,
Jiri
--
View this message in context:
http://qi4j-dev.23929.n6.nabble.com/SQL-Indexing-SQL-EntityStore-tp7140.html
Sent from the Qi4j-dev mailing list archive at Nabble.com.
_______________________________________________
qi4j-dev mailing list
[email protected]
http://lists.ops4j.org/mailman/listinfo/qi4j-dev
_______________________________________________
qi4j-dev mailing list
[email protected]
http://lists.ops4j.org/mailman/listinfo/qi4j-dev