From eade0fc687148f6aecf20de940061d18521c78c7 Mon Sep 17 00:00:00 2001 From: ityouknow Date: Thu, 5 Apr 2018 19:28:16 +0800 Subject: [PATCH] add atomikos --- spring-boot-atomikos/pom.xml | 60 +++++++++++++ spring-boot-atomikos/spring-boot-atomikos.iml | 15 ++++ .../java/com/neo/JtaAtomikosApplication.java | 12 +++ .../java/com/neo/config/DataSourceConfig.java | 30 +++++++ .../java/com/neo/config/PrimaryConfig.java | 63 +++++++++++++ .../java/com/neo/config/SecondaryConfig.java | 58 ++++++++++++ .../com/neo/controller/HelloController.java | 13 +++ .../src/main/java/com/neo/model/User.java | 88 +++++++++++++++++++ .../repository/test1/UserTest1Repository.java | 19 ++++ .../repository/test2/UserTest2Repository.java | 16 ++++ .../src/main/resources/application.properties | 15 ++++ .../java/com/neo/HelloApplicationTests.java | 18 ++++ .../neo/repository/UserRepositoryTests.java | 57 ++++++++++++ .../target/classes/application.properties | 15 ++++ .../compile/default-compile/createdFiles.lst | 0 .../compile/default-compile/inputFiles.lst | 8 ++ 16 files changed, 487 insertions(+) create mode 100644 spring-boot-atomikos/pom.xml create mode 100644 spring-boot-atomikos/spring-boot-atomikos.iml create mode 100644 spring-boot-atomikos/src/main/java/com/neo/JtaAtomikosApplication.java create mode 100644 spring-boot-atomikos/src/main/java/com/neo/config/DataSourceConfig.java create mode 100644 spring-boot-atomikos/src/main/java/com/neo/config/PrimaryConfig.java create mode 100644 spring-boot-atomikos/src/main/java/com/neo/config/SecondaryConfig.java create mode 100644 spring-boot-atomikos/src/main/java/com/neo/controller/HelloController.java create mode 100644 spring-boot-atomikos/src/main/java/com/neo/model/User.java create mode 100644 spring-boot-atomikos/src/main/java/com/neo/repository/test1/UserTest1Repository.java create mode 100644 spring-boot-atomikos/src/main/java/com/neo/repository/test2/UserTest2Repository.java create mode 100644 spring-boot-atomikos/src/main/resources/application.properties create mode 100644 spring-boot-atomikos/src/test/java/com/neo/HelloApplicationTests.java create mode 100644 spring-boot-atomikos/src/test/java/com/neo/repository/UserRepositoryTests.java create mode 100644 spring-boot-atomikos/target/classes/application.properties create mode 100644 spring-boot-atomikos/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst create mode 100644 spring-boot-atomikos/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst diff --git a/spring-boot-atomikos/pom.xml b/spring-boot-atomikos/pom.xml new file mode 100644 index 000000000..67e58581e --- /dev/null +++ b/spring-boot-atomikos/pom.xml @@ -0,0 +1,60 @@ + + + 4.0.0 + + com.neo + spring-boot-atomikos + 1.0 + jar + + spring-boot-atomikos + Demo project for Spring Boot + + + org.springframework.boot + spring-boot-starter-parent + 2.0.0.RELEASE + + + + + UTF-8 + 1.8 + + + + + org.springframework.boot + spring-boot-starter-web + + + org.springframework.boot + spring-boot-starter-data-jpa + + + org.springframework.boot + spring-boot-starter-jta-atomikos + + + mysql + mysql-connector-java + + + org.springframework.boot + spring-boot-starter-test + test + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + + + diff --git a/spring-boot-atomikos/spring-boot-atomikos.iml b/spring-boot-atomikos/spring-boot-atomikos.iml new file mode 100644 index 000000000..73f608bd6 --- /dev/null +++ b/spring-boot-atomikos/spring-boot-atomikos.iml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/spring-boot-atomikos/src/main/java/com/neo/JtaAtomikosApplication.java b/spring-boot-atomikos/src/main/java/com/neo/JtaAtomikosApplication.java new file mode 100644 index 000000000..cab4f8b65 --- /dev/null +++ b/spring-boot-atomikos/src/main/java/com/neo/JtaAtomikosApplication.java @@ -0,0 +1,12 @@ +package com.neo; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class JtaAtomikosApplication { + + public static void main(String[] args) { + SpringApplication.run(JtaAtomikosApplication.class, args); + } +} diff --git a/spring-boot-atomikos/src/main/java/com/neo/config/DataSourceConfig.java b/spring-boot-atomikos/src/main/java/com/neo/config/DataSourceConfig.java new file mode 100644 index 000000000..2fe83cf65 --- /dev/null +++ b/spring-boot-atomikos/src/main/java/com/neo/config/DataSourceConfig.java @@ -0,0 +1,30 @@ +package com.neo.config; + +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.boot.autoconfigure.jdbc.DataSourceBuilder; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Primary; + +import javax.sql.DataSource; + +@Configuration +public class DataSourceConfig { + + @Bean(name = "primaryDataSource") + @Qualifier("primaryDataSource") + @ConfigurationProperties(prefix="spring.primary.datasource") + public DataSource primaryDataSource() { + return new AtomikosDataSourceBean(); + } + + @Bean(name = "secondaryDataSource") + @Qualifier("secondaryDataSource") + @Primary + @ConfigurationProperties(prefix="spring.secondary.datasource") + public DataSource secondaryDataSource() { + return new AtomikosDataSourceBean(); + } + +} diff --git a/spring-boot-atomikos/src/main/java/com/neo/config/PrimaryConfig.java b/spring-boot-atomikos/src/main/java/com/neo/config/PrimaryConfig.java new file mode 100644 index 000000000..cdf80057b --- /dev/null +++ b/spring-boot-atomikos/src/main/java/com/neo/config/PrimaryConfig.java @@ -0,0 +1,63 @@ +package com.neo.config; + +import java.util.Map; + +import javax.persistence.EntityManager; +import javax.sql.DataSource; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.boot.autoconfigure.orm.jpa.JpaProperties; +import org.springframework.boot.orm.jpa.EntityManagerFactoryBuilder; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Primary; +import org.springframework.data.jpa.repository.config.EnableJpaRepositories; +import org.springframework.orm.jpa.JpaTransactionManager; +import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean; +import org.springframework.transaction.PlatformTransactionManager; +import org.springframework.transaction.annotation.EnableTransactionManagement; + +@Configuration +@EnableTransactionManagement +@EnableJpaRepositories( + entityManagerFactoryRef="entityManagerFactoryPrimary", + transactionManagerRef="transactionManagerPrimary", + basePackages= { "com.neo.repository.test1" })//设置dao(repo)所在位置 +public class PrimaryConfig { + + @Autowired + private JpaProperties jpaProperties; + + @Autowired + @Qualifier("primaryDataSource") + private DataSource primaryDataSource; + + @Bean(name = "entityManagerPrimary") + @Primary + public EntityManager entityManager(EntityManagerFactoryBuilder builder) { + return entityManagerFactoryPrimary(builder).getObject().createEntityManager(); + } + + @Bean(name = "entityManagerFactoryPrimary") + @Primary + public LocalContainerEntityManagerFactoryBean entityManagerFactoryPrimary (EntityManagerFactoryBuilder builder) { + return builder + .dataSource(primaryDataSource) + .properties(getVendorProperties(primaryDataSource)) + .packages("com.neo.domain") //设置实体类所在位置 + .persistenceUnit("primaryPersistenceUnit") + .build(); + } + + private Map getVendorProperties(DataSource dataSource) { + return jpaProperties.getHibernateProperties(dataSource); + } + + @Bean(name = "transactionManagerPrimary") + @Primary + PlatformTransactionManager transactionManagerPrimary(EntityManagerFactoryBuilder builder) { + return new JpaTransactionManager(entityManagerFactoryPrimary(builder).getObject()); + } + +} \ No newline at end of file diff --git a/spring-boot-atomikos/src/main/java/com/neo/config/SecondaryConfig.java b/spring-boot-atomikos/src/main/java/com/neo/config/SecondaryConfig.java new file mode 100644 index 000000000..861f46172 --- /dev/null +++ b/spring-boot-atomikos/src/main/java/com/neo/config/SecondaryConfig.java @@ -0,0 +1,58 @@ +package com.neo.config; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.boot.autoconfigure.orm.jpa.JpaProperties; +import org.springframework.boot.orm.jpa.EntityManagerFactoryBuilder; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Primary; +import org.springframework.data.jpa.repository.config.EnableJpaRepositories; +import org.springframework.orm.jpa.JpaTransactionManager; +import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean; +import org.springframework.transaction.PlatformTransactionManager; +import org.springframework.transaction.annotation.EnableTransactionManagement; + +import javax.persistence.EntityManager; +import javax.sql.DataSource; +import java.util.Map; + +@Configuration +@EnableTransactionManagement +@EnableJpaRepositories( + entityManagerFactoryRef="entityManagerFactorySecondary", + transactionManagerRef="transactionManagerSecondary", + basePackages= { "com.neo.repository.test2" }) +public class SecondaryConfig { + @Autowired + private JpaProperties jpaProperties; + + @Autowired + @Qualifier("secondaryDataSource") + private DataSource secondaryDataSource; + + @Bean(name = "entityManagerSecondary") + public EntityManager entityManager(EntityManagerFactoryBuilder builder) { + return entityManagerFactorySecondary(builder).getObject().createEntityManager(); + } + + @Bean(name = "entityManagerFactorySecondary") + public LocalContainerEntityManagerFactoryBean entityManagerFactorySecondary (EntityManagerFactoryBuilder builder) { + return builder + .dataSource(secondaryDataSource) + .properties(getVendorProperties(secondaryDataSource)) + .packages("com.neo.domain") + .persistenceUnit("secondaryPersistenceUnit") + .build(); + } + + private Map getVendorProperties(DataSource dataSource) { + return jpaProperties.getHibernateProperties(dataSource); + } + + @Bean(name = "transactionManagerSecondary") + PlatformTransactionManager transactionManagerSecondary(EntityManagerFactoryBuilder builder) { + return new JpaTransactionManager(entityManagerFactorySecondary(builder).getObject()); + } + +} \ No newline at end of file diff --git a/spring-boot-atomikos/src/main/java/com/neo/controller/HelloController.java b/spring-boot-atomikos/src/main/java/com/neo/controller/HelloController.java new file mode 100644 index 000000000..2c1c06de1 --- /dev/null +++ b/spring-boot-atomikos/src/main/java/com/neo/controller/HelloController.java @@ -0,0 +1,13 @@ +package com.neo.controller; + +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +@RestController +public class HelloController { + + @RequestMapping("/") + public String index() { + return "Hello Spring Boot 2.0!"; + } +} \ No newline at end of file diff --git a/spring-boot-atomikos/src/main/java/com/neo/model/User.java b/spring-boot-atomikos/src/main/java/com/neo/model/User.java new file mode 100644 index 000000000..76234d40d --- /dev/null +++ b/spring-boot-atomikos/src/main/java/com/neo/model/User.java @@ -0,0 +1,88 @@ +package com.neo.domain; + + + +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.Id; + +import java.io.Serializable; + +@Entity +public class User implements Serializable { + + private static final long serialVersionUID = 1L; + @Id + @GeneratedValue + private Long id; + @Column(nullable = false, unique = true) + private String userName; + @Column(nullable = false) + private String passWord; + @Column(nullable = false, unique = true) + private String email; + @Column(nullable = true, unique = true) + private String nickName; + @Column(nullable = false) + private String regTime; + + public User() { + } + + public User(String userName, String passWord, String email, String nickName, String regTime) { + this.userName = userName; + this.passWord = passWord; + this.email = email; + this.nickName = nickName; + this.regTime = regTime; + } + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public String getUserName() { + return userName; + } + + public void setUserName(String userName) { + this.userName = userName; + } + + public String getPassWord() { + return passWord; + } + + public void setPassWord(String passWord) { + this.passWord = passWord; + } + + public String getEmail() { + return email; + } + + public void setEmail(String email) { + this.email = email; + } + + public String getNickName() { + return nickName; + } + + public void setNickName(String nickName) { + this.nickName = nickName; + } + + public String getRegTime() { + return regTime; + } + + public void setRegTime(String regTime) { + this.regTime = regTime; + } +} diff --git a/spring-boot-atomikos/src/main/java/com/neo/repository/test1/UserTest1Repository.java b/spring-boot-atomikos/src/main/java/com/neo/repository/test1/UserTest1Repository.java new file mode 100644 index 000000000..5dc88acdb --- /dev/null +++ b/spring-boot-atomikos/src/main/java/com/neo/repository/test1/UserTest1Repository.java @@ -0,0 +1,19 @@ +package com.neo.repository.test1; + +import com.neo.domain.User; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.Pageable; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Modifying; +import org.springframework.data.jpa.repository.Query; +import org.springframework.stereotype.Component; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import javax.annotation.Resource; +import java.util.List; + +public interface UserTest1Repository extends JpaRepository { + User findByUserName(String userName); + User findByUserNameOrEmail(String username, String email); +} \ No newline at end of file diff --git a/spring-boot-atomikos/src/main/java/com/neo/repository/test2/UserTest2Repository.java b/spring-boot-atomikos/src/main/java/com/neo/repository/test2/UserTest2Repository.java new file mode 100644 index 000000000..32b25b200 --- /dev/null +++ b/spring-boot-atomikos/src/main/java/com/neo/repository/test2/UserTest2Repository.java @@ -0,0 +1,16 @@ +package com.neo.repository.test2; + +import com.neo.domain.User; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.Pageable; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Modifying; +import org.springframework.data.jpa.repository.Query; +import org.springframework.stereotype.Component; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +public interface UserTest2Repository extends JpaRepository { + User findByUserName(String userName); + User findByUserNameOrEmail(String username, String email); +} \ No newline at end of file diff --git a/spring-boot-atomikos/src/main/resources/application.properties b/spring-boot-atomikos/src/main/resources/application.properties new file mode 100644 index 000000000..10b7bb359 --- /dev/null +++ b/spring-boot-atomikos/src/main/resources/application.properties @@ -0,0 +1,15 @@ +#primary +spring.primary.datasource.url=jdbc:mysql://localhost:3306/test1 +spring.primary.datasource.username=root +spring.primary.datasource.password=root +spring.primary.datasource.driver-class-name=com.mysql.jdbc.Driver +#secondary +spring.secondary.datasource.url=jdbc:mysql://localhost:3306/test2 +spring.secondary.datasource.username=root +spring.secondary.datasource.password=root +spring.secondary.datasource.driver-class-name=com.mysql.jdbc.Driver +#multiple Setting + +spring.jpa.properties.hibernate.hbm2ddl.auto=update +spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL5InnoDBDialect +spring.jpa.show-sql= true \ No newline at end of file diff --git a/spring-boot-atomikos/src/test/java/com/neo/HelloApplicationTests.java b/spring-boot-atomikos/src/test/java/com/neo/HelloApplicationTests.java new file mode 100644 index 000000000..09ba4ff06 --- /dev/null +++ b/spring-boot-atomikos/src/test/java/com/neo/HelloApplicationTests.java @@ -0,0 +1,18 @@ +package com.neo; + +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; +import org.springframework.test.context.junit4.SpringRunner; + +@RunWith(SpringRunner.class) +@SpringBootTest +public class HelloApplicationTests { + + @Test + public void contextLoads() { + System.out.println("Hello Spring Boot 2.0!"); + } + +} diff --git a/spring-boot-atomikos/src/test/java/com/neo/repository/UserRepositoryTests.java b/spring-boot-atomikos/src/test/java/com/neo/repository/UserRepositoryTests.java new file mode 100644 index 000000000..d1f1ae65f --- /dev/null +++ b/spring-boot-atomikos/src/test/java/com/neo/repository/UserRepositoryTests.java @@ -0,0 +1,57 @@ +package com.neo.repository; + +import com.neo.domain.User; +import com.neo.repository.test1.UserTest1Repository; +import com.neo.repository.test2.UserTest2Repository; +import org.junit.Assert; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.data.domain.PageRequest; +import org.springframework.data.domain.Pageable; +import org.springframework.data.domain.Sort; +import org.springframework.test.context.junit4.SpringRunner; + +import javax.annotation.Resource; +import java.text.DateFormat; +import java.util.Date; + +@RunWith(SpringRunner.class) +@SpringBootTest +public class UserRepositoryTests { + @Resource + private UserTest1Repository userTest1Repository; + @Resource + private UserTest2Repository userTest2Repository; + + @Test + @Transactional + public void testSave() throws Exception { + Date date = new Date(); + DateFormat dateFormat = DateFormat.getDateTimeInstance(DateFormat.LONG, DateFormat.LONG); + String formattedDate = dateFormat.format(date); + + userTest1Repository.save(new User("aa", "aa123456","aa@126.com", "aa", formattedDate)); + userTest1Repository.save(new User("bb", "bb123456","bb@126.com", "bb", formattedDate)); + userTest2Repository.save(new User("cc", "cc123456","cc@126.com", "cc", formattedDate)); + + } + + + @Test + public void testBaseQuery() { + Date date = new Date(); + DateFormat dateFormat = DateFormat.getDateTimeInstance(DateFormat.LONG, DateFormat.LONG); + String formattedDate = dateFormat.format(date); + User user=new User("ff", "ff123456","ff@126.com", "ff", formattedDate); + userTest1Repository.findAll(); + userTest2Repository.findOne(3l); + userTest2Repository.save(user); + user.setId(2l); + userTest1Repository.delete(user); + userTest1Repository.count(); + userTest2Repository.exists(3l); + } + + +} \ No newline at end of file diff --git a/spring-boot-atomikos/target/classes/application.properties b/spring-boot-atomikos/target/classes/application.properties new file mode 100644 index 000000000..10b7bb359 --- /dev/null +++ b/spring-boot-atomikos/target/classes/application.properties @@ -0,0 +1,15 @@ +#primary +spring.primary.datasource.url=jdbc:mysql://localhost:3306/test1 +spring.primary.datasource.username=root +spring.primary.datasource.password=root +spring.primary.datasource.driver-class-name=com.mysql.jdbc.Driver +#secondary +spring.secondary.datasource.url=jdbc:mysql://localhost:3306/test2 +spring.secondary.datasource.username=root +spring.secondary.datasource.password=root +spring.secondary.datasource.driver-class-name=com.mysql.jdbc.Driver +#multiple Setting + +spring.jpa.properties.hibernate.hbm2ddl.auto=update +spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL5InnoDBDialect +spring.jpa.show-sql= true \ No newline at end of file diff --git a/spring-boot-atomikos/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst b/spring-boot-atomikos/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst new file mode 100644 index 000000000..e69de29bb diff --git a/spring-boot-atomikos/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst b/spring-boot-atomikos/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst new file mode 100644 index 000000000..973647fa8 --- /dev/null +++ b/spring-boot-atomikos/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst @@ -0,0 +1,8 @@ +/neo/hello/spring-boot-atomikos/src/main/java/com/neo/config/SecondaryConfig.java +/neo/hello/spring-boot-atomikos/src/main/java/com/neo/JtaAtomikosApplication.java +/neo/hello/spring-boot-atomikos/src/main/java/com/neo/model/User.java +/neo/hello/spring-boot-atomikos/src/main/java/com/neo/repository/test1/UserTest1Repository.java +/neo/hello/spring-boot-atomikos/src/main/java/com/neo/config/PrimaryConfig.java +/neo/hello/spring-boot-atomikos/src/main/java/com/neo/controller/HelloController.java +/neo/hello/spring-boot-atomikos/src/main/java/com/neo/config/DataSourceConfig.java +/neo/hello/spring-boot-atomikos/src/main/java/com/neo/repository/test2/UserTest2Repository.java