[ 
https://issues.apache.org/jira/browse/ONAMI-117?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=14945041#comment-14945041
 ] 

Nicolas MARQUES commented on ONAMI-117:
---------------------------------------

To answer the initial question, here my entire code with 2 privates modules. Is 
there a limitation to have private modules ? My example is very simple, and 
aims to tests JTA connections with guice/onami-persists and transactions 
manager. But, in production private modules match application components. Each 
components can brings XA connections (and of course persists units). That's why 
i want to test it.

In only one module, it's works (even if @Transaction(type=REQUIRES_NEW) would 
be perfect to open a sub transaction...)

My following code :

{code}

        public static void main(String[] args) throws NamingException
        {
                // Initialize BitronixTransactionManager / Do connections to 
datasources
                JTATransactionManagerServiceImpl transactionManager = new 
JTATransactionManagerServiceImpl();
                transactionManager.start();

                try
                {

                        PrivateModule module1 = new PrivateModule()
                        {
                                @Override
                                protected void configure()
                                {
                                        install(new PersistenceModule()
                                        {
                                                @Override
                                                protected void 
configurePersistence()
                                                {
                                                        System.out.println(">> 
--- Module 1--------------------------------------");
                                                        EntityManagerFactory 
emf = Persistence.createEntityManagerFactory("datasource1");

                                                        
bindContainerManagedPersistenceUnit(emf).annotatedWith(Datasource1.class)
                                                                        
.useGlobalTransactionWithJndiName(JTATransactionManagerServiceImpl.JNDI_USER_TRANSACTION);

                                                }
                                        });
                                }
                        };

                        PrivateModule module2 = new PrivateModule()
                        {
                                @Override
                                protected void configure()
                                {
                                        install(new PersistenceModule()
                                        {
                                                @Override
                                                protected void 
configurePersistence()
                                                {
                                                        System.out.println(">> 
--- Module 2--------------------------------------");
                                                        EntityManagerFactory 
emf = Persistence.createEntityManagerFactory("datasource2");

                                                        
bindContainerManagedPersistenceUnit(emf).annotatedWith(Datasource2.class)
                                                                        
.useGlobalTransactionWithJndiName(JTATransactionManagerServiceImpl.JNDI_USER_TRANSACTION);

                                                }
                                        });
                                }

                        };

                        final Injector injector = Guice.createInjector(module1, 
module2);

                        AllPersistenceServices persistenceService = 
injector.getInstance(AllPersistenceServices.class);
                        try
                        {
                                
persistenceService.startAllStoppedPersistenceServices();
                                
injector.getInstance(SuperTransactional.class).testIt(); // Call different DAO 
and execute queries to test database connections
                        }
                        finally
                        {
                                persistenceService.stopAllPersistenceServices();
                        }

                }
                finally
                {
                        transactionManager.stop();
                }

        }
{code}

It throws an Exception
{code}
1) Unable to create binding for 
org.apache.onami.persist.AllPersistenceServices. It was already configured on 
one or more child injectors or private modules
    bound at 
org.apache.onami.persist.PersistenceModule.configurePersistenceUnits(PersistenceModule.java:80)
  If it was in a PrivateModule, did you forget to expose the binding?
  while locating org.apache.onami.persist.AllPersistenceServices

1 error
        at 
com.google.inject.internal.InjectorImpl.getProvider(InjectorImpl.java:1004)
        at 
com.google.inject.internal.InjectorImpl.getProvider(InjectorImpl.java:961)
        at 
com.google.inject.internal.InjectorImpl.getInstance(InjectorImpl.java:1013)
{code}


> Multiple JTA datasource in standalone application
> -------------------------------------------------
>
>                 Key: ONAMI-117
>                 URL: https://issues.apache.org/jira/browse/ONAMI-117
>             Project: Apache Onami
>          Issue Type: Question
>          Components: persist
>    Affects Versions: persist-1.0.1
>            Reporter: Nicolas MARQUES
>
> I use multiple datasource in a JTA environnement (with 
> BitronixTransactionManager). 
> To do that, i create a privateModule for each datasource environment with a 
> persistentModule installed.
> I followed the given example  :
> {panel}       bindContainerManagedPersistenceUnit(entityManagerFactory)
> .annotatedWith(clazz)
> .useGlobalTransactionWithJndiName(JTATransactionManagerServiceImpl.JNDI_USER_TRANSACTION);
> {panel}
> In my main class, the problem is that i cannot access to the 
> PersistentService since there is not an only one neither to  
> AllPersistenceServices class.
> {panel}
> Exception in thread "main" com.google.inject.ConfigurationException: Guice 
> configuration errors:
> 1) Unable to create binding for 
> org.apache.onami.persist.AllPersistenceServices. It was already configured on 
> one or more child injectors or private modules
>     bound at 
> org.apache.onami.persist.PersistenceModule.configurePersistenceUnits(PersistenceModule.java:80)
>   If it was in a PrivateModule, did you forget to expose the binding?
>   while locating org.apache.onami.persist.AllPersistenceServices
> 1 error
>       at 
> com.google.inject.internal.InjectorImpl.getProvider(InjectorImpl.java:1004)
>       at 
> com.google.inject.internal.InjectorImpl.getProvider(InjectorImpl.java:961)
>       at 
> com.google.inject.internal.InjectorImpl.getInstance(InjectorImpl.java:1013)
>       at nico.jta.JPAClient.main(JPAClient.java:49)
> {panel}



--
This message was sent by Atlassian JIRA
(v6.3.4#6332)

Reply via email to