Commit 3b20c477 张少辉

数据库双写

1 个父辈 f123188e
package com.neotel.smfcore.common.base; package com.neotel.smfcore.common.base;
import com.neotel.smfcore.core.config.mongodb.MongoDbConfig;
import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger; import org.apache.logging.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.data.domain.Pageable; import org.springframework.data.domain.Pageable;
import org.springframework.data.mongodb.core.FindAndModifyOptions; import org.springframework.data.mongodb.core.FindAndModifyOptions;
import org.springframework.data.mongodb.core.MongoTemplate; import org.springframework.data.mongodb.core.MongoTemplate;
...@@ -19,8 +21,15 @@ import java.util.regex.Pattern; ...@@ -19,8 +21,15 @@ import java.util.regex.Pattern;
* Created by kangmor on 2015/9/14. * Created by kangmor on 2015/9/14.
*/ */
public abstract class AbstractBaseDao implements IBaseDao { public abstract class AbstractBaseDao implements IBaseDao {
@Autowired @Autowired
@Qualifier("masterMongoTemplate")
private MongoTemplate mongoTemplate; private MongoTemplate mongoTemplate;
@Autowired
@Qualifier("backUpMongoTemplate")
private MongoTemplate backUpMongoTemplate;
private final static int DEFAULT_PAGE_SIZE = 10; private final static int DEFAULT_PAGE_SIZE = 10;
protected final transient Logger log = LogManager.getLogger(getClass()); protected final transient Logger log = LogManager.getLogger(getClass());
...@@ -34,6 +43,13 @@ public abstract class AbstractBaseDao implements IBaseDao { ...@@ -34,6 +43,13 @@ public abstract class AbstractBaseDao implements IBaseDao {
bean.setUpdateDate(new Date(System.currentTimeMillis())); bean.setUpdateDate(new Date(System.currentTimeMillis()));
getMongoTemplate().save(bean); getMongoTemplate().save(bean);
log.debug("Bean " + getEntityClass() + " is saved with id " + bean.getId()); log.debug("Bean " + getEntityClass() + " is saved with id " + bean.getId());
try {
if (getBackUpMongoTemplate() != null) {
getBackUpMongoTemplate().save(bean);
}
} catch (Exception e) {
log.error("{}备份库操作失败:{}", "save", e.getMessage());
}
return bean; return bean;
} }
...@@ -46,6 +62,13 @@ public abstract class AbstractBaseDao implements IBaseDao { ...@@ -46,6 +62,13 @@ public abstract class AbstractBaseDao implements IBaseDao {
t.setUpdateDate(new Date(System.currentTimeMillis())); t.setUpdateDate(new Date(System.currentTimeMillis()));
} }
getMongoTemplate().insertAll(beanList); getMongoTemplate().insertAll(beanList);
try {
if (getBackUpMongoTemplate() != null) {
getBackUpMongoTemplate().insertAll(beanList);
}
} catch (Exception e) {
log.error("{}备份库操作失败:{}", "insertAll", e.getMessage());
}
} }
return beanList; return beanList;
} }
...@@ -104,11 +127,25 @@ public abstract class AbstractBaseDao implements IBaseDao { ...@@ -104,11 +127,25 @@ public abstract class AbstractBaseDao implements IBaseDao {
@Override @Override
public void updateMulti(Query query, Update update){ public void updateMulti(Query query, Update update){
getMongoTemplate().updateMulti(query,update,getEntityClass()); getMongoTemplate().updateMulti(query,update,getEntityClass());
try {
if (getBackUpMongoTemplate() != null) {
getBackUpMongoTemplate().updateMulti(query, update, getEntityClass());
}
} catch (Exception e) {
log.error("{}备份库操作失败:{}", "updateMulti", e.getMessage());
}
} }
@Override @Override
public void updateFirst(Query query, Update update){ public void updateFirst(Query query, Update update){
getMongoTemplate().updateFirst(query,update, getEntityClass()); getMongoTemplate().updateFirst(query,update, getEntityClass());
try {
if (getBackUpMongoTemplate() != null) {
getBackUpMongoTemplate().updateFirst(query,update, getEntityClass());
}
} catch (Exception e) {
log.error("{}备份库操作失败:{}", "updateFirst", e.getMessage());
}
} }
@Override @Override
...@@ -156,6 +193,13 @@ public abstract class AbstractBaseDao implements IBaseDao { ...@@ -156,6 +193,13 @@ public abstract class AbstractBaseDao implements IBaseDao {
T t = findOneById(id); T t = findOneById(id);
if (t != null) { if (t != null) {
getMongoTemplate().remove(t); getMongoTemplate().remove(t);
try {
if (getBackUpMongoTemplate() != null) {
getBackUpMongoTemplate().remove(t);
}
} catch (Exception e) {
log.error("{}备份库操作失败:{}", "removeOneById", e.getMessage());
}
} }
} }
...@@ -163,6 +207,13 @@ public abstract class AbstractBaseDao implements IBaseDao { ...@@ -163,6 +207,13 @@ public abstract class AbstractBaseDao implements IBaseDao {
public<T extends BasePo> void removeOne(Object bean) { public<T extends BasePo> void removeOne(Object bean) {
if (bean != null) { if (bean != null) {
getMongoTemplate().remove(bean); getMongoTemplate().remove(bean);
try {
if (getBackUpMongoTemplate() != null) {
getBackUpMongoTemplate().remove(bean);
}
} catch (Exception e) {
log.error("{}备份库操作失败:{}", "removeOne", e.getMessage());
}
} }
} }
...@@ -177,6 +228,13 @@ public abstract class AbstractBaseDao implements IBaseDao { ...@@ -177,6 +228,13 @@ public abstract class AbstractBaseDao implements IBaseDao {
if (list != null && list.size() > 0) { if (list != null && list.size() > 0) {
for (T t : list) { for (T t : list) {
getMongoTemplate().remove(t); getMongoTemplate().remove(t);
try {
if (getBackUpMongoTemplate() != null) {
getBackUpMongoTemplate().remove(t);
}
} catch (Exception e) {
log.error("{}备份库操作失败:{}", "removeByQuery", e.getMessage());
}
} }
} }
} }
...@@ -187,6 +245,13 @@ public abstract class AbstractBaseDao implements IBaseDao { ...@@ -187,6 +245,13 @@ public abstract class AbstractBaseDao implements IBaseDao {
if(list != null && list.size() > 0){ if(list != null && list.size() > 0){
for(T t : list){ for(T t : list){
getMongoTemplate().remove(t); getMongoTemplate().remove(t);
try {
if (getBackUpMongoTemplate() != null) {
getBackUpMongoTemplate().remove(t);
}
} catch (Exception e) {
log.error("{}备份库操作失败:{}", "removeAll", e.getMessage());
}
} }
} }
} }
...@@ -220,6 +285,13 @@ public abstract class AbstractBaseDao implements IBaseDao { ...@@ -220,6 +285,13 @@ public abstract class AbstractBaseDao implements IBaseDao {
} }
} }
try {
if (getBackUpMongoTemplate() != null) {
getBackUpMongoTemplate().save(sequence);
}
} catch (Exception e) {
log.error("{}备份库操作失败:{}", "getNextId", e.getMessage());
}
return sequence.getSeq().toString(); return sequence.getSeq().toString();
} }
...@@ -230,6 +302,18 @@ public abstract class AbstractBaseDao implements IBaseDao { ...@@ -230,6 +302,18 @@ public abstract class AbstractBaseDao implements IBaseDao {
return mongoTemplate; return mongoTemplate;
} }
/**
* 如果没有配置数据源,则返回为空
* @return
*/
public MongoTemplate getBackUpMongoTemplate() {
String databaseName = backUpMongoTemplate.getDb().getName();
if (MongoDbConfig.getNoDatabase().equals(databaseName)) {
return null;
}
return backUpMongoTemplate;
}
public void setMongoTemplate(MongoTemplate mongoTemplate) { public void setMongoTemplate(MongoTemplate mongoTemplate) {
this.mongoTemplate = mongoTemplate; this.mongoTemplate = mongoTemplate;
} }
......
package com.neotel.smfcore.core.config.mongodb;
import com.mongodb.MongoClientSettings;
import com.mongodb.MongoCredential;
import com.mongodb.ServerAddress;
import com.mongodb.client.MongoClient;
import com.mongodb.client.MongoClients;
import com.mongodb.connection.ClusterConnectionMode;
import com.mongodb.connection.ClusterType;
import com.neotel.smfcore.common.utils.StringUtils;
import com.neotel.smfcore.core.config.mongodb.bean.CustomMongoProperties;
import org.springframework.beans.factory.annotation.Qualifier;
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 org.springframework.data.mongodb.MongoDatabaseFactory;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.SimpleMongoClientDatabaseFactory;
import java.util.ArrayList;
import java.util.List;
@Configuration
public class MongoDbConfig {
private static final String NO_HOST = "none";
private static final Integer NO_PORT = 0;
private static final String NO_DATABASE = "noConfigDatabase";
@Primary
@Bean("masterMongoProperties")
@ConfigurationProperties(prefix = "spring.data.mongodb")
protected CustomMongoProperties masterMongoProperties() {
return new CustomMongoProperties();
}
@Bean("backUpMongoProperties")
@ConfigurationProperties(prefix = "spring.data.backup-mongodb")
protected CustomMongoProperties backUpMongoProperties() {
return new CustomMongoProperties();
}
@Primary
@Bean(name = "masterMongoTemplate")
public MongoTemplate masterMongoTemplate(@Qualifier("masterMongoProperties") CustomMongoProperties mongoProperties) {
return new MongoTemplate(mongoDbFactory(mongoProperties));
}
@Bean(name = "backUpMongoTemplate")
public MongoTemplate backUpMongoTemplate(@Qualifier("backUpMongoProperties") CustomMongoProperties mongoProperties) {
//如果没有配置的话,则模板返回为空
if (StringUtils.isBlank(mongoProperties.getHost())) {
mongoProperties.setHost(NO_HOST);
mongoProperties.setPort(NO_PORT);
mongoProperties.setDatabase(NO_DATABASE);
}
return new MongoTemplate(mongoDbFactory(mongoProperties));
}
private MongoDatabaseFactory mongoDbFactory(CustomMongoProperties mongoProperties) {
ClusterConnectionMode clusterConnectionMode;
ClusterType clusterType;
List<ServerAddress> serverAddressList = new ArrayList<>();
clusterConnectionMode = ClusterConnectionMode.SINGLE;
clusterType = ClusterType.STANDALONE;
ServerAddress serverAddress = new ServerAddress(mongoProperties.getHost(), mongoProperties.getPort());
serverAddressList.add(serverAddress);
MongoClientSettings.Builder settingBuilder = MongoClientSettings.builder()
.applyToClusterSettings(builder ->
builder.hosts(serverAddressList)
.mode(clusterConnectionMode)
.requiredClusterType(clusterType)
).applyToConnectionPoolSettings(builder ->
builder.maxSize(mongoProperties.getMaxConSize())
.minSize(mongoProperties.getMinConsize())
);
if (StringUtils.isNotEmpty(mongoProperties.getUsername()) && StringUtils.isNotEmpty(mongoProperties.getPassword())){
MongoCredential credential = MongoCredential.createCredential(mongoProperties.getUsername(), mongoProperties.getDatabase(), mongoProperties.getPassword().toCharArray());
settingBuilder.credential(credential);
}
MongoClientSettings setting = settingBuilder.build();
MongoClient mongoClient = MongoClients.create(setting);
return new SimpleMongoClientDatabaseFactory(mongoClient, mongoProperties.getDatabase());
}
public static String getNoDatabase() {
return NO_DATABASE;
}
}
package com.neotel.smfcore.core.config.mongodb.bean;
import lombok.Getter;
import lombok.Setter;
@Getter
@Setter
public class CustomMongoProperties {
private String host;
private Integer port;
private String database;
private String username;
private String password;
private Integer maxConSize = 100;
private Integer minConsize = 50;
}
...@@ -2,7 +2,6 @@ package com.neotel.smfcore.core.kanban.rest; ...@@ -2,7 +2,6 @@ package com.neotel.smfcore.core.kanban.rest;
import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.ObjectUtil;
import com.google.common.base.Strings; import com.google.common.base.Strings;
import com.google.common.collect.Lists;
import com.neotel.smfcore.common.bean.PageData; import com.neotel.smfcore.common.bean.PageData;
import com.neotel.smfcore.common.bean.ResultBean; import com.neotel.smfcore.common.bean.ResultBean;
import com.neotel.smfcore.common.exception.ValidateException; import com.neotel.smfcore.common.exception.ValidateException;
...@@ -25,19 +24,15 @@ import com.neotel.smfcore.core.storage.service.po.Storage; ...@@ -25,19 +24,15 @@ import com.neotel.smfcore.core.storage.service.po.Storage;
import com.neotel.smfcore.core.storage.service.po.StoragePos; import com.neotel.smfcore.core.storage.service.po.StoragePos;
import com.neotel.smfcore.core.system.service.manager.impl.DataLogManagerImpl; import com.neotel.smfcore.core.system.service.manager.impl.DataLogManagerImpl;
import com.neotel.smfcore.core.system.service.po.DataLog; import com.neotel.smfcore.core.system.service.po.DataLog;
import com.neotel.smfcore.core.system.service.po.Humiture;
import com.neotel.smfcore.core.system.util.DevicesStatusUtil; import com.neotel.smfcore.core.system.util.DevicesStatusUtil;
import com.neotel.smfcore.core.system.util.TaskService; import com.neotel.smfcore.core.system.util.TaskService;
import com.neotel.smfcore.security.annotation.AnonymousPutMapping; import com.neotel.smfcore.security.annotation.AnonymousPutMapping;
import com.neotel.smfcore.security.service.manager.IGroupManager; import com.neotel.smfcore.security.service.manager.IGroupManager;
import com.neotel.smfcore.security.service.manager.impl.GroupManagerImpl;
import com.neotel.smfcore.security.service.manager.impl.UserManagerImpl; import com.neotel.smfcore.security.service.manager.impl.UserManagerImpl;
import com.neotel.smfcore.security.service.po.Group; import com.neotel.smfcore.security.service.po.Group;
import com.neotel.smfcore.security.service.po.User; import com.neotel.smfcore.security.service.po.User;
import io.swagger.annotations.Api; import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiOperation;
import javafx.concurrent.Task;
import lombok.Data;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
...@@ -45,7 +40,6 @@ import org.springframework.data.domain.Pageable; ...@@ -45,7 +40,6 @@ import org.springframework.data.domain.Pageable;
import org.springframework.data.mongodb.core.query.Criteria; import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query; import org.springframework.data.mongodb.core.query.Query;
import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.util.ObjectUtils;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequest;
......
...@@ -11,10 +11,18 @@ login: ...@@ -11,10 +11,18 @@ login:
spring: spring:
data: data:
mongodb: mongodb:
#host: 127.0.0.1
host: 10.68.27.88 # 主机地址 host: 10.68.27.88 # 主机地址
port: 27017 # 端口 port: 27017 # 端口
database: sp_smf #备件仓数据库 database: sp_smf #备件仓数据库
username: neotel
password: neotel
backup-mongodb:
host: 10.68.27.128 # 主机地址
port: 27017 # 端口
database: sp_smf # 数据库
username: neotel
password: neotel
#kafka配置 #kafka配置
# kafka: # kafka:
......
支持 Markdown 格式
你添加了 0 到此讨论。请谨慎行事。
Finish editing this message first!