Prerequisites
- Procure user accounts to Rice databases
- Procure the rice-api and rice-impl JARs and all transitive dependencies using either of the following methods:
- Download JARs and all transitive dependencies from the Kuali Rice website
- Download ucd-rice-standalone-server WAR from Artifactory. This WAR contains all dependencies.
- Add rice-api and rice-impl as Maven dependencies in your project.
pom.xml
<repositories> <repository> <id>kuali</id> <name>Kuali Repository</name> <url>https://test.kuali.org/maven</url> </repository> </repositories> <dependency> <groupId>org.kuali.rice</groupId> <artifactId>rice-api</artifactId> <version>${rice-api.version}</version> </dependency> <dependency> <groupId>org.kuali.rice</groupId> <artifactId>rice-impl</artifactId> <version>${rice-impl.version}</version> <exclusions> <exclusion> <groupId>com.oracle</groupId> <artifactId>ojdbc14</artifactId> </exclusion> </exclusions> </dependency>
We exclude the Oracle JDBC driver since it is a commercial product and not available on any public Maven repositories.
Declaring Properties
We use a simple XML configuration to declare properties as key-value pairs. For example:
classpath:edu/ucdavis/myapp/config/client-config.xml
<config> <param name="datasource.ojb.platform">Oracle</param> <param name="datasource.platform">org.kuali.rice.core.database.platform.OraclePlatform</param> <param name="datasource.url">jdbc:oracle:thin:@dbhost.ucdavis.edu:1521:SID</param> <param name="datasource.driver.name">oracle.jdbc.driver.OracleDriver</param> <param name="datasource.pool.validationQuery">select 1 from duak</param> <param name="datasource.pool.maxWait">30000</param> <param name="datasource.pool.size">30</param> <param name="datasource.pool.maxActive">50</param> <param name="datasource.minIdle">7</param> <param name="datasource.initialSize">7</param> <param name="datasource.accessToUnderlyingConnectionAllowed">true</param> <param name="datasource.username">my_db_user</param> <param name="datasource.password">my_db_password</param> <config>
See a full-blown set of sample properties .
Spring Property Configuration
Kuali Rice uses Spring's PropertyPlaceholderConfigurer to make properties available to Spring tokens.
classpath:edu/ucdavis/myapp/config/application-common.xml
<bean id="config" class="org.kuali.rice.core.config.spring.ConfigFactoryBean"> <property name="configLocations"> <list> <value>classpath:edu/ucdavis/myapp/config/client-config.xml</value> </list> </property> </bean> <bean id="configProperties" class="org.springframework.beans.factory.config.MethodInvokingFactoryBean"> <property name="targetObject" ref="config" /> <property name="targetMethod" value="getProperties" /> </bean> <bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> <property name="properties" ref="configProperties" /> </bean>
The properties file can be "injected" using either of the following methods:
- From the classpath
classpath:edu/ucdavis/myapp/config/application-common.xml
<bean id="config" class="org.kuali.rice.core.config.spring.ConfigFactoryBean"> <property name="configLocations"> <list> <value>classpath:edu/ucdavis/myapp/config/client-config.xml</value> </list> </property> </bean>
- From the file system
classpath:edu/ucdavis/myapp/config/application-common.xml
<bean id="config" class="org.kuali.rice.core.config.spring.ConfigFactoryBean"> <property name="configLocations"> <list> <value>/usr/local/myapp/client-config.xml</value> </list> </property> </bean>
Data Source Configuration
Kuali Rice uses Java Open Transaction Manager, so we declare the appropriate beans.
classpath:edu/ucdavis/myapp/config/application-data.xml
<bean id="jotm" class="org.springframework.transaction.jta.JotmFactoryBean"> <property name="defaultTimeout" value="${transaction.timeout}"/> </bean> <bean id="jtaTransactionManager" class="org.springframework.transaction.jta.JtaTransactionManager"> <property name="transactionManager" ref="jotm"/> <property name="userTransaction" ref="jotm"/> </bean>
We must declare three data sources:
- A transactional data source where the local client application's Rice tables are located. This is required by JOTM.
classpath:edu/ucdavis/myapp/config/application-data.xml
<bean id="dataSource" class="org.kuali.rice.core.database.XAPoolDataSource"> <property name="transactionManager" ref="jotm" /> <property name="driverClassName" value="${datasource.driver.name}" /> <property name="url" value="${datasource.url}" /> <property name="maxSize" value="${datasource.pool.size}" /> <property name="minSize" value="${datasource.initialSize}" /> <property name="maxWait" value="${datasource.pool.maxWait}" /> <property name="validationQuery" value="${datasource.pool.validationQuery}" /> <property name="username" value="${datasource.username}" /> <property name="password" value="${datasource.password}" /> </bean>
- A non-transactional data source pointing to those same Rice tables. This is required by Quartz.
classpath:edu/ucdavis/myapp/config/application-data.xml
<bean id="nonTransactionalDataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"> <property name="driverClassName" value="${datasource.driver.name}" /> <property name="url" value="${datasource.url}" /> <property name="maxActive" value="${datasource.pool.maxActive}" /> <property name="minIdle" value="${datasource.minIdle}" /> <property name="initialSize" value="${datasource.initialSize}" /> <property name="validationQuery" value="${datasource.pool.validationQuery}" /> <property name="username" value="${datasource.username}" /> <property name="password" value="${datasource.password}" /> <property name="accessToUnderlyingConnectionAllowed" value="${datasource.accessToUnderlyingConnectionAllowed}" /> </bean>
- A transactional data source pointing to the database of the Rice Standalone Server.
classpath:edu/ucdavis/myapp/config/application-data.xml
<bean id="standaloneDataSource" class="org.kuali.rice.core.database.XAPoolDataSource"> <property name="transactionManager" ref="jotm" /> <property name="driverClassName" value="${standalone.datasource.driver.name}" /> <property name="url" value="${standalone.datasource.url}" /> <property name="maxSize" value="${standalone.datasource.pool.size}" /> <property name="minSize" value="${standalone.datasource.initialSize}" /> <property name="maxWait" value="${standalone.datasource.pool.maxWait}" /> <property name="validationQuery" value="${standalone.datasource.pool.validationQuery}" /> <property name="username" value="${standalone.datasource.username}" /> <property name="password" value="${standalone.datasource.password}" /> </bean>
Rice Bean Configuration
Finally, we declare the rice bean and inject all of the data source beans into it any /wiki/spaces/UCDK/pages/119111884
classpath:edu/ucdavis/myapp/config/rice-common.xml
<bean id="rice" class="org.kuali.rice.core.config.RiceConfigurer"> <property name="dataSource" ref="dataSource" /> <property name="nonTransactionalDataSource" ref="nonTransactionalDataSource"/> <property name="serverDataSource" ref="standaloneDataSource"/> <property name="transactionManager" ref="jotm" /> <property name="userTransaction" ref="jotm" /> <property name="serviceNamespace" value="${service.namespace}" /> <property name="environment" value="${environment}" /> <property name="rootConfig" ref="config" /> <property name="ksbConfigurer"> <bean class="org.kuali.rice.ksb.messaging.config.KSBConfigurer"> <property name="serviceServletUrl" value="${serviceServletUrl}" /> </bean> </property> <property name="kewConfigurer"> <bean class="org.kuali.rice.kew.config.KEWConfigurer"> <property name="clientProtocol" value="local" /> </bean> </property> <property name="knsConfigurer"> <bean class="org.kuali.rice.kns.config.KNSConfigurer"/> </property> <property name="kimConfigurer"> <bean class="org.kuali.rice.kim.config.KIMConfigurer"/> </property> <property name="kcbConfigurer"> <bean class="org.kuali.rice.kcb.config.KCBConfigurer"/> </property> <property name="additionalSpringFiles"> <value>${rice.additionalSpringFiles}</value> </property> </bean>