add oracle datasource and tables for test cqrs and event driven read model now call rest from gateway and save in command db in srivce a and save on query db serivce a then send to kafka message queue and save on snapshot tabel on service b
This commit is contained in:
5
pom.xml
5
pom.xml
@ -54,6 +54,11 @@
|
|||||||
<artifactId>postgresql</artifactId>
|
<artifactId>postgresql</artifactId>
|
||||||
<scope>runtime</scope>
|
<scope>runtime</scope>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>com.oracle.database.jdbc</groupId>
|
||||||
|
<artifactId>ojdbc8</artifactId>
|
||||||
|
<version>19.8.0.0</version>
|
||||||
|
</dependency>
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.projectlombok</groupId>
|
<groupId>org.projectlombok</groupId>
|
||||||
<artifactId>lombok</artifactId>
|
<artifactId>lombok</artifactId>
|
||||||
|
@ -22,7 +22,7 @@ public class UserCommandHandler {
|
|||||||
userEntity.setId(createUserCommand.getUserId());
|
userEntity.setId(createUserCommand.getUserId());
|
||||||
userEntity.setUserName(createUserCommand.getUserName());
|
userEntity.setUserName(createUserCommand.getUserName());
|
||||||
userEntity.setEmail(createUserCommand.getEmail());
|
userEntity.setEmail(createUserCommand.getEmail());
|
||||||
// userRepository.save(userEntity);
|
userRepository.save(userEntity);
|
||||||
UserCreatedEvent event = new UserCreatedEvent(
|
UserCreatedEvent event = new UserCreatedEvent(
|
||||||
userEntity.getId(),
|
userEntity.getId(),
|
||||||
userEntity.getUserName(),
|
userEntity.getUserName(),
|
||||||
|
@ -8,14 +8,14 @@ import static jakarta.persistence.GenerationType.SEQUENCE;
|
|||||||
@Entity
|
@Entity
|
||||||
@Getter
|
@Getter
|
||||||
@Setter
|
@Setter
|
||||||
@Table(schema = "testapp", name = "user")
|
@Table(schema = "TEST", name = "USERS")
|
||||||
@Builder
|
@Builder
|
||||||
@AllArgsConstructor
|
@AllArgsConstructor
|
||||||
@NoArgsConstructor
|
@NoArgsConstructor
|
||||||
public class UserEntity {
|
public class UserEntity {
|
||||||
|
|
||||||
@Id
|
@Id
|
||||||
@SequenceGenerator(name = "seqTest", sequenceName = "testapp.person_seq", allocationSize = 1)
|
@SequenceGenerator(name = "seqTest", sequenceName = "USER_SEQ", allocationSize = 1)
|
||||||
@GeneratedValue(strategy = SEQUENCE, generator = "seqTest")
|
@GeneratedValue(strategy = SEQUENCE, generator = "seqTest")
|
||||||
private Long id;
|
private Long id;
|
||||||
@Column(name = "user_name")
|
@Column(name = "user_name")
|
||||||
|
26
src/main/java/com/example/mmad/testapp/entity/UserQueryEntity.java
Executable file
26
src/main/java/com/example/mmad/testapp/entity/UserQueryEntity.java
Executable file
@ -0,0 +1,26 @@
|
|||||||
|
package com.example.mmad.testapp.entity;
|
||||||
|
|
||||||
|
import jakarta.persistence.Column;
|
||||||
|
import jakarta.persistence.Entity;
|
||||||
|
import jakarta.persistence.Id;
|
||||||
|
import jakarta.persistence.Table;
|
||||||
|
import lombok.*;
|
||||||
|
|
||||||
|
@Entity
|
||||||
|
@Getter
|
||||||
|
@Setter
|
||||||
|
@Table(schema = "TEST", name = "USERS_QUERY")
|
||||||
|
@Builder
|
||||||
|
@AllArgsConstructor
|
||||||
|
@NoArgsConstructor
|
||||||
|
public class UserQueryEntity {
|
||||||
|
|
||||||
|
@Id
|
||||||
|
// @SequenceGenerator(name = "seqTest", sequenceName = "USER_SEQ", allocationSize = 1)
|
||||||
|
// @GeneratedValue(strategy = SEQUENCE, generator = "seqTest")
|
||||||
|
private Long id;
|
||||||
|
@Column(name = "user_name")
|
||||||
|
private String userName;
|
||||||
|
@Column(name = "email")
|
||||||
|
private String email;
|
||||||
|
}
|
@ -1,27 +1,34 @@
|
|||||||
package com.example.mmad.testapp.query;
|
package com.example.mmad.testapp.query;
|
||||||
|
|
||||||
|
import com.example.mmad.testapp.entity.UserQueryEntity;
|
||||||
import com.example.mmad.testapp.event.UserCreatedEvent;
|
import com.example.mmad.testapp.event.UserCreatedEvent;
|
||||||
import com.example.mmad.testapp.kafkaProducerConfig.KafkaProducerConfig;
|
import com.example.mmad.testapp.kafkaProducerConfig.KafkaProducerConfig;
|
||||||
|
import com.example.mmad.testapp.repository.UserReadRepository;
|
||||||
import org.springframework.context.event.EventListener;
|
import org.springframework.context.event.EventListener;
|
||||||
import org.springframework.scheduling.annotation.Async;
|
import org.springframework.scheduling.annotation.Async;
|
||||||
import org.springframework.stereotype.Component;
|
import org.springframework.stereotype.Component;
|
||||||
|
|
||||||
import java.util.List;
|
|
||||||
|
|
||||||
@Component
|
@Component
|
||||||
public class UserQueryHandler {
|
public class UserQueryHandler {
|
||||||
private static final String kafkaTopic = "user-created";
|
private static final String kafkaTopic = "user-created";
|
||||||
private final KafkaProducerConfig kafkaProducer;
|
private final KafkaProducerConfig kafkaProducer;
|
||||||
|
private final UserReadRepository userReadRepository;
|
||||||
|
|
||||||
public UserQueryHandler(KafkaProducerConfig kafkaProducer) {
|
public UserQueryHandler(KafkaProducerConfig kafkaProducer, UserReadRepository userReadRepository) {
|
||||||
this.kafkaProducer = kafkaProducer;
|
this.kafkaProducer = kafkaProducer;
|
||||||
|
this.userReadRepository = userReadRepository;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Async("taskExecutor")
|
@Async("taskExecutor")
|
||||||
@EventListener
|
@EventListener
|
||||||
public void handelUserCreated(UserCreatedEvent event) {
|
public void handelUserCreated(UserCreatedEvent event) {
|
||||||
kafkaProducer.kafkaTemplate().send(kafkaTopic, event);
|
kafkaProducer.kafkaTemplate().send(kafkaTopic, event);
|
||||||
// persist in query data base
|
UserQueryEntity userQueryEntity = new UserQueryEntity();
|
||||||
|
userQueryEntity.setId(event.getUserId());
|
||||||
|
userQueryEntity.setUserName(event.getUsername());
|
||||||
|
userQueryEntity.setEmail(event.getEmail());
|
||||||
|
//TODO mapper needed
|
||||||
|
userReadRepository.save(userQueryEntity);
|
||||||
System.out.println("Received user created event" + event.getUserId());
|
System.out.println("Received user created event" + event.getUserId());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,9 +1,9 @@
|
|||||||
package com.example.mmad.testapp.repository;
|
package com.example.mmad.testapp.repository;
|
||||||
|
|
||||||
import com.example.mmad.testapp.entity.PersonEntity;
|
import com.example.mmad.testapp.entity.UserQueryEntity;
|
||||||
import org.springframework.data.jpa.repository.JpaRepository;
|
import org.springframework.data.jpa.repository.JpaRepository;
|
||||||
import org.springframework.stereotype.Repository;
|
import org.springframework.stereotype.Repository;
|
||||||
|
|
||||||
@Repository
|
@Repository
|
||||||
public interface UserReadRepository extends JpaRepository<PersonEntity, Long> {
|
public interface UserReadRepository extends JpaRepository<UserQueryEntity, Long> {
|
||||||
}
|
}
|
||||||
|
22
src/main/resources/db/changelog/changes/oracleLiquibases/liquibase-1.1.xml
Executable file
22
src/main/resources/db/changelog/changes/oracleLiquibases/liquibase-1.1.xml
Executable file
@ -0,0 +1,22 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<databaseChangeLog
|
||||||
|
xmlns="http://www.liquibase.org/xml/ns/dbchangelog"
|
||||||
|
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||||
|
xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.8.xsd">
|
||||||
|
|
||||||
|
<property name="now" value="UNIX_TIMESTAMP()" dbms="mysql"/>
|
||||||
|
<property name="now" value="sysdate" dbms="oracle"/>
|
||||||
|
<property name="now" value="now()" dbms="postgresql"/>
|
||||||
|
|
||||||
|
<changeSet id="1.1-1-mmad" author="mmad">
|
||||||
|
<insert schemaName="test" tableName="person">
|
||||||
|
<column name="id" value="1"/>
|
||||||
|
<column name="first_name" value="mohammad"/>
|
||||||
|
<column name="last_name" value="Reza"/>
|
||||||
|
</insert>
|
||||||
|
</changeSet>
|
||||||
|
|
||||||
|
<changeSet id="1.1-2-sequence" author="mmad">
|
||||||
|
<createSequence sequenceName="USER_SEQ" startValue="1" incrementBy="1"/>
|
||||||
|
</changeSet>
|
||||||
|
</databaseChangeLog>
|
39
src/main/resources/db/changelog/changes/oracleLiquibases/liquibase-1.2.xml
Executable file
39
src/main/resources/db/changelog/changes/oracleLiquibases/liquibase-1.2.xml
Executable file
@ -0,0 +1,39 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<databaseChangeLog
|
||||||
|
xmlns="http://www.liquibase.org/xml/ns/dbchangelog"
|
||||||
|
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||||
|
xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog
|
||||||
|
http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.8.xsd">
|
||||||
|
|
||||||
|
<!-- Set correct time function for Oracle -->
|
||||||
|
<property name="now" value="SYSDATE" dbms="oracle"/>
|
||||||
|
|
||||||
|
<changeSet id="1.2-1-mmad" author="mmad">
|
||||||
|
<createTable schemaName="test" tableName="PERSON" remarks="اشخاص">
|
||||||
|
<column name="ID" type="NUMBER(19)" remarks="شناسه اشخاص">
|
||||||
|
<constraints nullable="false" primaryKey="true" primaryKeyName="PK_PERSON_ID"/>
|
||||||
|
</column>
|
||||||
|
<column name="FIRST_NAME" type="VARCHAR2(255)" remarks="نام"/>
|
||||||
|
<column name="LAST_NAME" type="VARCHAR2(255)" remarks="نام خانوادگی"/>
|
||||||
|
</createTable>
|
||||||
|
</changeSet>
|
||||||
|
<changeSet id="1.2-2-mrmad" author="mmad">
|
||||||
|
<createTable schemaName="test" tableName="USERS" remarks="کاربر">
|
||||||
|
<column name="ID" type="NUMBER(19)" remarks="شناسه کاربر">
|
||||||
|
<constraints nullable="false" primaryKey="true" primaryKeyName="PK_USER_ID"/>
|
||||||
|
</column>
|
||||||
|
<column name="user_name" type="VARCHAR2(255)" remarks="نام کاربری"/>
|
||||||
|
<column name="email" type="VARCHAR2(255)" remarks="ایمیل"/>
|
||||||
|
</createTable>
|
||||||
|
</changeSet>
|
||||||
|
<changeSet id="1.2-3-mrmad" author="mmad">
|
||||||
|
<createTable schemaName="test" tableName="USERS_QUERY" remarks="کاربر">
|
||||||
|
<column name="ID" type="NUMBER(19)" remarks="شناسه کاربر">
|
||||||
|
<constraints nullable="false" primaryKey="true" primaryKeyName="PK_USER_QUERY_ID"/>
|
||||||
|
</column>
|
||||||
|
<column name="user_name" type="VARCHAR2(255)" remarks="نام کاربری"/>
|
||||||
|
<column name="email" type="VARCHAR2(255)" remarks="ایمیل"/>
|
||||||
|
</createTable>
|
||||||
|
</changeSet>
|
||||||
|
|
||||||
|
</databaseChangeLog>
|
@ -4,7 +4,7 @@
|
|||||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||||
xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.8.xsd">
|
xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.8.xsd">
|
||||||
|
|
||||||
<include file="changes/liquibase-1.2.xml" relativeToChangelogFile="true"/>
|
<include file="changes/oracleLiquibases/liquibase-1.2.xml" relativeToChangelogFile="true"/>
|
||||||
<include file="changes/liquibase-1.1.xml" relativeToChangelogFile="true"/>
|
<include file="changes/oracleLiquibases/liquibase-1.1.xml" relativeToChangelogFile="true"/>
|
||||||
|
|
||||||
</databaseChangeLog>
|
</databaseChangeLog>
|
||||||
|
Reference in New Issue
Block a user