Исключение при поиске XADatasource с использованием JNDI - PullRequest
0 голосов
/ 09 октября 2018

Я настроил XADatasource на сервере wildlfy, так как мне нужно использовать транзакции JTA и мне нужно управлять несколькими базами данных с помощью JTATransactionManager с использованием реализации Atomikos.Я получаю следующее ClassCastException при поиске и сборке AtomikosDatasource с использованием весенней загрузки.Кажется, что поиск JNDI всегда возвращает WildflyDatasource, и он не реализует XADatasource.Пожалуйста, предложите мне, как получить XADatasource вместо WildflyDatasource при поиске или преобразовании из WildlfyDatasource в XADatasource.

Причина: java.lang.ClassCastException: org.jboss.as.connector.subsystems.datasources..WildFlyDataSource не может быть приведен к javax.sql.XADataSource

Ниже приведен фрагмент для поиска источника данных и создания AtomikosDataSourceBean

*@Bean(name = "customerDataSource", initMethod = "init", destroyMethod = "close")
@Primary
public DataSource customerDataSource() throws NamingException {     
    JndiDataSourceLookup dataSourceLookup = new JndiDataSourceLookup();
    XADataSource mysqlXaDataSource =  (XADataSource) dataSourceLookup.getDataSource("java:/jdbc/atomikos_one");
    AtomikosDataSourceBean xaDataSource = new AtomikosDataSourceBean();
    xaDataSource.setXaDataSource(mysqlXaDataSource);        
    xaDataSource.setUniqueResourceName("xads1");
    return xaDataSource;
}*

Ниже приведена конфигурация источника данных в Wildfly 10.1.0.Final

    <xa-datasource jndi-name="java:/jdbc/atomikos_one" pool-name="atomikos_one" enabled="true" use-ccm="true">
                <xa-datasource-property name="ServerName">
                    localhost
                </xa-datasource-property>
                <xa-datasource-property name="DatabaseName">
                    atomikos_one
                </xa-datasource-property>
                <driver>mysql</driver>
                <xa-pool>
                    <min-pool-size>5</min-pool-size>
                    <max-pool-size>100</max-pool-size>
                    <use-strict-min>true</use-strict-min>
                    <wrap-xa-resource>false</wrap-xa-resource>
                </xa-pool>
                <security>
                    <user-name>root</user-name>
                    <password>password</password>
                </security>
                <validation>
                    <valid-connection-checker class-name="org.jboss.jca.adapters.jdbc.extensions.mysql.MySQLValidConnectionChecker"/>
                    <background-validation>true</background-validation>
                    <exception-sorter class-name="org.jboss.jca.adapters.jdbc.extensions.mysql.MySQLExceptionSorter"/>
                </validation>
            </xa-datasource>
            <driver name="mysql" module="com.mysql">
                <driver-class>com.mysql.jdbc.Driver</driver-class>
                <xa-datasource-class>com.mysql.jdbc.jdbc2.optional.MysqlXADataSource</xa-datasource-class>
            </driver>

Ответы [ 2 ]

0 голосов
/ 15 декабря 2018

Получил это работает.Я понял, что встроенные JTA TransactionManager уже доступны на сервере приложений и используют его, вместо того, чтобы использовать его для пользовательской реализации (Atomikos).Возвращаясь к ответу на этот вопрос, мы все еще можем настроить XADatasoruce на сервере приложений и выполнить поиск с использованием JNDI, а также привести его к обычному источнику данных и внедрить его в EntityManager.MysqlXaDataSource по-прежнему будет содержать ссылку на XA-Datasource, даже если типом является Datasource.

The below is the snippet to show how is it working now.


@Bean(name = "customerDataSource", initMethod = "init", destroyMethod = "close")
@Primary
public DataSource customerDataSource() throws NamingException {     
    JndiDataSourceLookup dataSourceLookup = new JndiDataSourceLookup();
    DataSource mysqlXaDataSource =  (DataSource ) dataSourceLookup.getDataSource("java:/jdbc/jta_datasource_one");

    return mysqlXaDataSource;
}


LocalContainerEntityManagerFactoryBean em = new LocalContainerEntityManagerFactoryBean();
em.setJtaDataSource(customerDataSource());
0 голосов
/ 01 декабря 2018

Странно.

Так что же произойдет, если вы попробуете:

Object o = dataSourceLookup.getDataSource("java:/jdbc/atomikos_one");
System.out.println(o.getClass());

Какое имя класса напечатано?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...