Guest User

Untitled

a guest
Feb 1st, 2018
101
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 11.76 KB | None | 0 0
  1. package org.foo.config;
  2.  
  3. @Configuration
  4. @EnableJpaRepositories(basePackages = "org.foo")
  5. @EnableTransactionManagement
  6. public class DataSourceConfiguration
  7. {
  8.  
  9. @Value("#{'${load.datasources}'.split(',')}")
  10. private List<String> toLoadDatasources;
  11.  
  12. @Value("${default.datasource}")
  13. private String defaultDatasource;
  14.  
  15. @Bean
  16. @ConfigurationProperties("spring.jpa")
  17. public JpaProperties jpaProperties()
  18. {
  19. return new JpaProperties();
  20. }
  21.  
  22. @Bean
  23. @Primary
  24. public DataSource dataSource()
  25. {
  26. if(toLoadDatasources.isEmpty())
  27. {
  28. throw new IllegalArgumentException("At least one datasource to load must be provided. Please check datasources configuration");
  29. }
  30. if(defaultDatasource == null || defaultDatasource.isEmpty())
  31. {
  32. throw new IllegalArgumentException("No default datasource provided. Please check datasources configuration");
  33. }
  34. if(!toLoadDatasources.contains(defaultDatasource))
  35. {
  36. throw new IllegalArgumentException("Default datasource must appear in the list of datasources to load. Please check datasources configuration");
  37. }
  38.  
  39. final Map<Object, Object> map = new HashMap<Object, Object>();
  40.  
  41. if(toLoadDatasources.contains(Customer.CUST1.name()))
  42. {
  43. map.put("datasourceCust1", dataSourceCust1());
  44. }
  45. if(toLoadDatasources.contains(Customer.CUST2.name()))
  46. {
  47. map.put("datasourceCust2", dataSourceCust2());
  48. }
  49. if(toLoadDatasources.contains(Customer.CUST3.name()))
  50. {
  51. map.put("datasourceCust3", dataSourceCust3());
  52. }
  53. if(toLoadDatasources.contains(Customer.CUST4.name()))
  54. {
  55. map.put("datasourceCust4", dataSourceCust4());
  56. }
  57.  
  58. DataSourceRouter router = new DataSourceRouter();
  59. router.setTargetDataSources(map);
  60.  
  61. if(Customer.CUST1.name().equalsIgnoreCase(defaultDatasource))
  62. {
  63. router.setDefaultTargetDataSource(dataSourceCust1());
  64. }
  65. else if(Customer.CUST2.name().equalsIgnoreCase(defaultDatasource))
  66. {
  67. router.setDefaultTargetDataSource(dataSourceCust2());
  68. }
  69. else if(Customer.CUST3.name().equalsIgnoreCase(defaultDatasource))
  70. {
  71. router.setDefaultTargetDataSource(dataSourceCust3());
  72. }
  73. else if(Customer.CUST4.name().equalsIgnoreCase(defaultDatasource))
  74. {
  75. router.setDefaultTargetDataSource(dataSourceCust4());
  76. }
  77. else
  78. {
  79. throw new IllegalArgumentException("At least one default datasource must be provided.");
  80. }
  81.  
  82. return router;
  83. }
  84.  
  85. @Bean
  86. @Primary
  87. public LocalContainerEntityManagerFactoryBean emfb(DataSource ds, EntityManagerFactoryBuilder builder, final JpaProperties jpaProperties)
  88. {
  89. return builder.dataSource(ds)
  90. .packages("org.foo")
  91. .build();
  92. }
  93.  
  94. @Bean
  95. @Primary
  96. public PlatformTransactionManager transactionManager(EntityManagerFactoryBuilder builder, final JpaProperties jpaProperties)
  97. {
  98. JpaTransactionManager transactionManager = new JpaTransactionManager();
  99. transactionManager.setEntityManagerFactory(emfb(dataSource(), builder, jpaProperties).getObject());
  100. return transactionManager;
  101. }
  102.  
  103. @Bean(name="dataSourceCust1")
  104. @Conditional(LoadCust1DatasourceCondition.class)
  105. @ConfigurationProperties(prefix = "spring.cust1.datasource")
  106. public DataSource dataSourceCust1()
  107. {
  108. return DataSourceBuilder.create().build();
  109. }
  110.  
  111. @PersistenceContext(unitName = "entityManagerCust1")
  112. @Bean(name="entityManagerCust1")
  113. @Conditional(LoadCust1DatasourceCondition.class)
  114. public LocalContainerEntityManagerFactoryBean emfbCust1(DataSource ds, EntityManagerFactoryBuilder builder, final JpaProperties jpaProperties)
  115. {
  116. return builder.dataSource(ds)
  117. .packages("org.foo")
  118. .persistenceUnit("entityManagerCust1")
  119. .build();
  120. }
  121.  
  122. @Bean(name="transactionManagerCust1")
  123. @Conditional(LoadCust1DatasourceCondition.class)
  124. public PlatformTransactionManager transactionManagerCust1(EntityManagerFactoryBuilder builder, final JpaProperties jpaProperties)
  125. {
  126. JpaTransactionManager transactionManager = new JpaTransactionManager();
  127. transactionManager.setEntityManagerFactory(emfbCust1(dataSourceCust1(), builder, jpaProperties).getObject());
  128. return transactionManager;
  129. }
  130.  
  131. @Bean(name="dataSourceCust2")
  132. @Conditional(LoadCust2DatasourceCondition.class)
  133. @ConfigurationProperties(prefix = "spring.cust2.datasource")
  134. public DataSource dataSourceCust2()
  135. {
  136. return DataSourceBuilder.create().build();
  137. }
  138.  
  139. @PersistenceContext(unitName = "entityManagerCust2")
  140. @Bean(name="entityManagerCust2")
  141. @Conditional(LoadCust2DatasourceCondition.class)
  142. public LocalContainerEntityManagerFactoryBean emfbCust2(@Qualifier("dataSourceCust2") DataSource ds, EntityManagerFactoryBuilder builder, final JpaProperties jpaProperties)
  143. {
  144. return builder.dataSource(ds)
  145. .packages("org.foo")
  146. .persistenceUnit("entityManagerCust2")
  147. .build();
  148. }
  149.  
  150. @Bean(name="transactionManagerCust2")
  151. @Conditional(LoadCust2DatasourceCondition.class)
  152. public PlatformTransactionManager transactionManagerCust2(EntityManagerFactoryBuilder builder, final JpaProperties jpaProperties)
  153. {
  154. JpaTransactionManager transactionManager = new JpaTransactionManager();
  155. transactionManager.setEntityManagerFactory(emfbCust2(dataSourceCust2(), builder, jpaProperties).getObject());
  156. return transactionManager;
  157. }
  158.  
  159. @Bean(name="dataSourceCust3")
  160. @Conditional(LoadCust3DatasourceCondition.class)
  161. @ConfigurationProperties(prefix = "spring.cust3.datasource")
  162. public DataSource dataSourceCust3()
  163. {
  164. return DataSourceBuilder.create().build();
  165. }
  166.  
  167. @PersistenceContext(unitName = "entityManagerCust3")
  168. @Bean(name="entityManagerCust3")
  169. @Conditional(LoadCust3DatasourceCondition.class)
  170. public LocalContainerEntityManagerFactoryBean emfbCust3(@Qualifier("dataSourceCust3") DataSource ds, EntityManagerFactoryBuilder builder, final JpaProperties jpaProperties)
  171. {
  172. return builder.dataSource(ds)
  173. .packages("org.foo")
  174. .persistenceUnit("entityManagerCust3")
  175. .build();
  176. }
  177.  
  178. @Bean(name="transactionManagerCust3")
  179. @Conditional(LoadCust3DatasourceCondition.class)
  180. public PlatformTransactionManager transactionManagerCust3(EntityManagerFactoryBuilder builder, final JpaProperties jpaProperties)
  181. {
  182. JpaTransactionManager transactionManager = new JpaTransactionManager();
  183. transactionManager.setEntityManagerFactory(emfbCust3(dataSourceCust3(), builder, jpaProperties).getObject());
  184. return transactionManager;
  185. }
  186.  
  187. @Bean(name="dataSourceCust4")
  188. @Conditional(LoadCust4DatasourceCondition.class)
  189. @ConfigurationProperties(prefix = "spring.cust4.datasource")
  190. public DataSource dataSourceCust4()
  191. {
  192. return DataSourceBuilder.create().build();
  193. }
  194.  
  195. @PersistenceContext(unitName = "entityManagerCust4")
  196. @Bean(name="entityManagerCust4")
  197. @Conditional(LoadCust4DatasourceCondition.class)
  198. public LocalContainerEntityManagerFactoryBean emfbCust4(@Qualifier("dataSourceCust4") DataSource ds, EntityManagerFactoryBuilder builder, final JpaProperties jpaProperties)
  199. {
  200. return builder.dataSource(ds)
  201. .packages("org.foo")
  202. .persistenceUnit("entityManagerCust4")
  203. .build();
  204. }
  205.  
  206. @Bean(name="transactionManagerCust4")
  207. @Conditional(LoadCust4DatasourceCondition.class)
  208. public PlatformTransactionManager transactionManagerCust4(EntityManagerFactoryBuilder builder, final JpaProperties jpaProperties)
  209. {
  210. JpaTransactionManager transactionManager = new JpaTransactionManager();
  211. transactionManager.setEntityManagerFactory(emfbCust4(dataSourceCust4(), builder, jpaProperties).getObject());
  212. return transactionManager;
  213. }
  214.  
  215. # Datasources
  216. spring.cust1.datasource.driver-class-name: com.mysql.jdbc.Driver
  217. spring.cust1.datasource.url:
  218. spring.cust1.datasource.username: root
  219. spring.cust1.datasource.password: pass
  220.  
  221. spring.cust2.datasource.driver-class-name: com.mysql.jdbc.Driver
  222. spring.cust2.datasource.url:
  223. spring.cust2.datasource.username: root
  224. spring.cust2.datasource.password: pass
  225.  
  226. spring.cust3.datasource.driver-class-name: com.mysql.jdbc.Driver
  227. spring.cust3.datasource.url:
  228. spring.cust3.datasource.username: root
  229. spring.cust3.datasource.password: pass
  230.  
  231. spring.cust4.datasource.driver-class-name: com.mysql.jdbc.Driver
  232. spring.cust4.datasource.url: jdbc:
  233. spring.cust4.datasource.username: root
  234. spring.cust4.datasource.password: pass
  235.  
  236.  
  237. # JPA/Hibernate
  238. spring.jpa.hibernate.dialect: org.hibernate.dialect.MySQL5Dialect
  239. spring.jpa.hibernate.show_sql: true
  240. spring.jpa.hibernate.hbm2ddl.auto: none
  241. spring.jpa.entitymanager.packagesToScan: org.foo.domain
  242.  
  243. load.datasources: CUST1, CUST2, CUST3, CUST4
  244. default.datasource: CUST1
  245.  
  246. @Service
  247. public class InvoiceServiceImpl implements IInvoiceService {
  248. @Autowired
  249. private IInvoiceDao invoiceDao;
  250.  
  251. @Override
  252. @Transactional(propagation = Propagation.REQUIRED, rollbackFor = {TechnicalException.class, BusinessException.class}, transactionManager = "transactionManagerCust1")
  253. public Invoice create(Invoice invoice, Customer customer) throws AbstractException {
  254.  
  255. return invoiceDao.persist(invoice, customer);
  256. }
  257.  
  258. }
  259.  
  260. @Repository
  261. public class InvoiceDaoImpl implements IInvoiceDao
  262. {
  263.  
  264. @Autowired(required = false)
  265. @Qualifier("entityManagerCust1")
  266. private EntityManager entityManagerCust1;
  267.  
  268. @Autowired(required = false)
  269. @Qualifier("entityManagerCust2")
  270. private EntityManager entityManagerCust2;
  271.  
  272. @Autowired(required = false)
  273. @Qualifier("entityManagerCust3")
  274. private EntityManager entityManagerCust3;
  275.  
  276. @Autowired(required = false)
  277. @Qualifier("entityManagerCust4")
  278. private EntityManager entityManagerCust4;
  279.  
  280. @Override
  281. public Invoice persist(Invoice invoice, Customer customer) throws AbstractException {
  282.  
  283. try {
  284. getEntityManager(customer).persist(invoice);
  285. } catch(EntityExistsException eee) {
  286. logger.error(ExceptionConstantes.MSG_INV_ALRDY_EXIST);
  287. throw new BusinessException(ExceptionConstantes.MSG_INV_ALRDY_EXIST, ExceptionConstantes.CODE_INV_ALRDY_EXIST);
  288. }catch (Exception e){
  289. logger.error(String.format(ExceptionConstantes.MSG_CREATE_ERR, invoice.getClass().getSimpleName()), e);
  290. throw new TechnicalException(String.format(ExceptionConstantes.MSG_CREATE_ERR, invoice.getClass().getSimpleName()));
  291. }
  292.  
  293. return invoice;
  294. }
  295.  
  296.  
  297.  
  298.  
  299. private EntityManager getEntityManager(Customer customer) throws IllegalArgumentException
  300. {
  301. switch(customer)
  302. {
  303. case CUST1 : if(entityManagerCust1 == null){ throw new IllegalArgumentException("Requested " + customer.name() +"'s datasource is not loaded. Please check datasources configuration"); }
  304. return entityManagerCust1;
  305. case CUST2 : if(entityManagerCust2 == null){ throw new IllegalArgumentException("Requested " + customer.name() + "'s datasource is not loaded. Please check datasources configuration"); }
  306. return entityManagerCust2;
  307. case CUST3 : if(entityManagerCust3 == null){ throw new IllegalArgumentException("Requested " + customer.name() + "'s datasource is not loaded. Please check datasources configuration"); }
  308. return entityManagerCust3;
  309. case CUST4 : if(entityManagerCust4 == null){ throw new IllegalArgumentException("Requested " + customer.name() + "'s datasource is not loaded. Please check datasources configuration"); }
  310. return entityManagerCust4;
  311. default: throw new IllegalArgumentException("Invalid publisher " + customer.name());
  312. }
  313. }
  314.  
  315.  
  316. @Conditional(LoadCust1DatasourceCondition.class)
  317. public void setEntityManagerCust1(EntityManager entityManagerCust1)
  318. {
  319. this.entityManagerCust1 = entityManagerCust1;
  320. }
  321.  
  322. @Conditional(LoadCust2DatasourceCondition.class)
  323. public void setEntityManagerCust2(EntityManager entityManagerCust2)
  324. {
  325. this.entityManagerCust2 = entityManagerCust2;
  326. }
  327. @Conditional(LoadCust3DatasourceCondition.class)
  328. public void setEntityManagerCust3(EntityManager entityManagerCust3)
  329. {
  330. this.entityManagerCust3 = entityManagerCust3;
  331. }
  332. @Conditional(LoadCust4DatasourceCondition.class)
  333. public void setEntityManagerCust4(EntityManager entityManagerCust4)
  334. {
  335. this.entityManagerCust4 = entityManagerCust4;
  336. }
Add Comment
Please, Sign In to add comment