记得上下班打卡 | git大法好,push需谨慎

Commit bec22bda authored by 张国柄's avatar 张国柄

fix adam sql to mq;

parent e9802ac9
...@@ -35,6 +35,10 @@ ...@@ -35,6 +35,10 @@
<groupId>com.fasterxml.jackson.datatype</groupId> <groupId>com.fasterxml.jackson.datatype</groupId>
<artifactId>jackson-datatype-jsr310</artifactId> <artifactId>jackson-datatype-jsr310</artifactId>
</dependency> </dependency>
<dependency>
<groupId>org.mongodb</groupId>
<artifactId>bson</artifactId>
</dependency>
</dependencies> </dependencies>
......
package com.liquidnet.commons.lang.util;
import org.bson.Document;
import org.bson.json.Converter;
import org.bson.json.JsonWriterSettings;
import org.bson.json.StrictJsonWriter;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.TimeZone;
public class BsonUtil {
private static final JsonWriterSettings build = JsonWriterSettings.builder().dateTimeConverter(new Converter<Long>() {
@Override
public void convert(Long aLong, StrictJsonWriter strictJsonWriter) {
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'");
dateFormat.setTimeZone(TimeZone.getTimeZone("UTC"));
if (aLong >= -59014396800000L && aLong <= 253399536000000L) {
strictJsonWriter.writeRaw(String.format("\"%s\"", dateFormat.format(new Date(aLong))));
} else {
strictJsonWriter.writeRaw(String.format("new Date(%d)", aLong));
}
}
}).build();
public static <T> T toBean(Document document, Class<T> clzss){
return JsonUtils.fromJson(document.toJson(build), clzss);
}
}
package com.liquidnet.commons.lang.util;
import org.apache.logging.log4j.util.PropertiesUtil;
import org.springframework.core.io.support.PropertiesLoaderUtils;
import java.io.File;
import java.io.IOException;
import java.net.URL;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.Map;
import java.util.Properties;
public class SqlMapping {
private static final String sqlMapDir = "sqlmap";
private static Map<String, Object> sqlPropertiesMap = new HashMap<>();
static {
try {
URL url = PropertiesUtil.class.getClassLoader().getResource(sqlMapDir);
if (null != url) {
File file = new File(url.getFile());
if (file.exists() && file.isDirectory()) {
File[] files = file.listFiles();
for (File f : files) {
if (f.isFile() && f.getName().endsWith("properties")) {
Properties props = PropertiesLoaderUtils.loadAllProperties(sqlMapDir.concat("/") + f.getName());
for (Object key : props.keySet()) {
String keyStr = key.toString();
String value = props.getProperty(keyStr);
sqlPropertiesMap.put(keyStr, value);
}
}
}
}
}
System.out.printf("sqlPropertiesMap init count: %s\n", sqlPropertiesMap.size());
} catch (IOException e) {
e.printStackTrace();
}
}
public static Object get(String sql) {
return sqlPropertiesMap.get(sql);
}
public static String get(String sql, Object... params) {
LinkedList<String> sqls = new LinkedList<>();
sqls.add(sqlPropertiesMap.get(sql).toString());
LinkedList<Object[]> paramsList = new LinkedList<>();
paramsList.add(params);
LinkedList<Object[]>[] args = new LinkedList[]{paramsList};
SqlMessage sqlMessage = SqlMessage.getInstance();
sqlMessage.setExecType(1);
sqlMessage.setSqls(sqls);
sqlMessage.setArgs(args);
return JsonUtils.toJson(sqlMessage);
}
public static String get(String sql, LinkedList<Object[]> paramsList) {
LinkedList<String> sqls = new LinkedList<>();
sqls.add(sqlPropertiesMap.get(sql).toString());
LinkedList<Object[]>[] args = new LinkedList[]{paramsList};
SqlMessage sqlMessage = SqlMessage.getInstance();
sqlMessage.setExecType(2);
sqlMessage.setSqls(sqls);
sqlMessage.setArgs(args);
return JsonUtils.toJson(sqlMessage);
}
public static String get(LinkedList<String> sqls, LinkedList<Object[]> paramsList) {
LinkedList<Object[]>[] args = new LinkedList[]{paramsList};
SqlMessage sqlMessage = SqlMessage.getInstance();
sqlMessage.setExecType(3);
sqlMessage.setSqls(sqls);
sqlMessage.setArgs(args);
return JsonUtils.toJson(sqlMessage);
}
}
package com.liquidnet.commons.lang.util;
import java.io.Serializable;
import java.util.LinkedList;
public class SqlMessage implements Cloneable, Serializable {
private static final long serialVersionUID = 2208924091512163151L;
private int execType;
private LinkedList<String> sqls;
private LinkedList<Object[]>[] args;
public SqlMessage() {
}
public SqlMessage(String json) {
SqlMessage sqlMessage = JsonUtils.fromJson(json, SqlMessage.class);
this.sqls = sqlMessage.getSqls();
this.args = sqlMessage.getArgs();
}
public int getExecType() {
return execType;
}
public void setExecType(int execType) {
this.execType = execType;
}
public LinkedList<String> getSqls() {
return sqls;
}
public void setSqls(LinkedList<String> sqls) {
this.sqls = sqls;
}
public LinkedList<Object[]>[] getArgs() {
return args;
}
public void setArgs(LinkedList<Object[]>[] args) {
this.args = args;
}
private final static SqlMessage instance = new SqlMessage();
public static SqlMessage getInstance() {
try {
return (SqlMessage) instance.clone();
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
return new SqlMessage();
}
}
\ No newline at end of file
...@@ -18,5 +18,13 @@ ...@@ -18,5 +18,13 @@
<groupId>org.apache.httpcomponents</groupId> <groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId> <artifactId>httpclient</artifactId>
</dependency> </dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.datatype</groupId>
<artifactId>jackson-datatype-jsr310</artifactId>
</dependency>
</dependencies> </dependencies>
</project> </project>
...@@ -11,9 +11,9 @@ import org.springframework.stereotype.Component; ...@@ -11,9 +11,9 @@ import org.springframework.stereotype.Component;
* @packname com.liquidnet.service.config.mq * @packname com.liquidnet.service.config.mq
*/ */
@Data //@Data
@ConfigurationProperties(prefix = MQProperties.MQCONFIG_PREFIX) //@ConfigurationProperties(prefix = MQProperties.MQCONFIG_PREFIX)
@Component //@Component
public class MQProperties { public class MQProperties {
public static final String MQCONFIG_PREFIX = "mq.config"; public static final String MQCONFIG_PREFIX = "mq.config";
......
package com.liquidnet.common.mq.constant;
public class MQConst {
public static final String EXCHANGES_LIQUIDNET_SQL = "liquidnet.sql";
public static final String ROUTING_KEY_SQL = "sql";
public static final String QUEUES_SQL_MAIN = "queue.sql.main";
}
liquidnet:
system:
updating:
switch: false
info:
port: 9999
context:
# context: /service-consumer
name: liquidnet-service-consumer
logfile:
path: ./logs
name: service-consumer
config: classpath:logback-spring.xml
file-max-size: 200MB
pattern-file: '%d{yyyy-MM-dd HH:mm:ss.SSS} [ %-5level] %thread [%logger{96}:%line] - %msg%n'
pattern-console: '%d{yyyy-MM-dd HH:mm:ss.SSS} [ %-5level] %thread [%logger{96}:%line] - %msg%n'
pattern-rolling-file-name: ${liquidnet.logfile.path}/${liquidnet.logfile.name}-%d{yyyy-MM-dd}.%i.log
level-root: info
mysql:
database-name: ln_adam
#以下为spring各环境个性配置
\ No newline at end of file
server:
port: ${liquidnet.info.port}
tomcat:
uri-encoding: UTF-8
servlet:
context-path: ${liquidnet.info.context}
# -----------------------------------------------------------
knife4j:
production: ${liquidnet.knife4j.disable}
basic:
enable: true
username: ${liquidnet.security.username}
password: ${liquidnet.security.password}
# -----------------------------------------------------------
logging:
# config: ${liquidnet.logfile.config}
file:
name: ${liquidnet.logfile.path}/${liquidnet.logfile.name}.log
max-size: 200MB
pattern:
file: '%d{yyyy-MM-dd HH:mm:ss.SSS} [ %-5level] %thread [%logger{96}:%line] - %msg%n'
console: '%d{yyyy-MM-dd HH:mm:ss.SSS} [ %-5level] %thread [%logger{96}:%line] - %msg%n'
rolling-file-name: ${liquidnet.logfile.path}/${liquidnet.logfile.name}-%d{yyyy-MM-dd}.%i.log
level:
root: info
#以下是为指定包设置日志级别
com:
liquidnet: info
# -----------------------------------------------------------
eureka:
# client:
# register-with-eureka: true
# fetch-registry: true
# serviceUrl:
# defaultZone: http://${liquidnet.security.username}:${liquidnet.security.password}@${liquidnet.eureka.host}/eureka-server/eureka
instance:
hostname: ${spring.cloud.client.ip-address}
lease-expiration-duration-in-seconds: 15 #服务过期时间配置,超过这个时间没有接收到心跳EurekaServer就会将这个实例剔除
lease-renewal-interval-in-seconds: 5 #服务刷新时间配置,每隔这个时间会主动心跳一次
prefer-ip-address: true
instance-id: ${spring.application.name}:${spring.cloud.client.ip-address}:${spring.application.instance_id:${server.port}}
# -----------------------------------------------------------
#actuator/info
info:
app:
name: ${liquidnet.info.name}
company:
name: lightnet.io
build:
groupId: '@project.groupId@'
artifactId: '@project.artifactId@'
version: '@project.version@'
# -----------------------------------------------------------
spring:
application:
name: ${liquidnet.info.name}
profiles:
include: common-service #这里加载management相关公共配置
rabbitmq:
addresses: ${liquidnet.rabbitmq.host}
port: ${liquidnet.rabbitmq.port}
username: ${liquidnet.rabbitmq.username}
password: ${liquidnet.rabbitmq.password}
datasource:
name: ${liquidnet.mysql.database-name}
url: jdbc:mysql://${liquidnet.mysql.urlHostAndPort}/${liquidnet.mysql.database-name}?serverTimezone=UTC&characterEncoding=utf-8&useSSL=false
username: ${liquidnet.mysql.username}
password: ${liquidnet.mysql.password}
# type: org.apache.tomcat.jdbc.pool.DataSource
driver-class-name: com.mysql.cj.jdbc.Driver
filters: stat
maxActive: 20
initialSize: 1
maxWait: 60000
minIdle: 1
timeBetweenEvictionRunsMillis: 60000
minEvictableIdleTimeMillis: 300000
validationQuery: select 'x'
testWhileIdle: true
testOnBorrow: false
testOnReturn: false
poolPreparedStatements: true
maxOpenPreparedStatements: 20
# -----------------------------------------------------------
# -----------------------------------------------------------
...@@ -9,15 +9,17 @@ import lombok.Data; ...@@ -9,15 +9,17 @@ import lombok.Data;
@Data @Data
public class AdamEntersVo implements java.io.Serializable, Cloneable { public class AdamEntersVo implements java.io.Serializable, Cloneable {
private static final long serialVersionUID = 5258094625450569125L; private static final long serialVersionUID = 5258094625450569125L;
@ApiModelProperty(position = 10, value = "入场人名称[50]") @ApiModelProperty(position = 10, value = "入场人ID[64]")
private String entersId;
@ApiModelProperty(position = 11, value = "入场人名称[50]")
private String name; private String name;
@ApiModelProperty(position = 11, value = "入场人手机号[11]") @ApiModelProperty(position = 12, value = "入场人手机号[11]")
private String mobile; private String mobile;
@ApiModelProperty(position = 12, value = "证件类型:1-大陆身份证,2-港澳通行证,3-台胞证,4-护照,5-军官证") @ApiModelProperty(position = 13, value = "证件类型:1-大陆身份证,2-港澳通行证,3-台胞证,4-护照,5-军官证")
private Integer type; private Integer type;
@ApiModelProperty(position = 13, value = "入场人证件号[11]") @ApiModelProperty(position = 14, value = "入场人证件号[11]")
private String idCard; private String idCard;
@ApiModelProperty(position = 14, value = "是否是默认入场人:0-否,1-是") @ApiModelProperty(position = 15, value = "是否是默认入场人:0-否,1-是")
private Boolean isDefault; private Boolean isDefault;
private static final AdamEntersVo obj = new AdamEntersVo(); private static final AdamEntersVo obj = new AdamEntersVo();
...@@ -32,6 +34,7 @@ public class AdamEntersVo implements java.io.Serializable, Cloneable { ...@@ -32,6 +34,7 @@ public class AdamEntersVo implements java.io.Serializable, Cloneable {
} }
public AdamEntersVo copy(AdamEnters source) { public AdamEntersVo copy(AdamEnters source) {
this.setEntersId(source.getEntersId());
this.setName(source.getName()); this.setName(source.getName());
this.setIdCard(source.getIdCard()); this.setIdCard(source.getIdCard());
this.setMobile(source.getMobile()); this.setMobile(source.getMobile());
......
...@@ -26,8 +26,9 @@ ...@@ -26,8 +26,9 @@
<version>1.0-SNAPSHOT</version> <version>1.0-SNAPSHOT</version>
</dependency> </dependency>
<dependency> <dependency>
<groupId>org.springframework.boot</groupId> <groupId>com.liquidnet</groupId>
<artifactId>spring-boot-starter-data-mongodb</artifactId> <artifactId>liquidnet-common-mq</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency> </dependency>
<dependency> <dependency>
...@@ -37,6 +38,10 @@ ...@@ -37,6 +38,10 @@
<scope>compile</scope> <scope>compile</scope>
</dependency> </dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-mongodb</artifactId>
</dependency>
</dependencies> </dependencies>
<build> <build>
......
package com.liquidnet.service.adam.config; package com.liquidnet.service.adam.config;
import com.liquidnet.common.swagger.config.Swagger2Config; import com.liquidnet.common.swagger.config.Swagger2Config;
import com.liquidnet.common.swagger.config.SwaggerApiVersion;
import com.liquidnet.service.adam.config.swagger.AdamSwaggerApiVersionConstant;
import io.swagger.annotations.Api;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Configuration;
import springfox.documentation.builders.ParameterBuilder;
import springfox.documentation.builders.PathSelectors;
import springfox.documentation.builders.RequestHandlerSelectors;
import springfox.documentation.schema.ModelRef;
import springfox.documentation.service.Parameter;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
/** /**
* @author AnJiabin <jiabin.an@lightnet.io> * @author AnJiabin <jiabin.an@lightnet.io>
...@@ -30,145 +15,4 @@ import java.util.List; ...@@ -30,145 +15,4 @@ import java.util.List;
@Configuration @Configuration
class AdamSwagger2Config extends Swagger2Config { class AdamSwagger2Config extends Swagger2Config {
@Override
public Docket createRestApi() {
return new Docket(DocumentationType.SWAGGER_2)
.apiInfo(this.apiInfo())
.forCodeGeneration(true).select()
.apis(RequestHandlerSelectors.withClassAnnotation(Api.class))
.paths(PathSelectors.any())
.build();
// return new Docket(DocumentationType.SWAGGER_2)
// .apiInfo(this.apiInfo())
// .groupName(AdamSwaggerApiVersionConstant.WEB_1_1)
// .select()
// .apis(input -> {
// SwaggerApiVersion apiVersion = input.getHandlerMethod().getMethodAnnotation(SwaggerApiVersion.class);
// return apiVersion != null && Arrays.asList(apiVersion.group()).contains(AdamSwaggerApiVersionConstant.WEB_1_1);
// })
// .paths(PathSelectors.any())
// .build();
}
@Bean
public Docket api_admin() {
return new Docket(DocumentationType.SWAGGER_2)
.apiInfo(this.apiInfo())
.groupName(AdamSwaggerApiVersionConstant.ADMIN)
.select()
.apis(input -> {
SwaggerApiVersion apiVersion = input.getHandlerMethod().getMethodAnnotation(SwaggerApiVersion.class);
return apiVersion != null && Arrays.asList(apiVersion.group()).contains(AdamSwaggerApiVersionConstant.ADMIN);
})
.paths(PathSelectors.any())
.build();
}
@Bean
public Docket api_feign() {
return new Docket(DocumentationType.SWAGGER_2)
.apiInfo(this.apiInfo())
.groupName(AdamSwaggerApiVersionConstant.FEIGN)
.select()
.apis(input -> {
SwaggerApiVersion apiVersion = input.getHandlerMethod().getMethodAnnotation(SwaggerApiVersion.class);
return apiVersion != null && Arrays.asList(apiVersion.group()).contains(AdamSwaggerApiVersionConstant.FEIGN);
})
.paths(PathSelectors.any())
.build();
}
@Bean
public Docket api_task() {
return new Docket(DocumentationType.SWAGGER_2)
.apiInfo(this.apiInfo())
.groupName(AdamSwaggerApiVersionConstant.TASK)
.select()
.apis(input -> {
SwaggerApiVersion apiVersion = input.getHandlerMethod().getMethodAnnotation(SwaggerApiVersion.class);
return apiVersion != null && Arrays.asList(apiVersion.group()).contains(AdamSwaggerApiVersionConstant.TASK);
})
.paths(PathSelectors.any())
.build();
}
@Bean
public Docket web_sys() {
return new Docket(DocumentationType.SWAGGER_2)
.apiInfo(this.apiInfo())
.groupName(AdamSwaggerApiVersionConstant.WEB_SYS)
.select()
.apis(input -> {
SwaggerApiVersion apiVersion = input.getHandlerMethod().getMethodAnnotation(SwaggerApiVersion.class);
return apiVersion != null && Arrays.asList(apiVersion.group()).contains(AdamSwaggerApiVersionConstant.WEB_SYS);
})
.paths(PathSelectors.any())
.build();
}
@Bean
public Docket web_1_0() {
return new Docket(DocumentationType.SWAGGER_2)
.apiInfo(this.apiInfo())
// .globalOperationParameters(headParamDefault())
.groupName(AdamSwaggerApiVersionConstant.WEB_1_0)
.select()
.apis(input -> {
SwaggerApiVersion apiVersion = input.getHandlerMethod().getMethodAnnotation(SwaggerApiVersion.class);
return apiVersion != null && Arrays.asList(apiVersion.group()).contains(AdamSwaggerApiVersionConstant.WEB_1_0);
})
.paths(PathSelectors.any())
.build();
}
@Bean
public Docket web_1_1() {
return new Docket(DocumentationType.SWAGGER_2)
.apiInfo(this.apiInfo())
// .globalOperationParameters(headParamDefault())
.groupName(AdamSwaggerApiVersionConstant.WEB_1_1)
.select()
.apis(input -> {
SwaggerApiVersion apiVersion = input.getHandlerMethod().getMethodAnnotation(SwaggerApiVersion.class);
return apiVersion != null && Arrays.asList(apiVersion.group()).contains(AdamSwaggerApiVersionConstant.WEB_1_1);
})
.paths(PathSelectors.any())
.build();
}
@Bean
public Docket web_1_2() {
return new Docket(DocumentationType.SWAGGER_2)
.apiInfo(this.apiInfo())
// .globalOperationParameters(headParamDefault())
.groupName(AdamSwaggerApiVersionConstant.WEB_1_2)
.select()
.apis(input -> {
SwaggerApiVersion apiVersion = input.getHandlerMethod().getMethodAnnotation(SwaggerApiVersion.class);
return apiVersion != null && Arrays.asList(apiVersion.group()).contains(AdamSwaggerApiVersionConstant.WEB_1_2);
})
.paths(PathSelectors.any())
.build();
}
/**
* 设置默认请求头部 参数
* sid
*/
private List<Parameter> headParamDefault() {
List<Parameter> pars = new ArrayList<>();
// ParameterBuilder ticketPar = new ParameterBuilder();
// ticketPar.name("token").description("user token")
// .modelRef(new ModelRef("string")).parameterType("header")
// .required(true).build(); //header中的ticket参数非必填,传空也可以
// pars.add(ticketPar.build()); //根据每个方法名也知道当前方法在设置什么参数
return pars;
}
} }
...@@ -7,6 +7,5 @@ import com.liquidnet.common.swagger.config.SwaggerApiTags; ...@@ -7,6 +7,5 @@ import com.liquidnet.common.swagger.config.SwaggerApiTags;
* @author Li Chen * @author Li Chen
*/ */
public interface AdamSwaggerApiTags extends SwaggerApiTags { public interface AdamSwaggerApiTags extends SwaggerApiTags {
String COM = "com";
} }
...@@ -9,18 +9,4 @@ import com.liquidnet.common.swagger.config.SwaggerApiVersionConstant; ...@@ -9,18 +9,4 @@ import com.liquidnet.common.swagger.config.SwaggerApiVersionConstant;
*/ */
public interface AdamSwaggerApiVersionConstant extends SwaggerApiVersionConstant { public interface AdamSwaggerApiVersionConstant extends SwaggerApiVersionConstant {
String ADMIN = "admin";
String FEIGN = "fegin";
String TASK = "task";
String WEB_SYS = "web sys";
String WEB_1_0 = "web 1.0";
String WEB_1_1 = "web 1.1";
String WEB_1_2 = "web 1.2";
} }
...@@ -10,8 +10,6 @@ import com.liquidnet.service.adam.service.IAdamEntersService; ...@@ -10,8 +10,6 @@ import com.liquidnet.service.adam.service.IAdamEntersService;
import io.swagger.annotations.Api; import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.AmqpException;
import org.springframework.amqp.core.AmqpTemplate;
import org.springframework.beans.BeanUtils; import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
...@@ -32,23 +30,9 @@ import java.util.List; ...@@ -32,23 +30,9 @@ import java.util.List;
@Slf4j @Slf4j
@RestController @RestController
@RequestMapping("/enters") @RequestMapping("/enters")
public class AdamEntersController { public class AdamEntersController {
@Autowired @Autowired
IAdamEntersService adamEntersService; IAdamEntersService adamEntersService;
@Autowired
AmqpTemplate amqpTemplate;
@ApiOperationSupport(order = 0)
@ApiOperation(value = "Producer")
@PostMapping("producer")
public ResponseDto<Object> producer() {
try {
amqpTemplate.convertAndSend("queue_test", "queue_key", "select * from x " + System.currentTimeMillis());
} catch (AmqpException e) {
e.printStackTrace();
}
return ResponseDto.success();
}
@ApiOperationSupport(order = 1) @ApiOperationSupport(order = 1)
@ApiOperation(value = "入场人列表") @ApiOperation(value = "入场人列表")
...@@ -58,7 +42,6 @@ public class AdamEntersController { ...@@ -58,7 +42,6 @@ public class AdamEntersController {
String uid = "1"; String uid = "1";
List<AdamEntersVo> voList = new ArrayList<>(); List<AdamEntersVo> voList = new ArrayList<>();
adamEntersService.list(uid).forEach(i -> { adamEntersService.list(uid).forEach(i -> {
voList.add(AdamEntersVo.getNew().copy(i)); voList.add(AdamEntersVo.getNew().copy(i));
......
package com.liquidnet.service.adam.service.impl; package com.liquidnet.service.adam.service.impl;
import com.alibaba.fastjson.JSON;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.liquidnet.common.cache.redis.util.RedisUtil; import com.liquidnet.common.cache.redis.util.RedisUtil;
import com.liquidnet.commons.lang.util.JsonUtils; import com.liquidnet.common.mq.constant.MQConst;
import com.liquidnet.commons.lang.util.BsonUtil;
import com.liquidnet.commons.lang.util.SqlMapping;
import com.liquidnet.service.adam.constant.AdamRedisConst; import com.liquidnet.service.adam.constant.AdamRedisConst;
import com.liquidnet.service.adam.entity.AdamEnters; import com.liquidnet.service.adam.entity.AdamEnters;
import com.liquidnet.service.adam.mapper.AdamEntersMapper; import com.liquidnet.service.adam.mapper.AdamEntersMapper;
import com.liquidnet.service.adam.service.IAdamEntersService; import com.liquidnet.service.adam.service.IAdamEntersService;
import com.mongodb.BasicDBObject; import com.mongodb.BasicDBObject;
import com.mongodb.client.model.FindOneAndUpdateOptions;
import com.mongodb.client.model.ReturnDocument;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.bson.Document;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.mongodb.core.MongoTemplate; import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.convert.MongoConverter;
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.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.CollectionUtils; import org.springframework.util.CollectionUtils;
import java.util.ArrayList; import java.util.*;
import java.util.Collections;
import java.util.List;
import java.util.Map;
/** /**
* <p> * <p>
...@@ -36,13 +41,17 @@ public class AdamEntersServiceImpl extends ServiceImpl<AdamEntersMapper, AdamEnt ...@@ -36,13 +41,17 @@ public class AdamEntersServiceImpl extends ServiceImpl<AdamEntersMapper, AdamEnt
@Autowired @Autowired
AdamEntersMapper adamEntersMapper; AdamEntersMapper adamEntersMapper;
@Autowired @Autowired
MongoConverter mongoConverter;
@Autowired
MongoTemplate mongoTemplate; MongoTemplate mongoTemplate;
@Autowired @Autowired
RabbitTemplate rabbitTemplate;
@Autowired
RedisUtil redisUtil; RedisUtil redisUtil;
@Override @Override
public List<AdamEnters> list(String uid) { public List<AdamEnters> list(String uid) {
ç List<AdamEnters> infoList = new ArrayList<>();
Map<Object, Object> map = redisUtil.hmget(AdamRedisConst.INFO_ENTERS.concat(uid)); Map<Object, Object> map = redisUtil.hmget(AdamRedisConst.INFO_ENTERS.concat(uid));
...@@ -58,22 +67,58 @@ public class AdamEntersServiceImpl extends ServiceImpl<AdamEntersMapper, AdamEnt ...@@ -58,22 +67,58 @@ public class AdamEntersServiceImpl extends ServiceImpl<AdamEntersMapper, AdamEnt
} }
@Override @Override
@Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
public void add(AdamEnters info) { public void add(AdamEnters info) {
mongoTemplate.insert(Collections.singletonList(info), AdamEnters.class.getSimpleName()); if (info.getIsDefault()) {
Set<Object> keys = (Set<Object>) redisUtil.hkeys(AdamRedisConst.INFO_ENTERS.concat(info.getUid()));
if (!CollectionUtils.isEmpty(keys)) {
AdamEnters deaultEnters = new AdamEnters();
deaultEnters.setUid(info.getUid());
deaultEnters.setIsDefault(false);
BasicDBObject object = new BasicDBObject("$set", mongoConverter.convertToMongoType(deaultEnters));
Document doc = mongoTemplate.getCollection(AdamEnters.class.getSimpleName()).findOneAndUpdate(
Query.query(Criteria.where("uid").is(deaultEnters.getUid()).and("isDefault").is(true)).getQueryObject(),
object, new FindOneAndUpdateOptions().returnDocument(ReturnDocument.AFTER)
);
if (null != doc) {
List<Object> paramList = new ArrayList<>();
paramList.add(info.getIsDefault());
paramList.add(info.getUpdatedAt());
paramList.add(info.getEntersId());
rabbitTemplate.convertAndSend(MQConst.EXCHANGES_LIQUIDNET_SQL, MQConst.ROUTING_KEY_SQL,
SqlMapping.get("adam_enters.update.is_default", paramList.toArray()));
AdamEnters enters = BsonUtil.toBean(doc, AdamEnters.class);
redisUtil.hset(AdamRedisConst.INFO_ENTERS.concat(enters.getUid()), enters.getEntersId(), enters);
}
}
}
// TODO: 2021/4/28 放入MQ mongoTemplate.insert(Collections.singletonList(info), AdamEnters.class.getSimpleName());
List<Object> paramList = new ArrayList<>();
paramList.add(info.getEntersId());
paramList.add(info.getUid());
paramList.add(info.getType());
paramList.add(info.getName());
paramList.add(info.getMobile());
paramList.add(info.getIdCard());
paramList.add(info.getIsDefault());
paramList.add(info.getState());
paramList.add(info.getCreatedAt());
paramList.add(info.getUpdatedAt());
paramList.add(info.getDeletedAt());
paramList.add(info.getComment());
rabbitTemplate.convertAndSend(MQConst.EXCHANGES_LIQUIDNET_SQL, MQConst.ROUTING_KEY_SQL,
SqlMapping.get("adam_enters.add", paramList.toArray()));
// TODO: 2021/4/28 同步REDIS
redisUtil.hset(AdamRedisConst.INFO_ENTERS.concat(info.getUid()), info.getEntersId(), info); redisUtil.hset(AdamRedisConst.INFO_ENTERS.concat(info.getUid()), info.getEntersId(), info);
} }
@Override @Override
public AdamEnters query(String uid, String entersId) { public AdamEnters query(String uid, String entersId) {
AdamEnters info = null; AdamEnters info = (AdamEnters) redisUtil.hget(AdamRedisConst.INFO_ENTERS.concat(uid), entersId);
// TODO: 2021/4/28 REDIS:QUERY
info = (AdamEnters) redisUtil.hget(AdamRedisConst.INFO_ENTERS.concat(uid), entersId);
if (null == info) { if (null == info) {
info = mongoTemplate.findOne(Query.query(Criteria.where("entersId").is(entersId)), AdamEnters.class, AdamEnters.class.getSimpleName()); info = mongoTemplate.findOne(Query.query(Criteria.where("entersId").is(entersId)), AdamEnters.class, AdamEnters.class.getSimpleName());
...@@ -83,15 +128,51 @@ public class AdamEntersServiceImpl extends ServiceImpl<AdamEntersMapper, AdamEnt ...@@ -83,15 +128,51 @@ public class AdamEntersServiceImpl extends ServiceImpl<AdamEntersMapper, AdamEnt
} }
@Override @Override
@Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
public void edit(AdamEnters info) { public void edit(AdamEnters info) {
BasicDBObject object = new BasicDBObject("$set", JSON.parse(JsonUtils.toJson(info))); AdamEnters oldEnters = (AdamEnters) redisUtil.hget(AdamRedisConst.INFO_ENTERS.concat(info.getUid()), info.getEntersId());
mongoTemplate.getCollection(AdamEnters.class.getSimpleName()) if (info.getIsDefault() && !oldEnters.getIsDefault()) {
.updateOne(Query.query(Criteria.where("entersId").is(info.getEntersId())).getQueryObject(), object); AdamEnters deaultEnters = new AdamEnters();
deaultEnters.setUid(info.getUid());
// TODO: 2021/4/28 放入MQ deaultEnters.setIsDefault(false);
BasicDBObject object = new BasicDBObject("$set", mongoConverter.convertToMongoType(deaultEnters));
Document doc = mongoTemplate.getCollection(AdamEnters.class.getSimpleName()).findOneAndUpdate(
Query.query(Criteria.where("uid").is(deaultEnters.getUid()).and("isDefault").is(true)).getQueryObject(),
object, new FindOneAndUpdateOptions().returnDocument(ReturnDocument.AFTER)
);
if (null != doc) {
List<Object> paramList = new ArrayList<>();
paramList.add(info.getIsDefault());
paramList.add(info.getUpdatedAt());
paramList.add(info.getEntersId());
rabbitTemplate.convertAndSend(MQConst.EXCHANGES_LIQUIDNET_SQL, MQConst.ROUTING_KEY_SQL,
SqlMapping.get("adam_enters.update.is_default", paramList.toArray()));
AdamEnters enters = BsonUtil.toBean(doc, AdamEnters.class);
redisUtil.hset(AdamRedisConst.INFO_ENTERS.concat(enters.getUid()), enters.getEntersId(), enters);
}
}
// TODO: 2021/4/28 同步REDIS BasicDBObject object = new BasicDBObject("$set", mongoConverter.convertToMongoType(info));
redisUtil.hset(AdamRedisConst.INFO_ENTERS.concat(info.getUid()), info.getEntersId(), info); Document doc = mongoTemplate.getCollection(AdamEnters.class.getSimpleName()).findOneAndUpdate(
Query.query(Criteria.where("entersId").is(info.getEntersId())).getQueryObject(),
object, new FindOneAndUpdateOptions().returnDocument(ReturnDocument.AFTER)
);
List<Object> paramList = new ArrayList<>();
paramList.add(info.getType());
paramList.add(info.getName());
paramList.add(info.getMobile());
paramList.add(info.getIdCard());
paramList.add(info.getIsDefault());
paramList.add(info.getState());
paramList.add(info.getUpdatedAt());
paramList.add(info.getDeletedAt());
paramList.add(info.getEntersId());
rabbitTemplate.convertAndSend(MQConst.EXCHANGES_LIQUIDNET_SQL, MQConst.ROUTING_KEY_SQL,
SqlMapping.get("adam_enters.edit", paramList.toArray()));
redisUtil.hset(AdamRedisConst.INFO_ENTERS.concat(info.getUid()), info.getEntersId(), BsonUtil.toBean(doc, AdamEnters.class));
} }
} }
adam_enters.add=INSERT INTO adam_enters (enters_id, `uid`, `type`,`name`, mobile, id_card,is_default, `state`, created_at,updated_at, deleted_at, `comment`) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
adam_enters.edit=UPDATE adam_enters `type` = ?, `name` = ?, mobile = ?, id_card = ?, is_default = ?, `state` = ?, updated_at = ? where enters_id = ?
adam_enters.update.is_default=UPDATE adam_enters is_default = ?, updated_at = ? where enters_id = ?
adam_enters.remove=UPDATE adam_enters `state` = ?, updated_at = ?, deleted_at = ? where enters_id = ?
\ No newline at end of file
...@@ -16,4 +16,32 @@ ...@@ -16,4 +16,32 @@
<maven.compiler.target>8</maven.compiler.target> <maven.compiler.target>8</maven.compiler.target>
</properties> </properties>
<dependencies>
<dependency>
<groupId>com.liquidnet</groupId>
<artifactId>liquidnet-common-service-base</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>com.liquidnet</groupId>
<artifactId>liquidnet-common-mq</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
<resources>
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering>
</resource>
</resources>
</build>
</project> </project>
\ No newline at end of file
...@@ -4,7 +4,12 @@ import lombok.extern.slf4j.Slf4j; ...@@ -4,7 +4,12 @@ import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner; import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication; import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.data.redis.RedisAutoConfiguration;
import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
import org.springframework.boot.autoconfigure.mongo.MongoAutoConfiguration;
import org.springframework.cloud.bus.BusAutoConfiguration;
import org.springframework.core.env.Environment; import org.springframework.core.env.Environment;
import org.springframework.jdbc.datasource.DataSourceTransactionManager; import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import org.springframework.transaction.PlatformTransactionManager; import org.springframework.transaction.PlatformTransactionManager;
...@@ -15,6 +20,9 @@ import java.net.UnknownHostException; ...@@ -15,6 +20,9 @@ import java.net.UnknownHostException;
import java.util.Arrays; import java.util.Arrays;
@Slf4j @Slf4j
@EnableAutoConfiguration(
exclude = {BusAutoConfiguration.class, MongoAutoConfiguration.class, RedisAutoConfiguration.class}
)
@SpringBootApplication(scanBasePackages = {"com.liquidnet"}) @SpringBootApplication(scanBasePackages = {"com.liquidnet"})
public class ServiceConsumerApplication implements CommandLineRunner { public class ServiceConsumerApplication implements CommandLineRunner {
@Autowired @Autowired
......
package com.liquidnet.service.consumer.service;
import java.util.LinkedList;
public interface IBaseDao {
/**
* 批量执行sql
*
* @param sql
* @param values
* @return
*/
Boolean batchSql(String sql, LinkedList<Object[]> values);
/**
* 批量执行不定量sql
*
* @param sql
* @param values
* @return
*/
Boolean batchSqls(LinkedList<String> sql, LinkedList<Object[]>... values);
/**
* xs 新增一条记录且返回主键Id
*
* @param sql 新增待执行sql
* @param param 参数
* @return 主键ID
*/
int insertSqlAndReturnKeyId(final String sql, final Object[] param);
}
package com.liquidnet.service.consumer.service.impl;
import com.liquidnet.commons.lang.util.JsonUtils;
import com.liquidnet.service.consumer.service.IBaseDao;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.dao.DataAccessException;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.PreparedStatementCreator;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import org.springframework.jdbc.support.GeneratedKeyHolder;
import org.springframework.jdbc.support.KeyHolder;
import org.springframework.stereotype.Service;
import org.springframework.transaction.TransactionStatus;
import org.springframework.transaction.support.TransactionCallback;
import org.springframework.transaction.support.TransactionTemplate;
import javax.annotation.Resource;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.LinkedList;
import java.util.List;
@Service
public class BaseDao implements IBaseDao {
private static final Logger log = LoggerFactory.getLogger(BaseDao.class);
@Resource
public JdbcTemplate jdbcTemplate;
@Resource(name = "transactionManager")
public DataSourceTransactionManager transactionManager;
@Override
public Boolean batchSql(final String sql, final LinkedList<Object[]> values) {
TransactionCallback<Boolean> callback = new TransactionCallback<Boolean>() {
@Override
public Boolean doInTransaction(final TransactionStatus transactionStatus) {
if (values.size() > 0) {
jdbcTemplate.batchUpdate(sql, values);
}
return true;
}
};
try {
TransactionTemplate tt = new TransactionTemplate(transactionManager);
return tt.execute(callback);
} catch (Exception ex) {
log.error("###SQL.Preparing:{}\nParameters:{}", JsonUtils.toJson(sql), JsonUtils.toJson(values), ex);
return false;
}
}
@Override
public Boolean batchSqls(final LinkedList<String> sql,
final LinkedList<Object[]>... values) {
TransactionCallback<Boolean> callback = new TransactionCallback<Boolean>() {
@Override
public Boolean doInTransaction(final TransactionStatus transactionStatus) {
int i = 0;
for (LinkedList<Object[]> o : values) {
if (sql.size() < i + 1) {
break;
}
if (!o.isEmpty()) {
jdbcTemplate.batchUpdate(sql.get(i), o);
}
i++;
}
return true;
}
};
try {
TransactionTemplate tt = new TransactionTemplate(transactionManager);
return tt.execute(callback);
} catch (Exception ex) {
log.error("###SQL.Preparing:{}\nParameters:{}", JsonUtils.toJson(sql), JsonUtils.toJson(values), ex);
return false;
}
}
/**
* xs 新增一条记录且返回主键Id
*
* @param sql 新增待执行sql
* @param param 参数
* @return 主键ID
*/
public int insertSqlAndReturnKeyId(final String sql, final Object[] param) {
final String innersql = sql;
final Object[] innerO = param;
KeyHolder keyHolder = new GeneratedKeyHolder();
try {
jdbcTemplate.update(new PreparedStatementCreator() {
@Override
public PreparedStatement createPreparedStatement(final Connection con)
throws SQLException {
PreparedStatement ps = con.prepareStatement(innersql,
Statement.RETURN_GENERATED_KEYS);
for (int i = 0; i < innerO.length; i++) {
ps.setObject(i + 1, innerO[i]);
}
return ps;
}
}, keyHolder);
} catch (Exception e) {
log.error("###SQL.Preparing:{}\nParameters:{}", sql, JsonUtils.toJson(param), e);
}
return keyHolder.getKey().intValue();
}
}
package com.liquidnet.service.consumer.service.processor; package com.liquidnet.service.consumer.service.processor;
import com.liquidnet.common.mq.constant.MQConst;
import com.liquidnet.commons.lang.util.JsonUtils;
import com.liquidnet.commons.lang.util.SqlMessage;
import com.liquidnet.service.consumer.service.IBaseDao;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.core.Message; import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.amqp.rabbit.annotation.*;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import javax.annotation.Resource;
/** /**
* ConsumerProcessor.class * ConsumerProcessor.class
* *
...@@ -14,13 +19,44 @@ import org.springframework.stereotype.Component; ...@@ -14,13 +19,44 @@ import org.springframework.stereotype.Component;
@Slf4j @Slf4j
@Component @Component
public class ConsumerProcessor { public class ConsumerProcessor {
@RabbitListener(bindings = @QueueBinding( @Resource
exchange = @Exchange("queue_test"), IBaseDao baseDao;
key = "queue_key",
value = @Queue("queue_adam") // @RabbitListener(bindings = @QueueBinding(
)) // exchange = @Exchange("queue.sql"),
@RabbitHandler // key = "rk",
public void consumerSql(Message message) { // value = @Queue("queue.sql.main")
log.info("consumer sql:{}", message); // ))
// @RabbitHandler
// public void consumerSql(Message message) {
// log.info("consumer sql:{}", message);
// }
@RabbitListener(queues = MQConst.QUEUES_SQL_MAIN)
public void consumerSql(String msg) {
SqlMessage sqlMessage = JsonUtils.fromJson(msg, SqlMessage.class);
log.debug("consumer sql ==> Preparing:{}", JsonUtils.toJson(sqlMessage.getSqls()));
log.debug("consumer sql ==> Parameters:{}", JsonUtils.toJson(sqlMessage.getArgs()));
try {
switch (sqlMessage.getExecType()) {
case 1:
int i = baseDao.insertSqlAndReturnKeyId(sqlMessage.getSqls().get(0), sqlMessage.getArgs()[0].get(0));
log.debug("insertSqlAndReturnKeyId result of execution:{}", i);
break;
case 2:
Boolean rstBatchSql = baseDao.batchSql(sqlMessage.getSqls().get(0), sqlMessage.getArgs()[0]);
log.debug("batchSql result of execution:{}", rstBatchSql);
break;
case 3:
Boolean rstBatchSqls = baseDao.batchSqls(sqlMessage.getSqls(), sqlMessage.getArgs());
log.debug("batchSqls result of execution:{}", rstBatchSqls);
break;
default:
break;
}
} catch (Exception e) {
log.error("error", e);
}
} }
} }
# begin-dev-这里是配置信息基本值
liquidnet:
cloudConfig:
profile: dev
security:
username: user
password: user123
eureka:
host: 127.0.0.1:7001
# end-dev-这里是配置信息基本值
spring:
profiles:
include: service-consumer
# begin-dev-这里是配置信息基本值
liquidnet:
cloudConfig:
profile: prod
security:
username: user
password: user123
eureka:
host: 127.0.0.1:7001
# end-dev-这里是配置信息基本值
spring:
profiles:
include: service-consumer
\ No newline at end of file
#eurekaServer配置
eureka:
client:
register-with-eureka: true
fetch-registry: true
serviceUrl:
defaultZone: http://${liquidnet.security.username}:${liquidnet.security.password}@${liquidnet.eureka.host}/eureka-server/eureka
#configServer配置
spring:
cloud:
config:
# uri: http://127.0.0.1:7002/support-config
profile: ${liquidnet.cloudConfig.profile}
name: ${spring.application.name} #默认为spring.application.name
discovery:
enabled: true
service-id: liquidnet-support-config
\ No newline at end of file
# begin-dev-这里是配置信息基本值
liquidnet:
cloudConfig:
profile: test
security:
username: user
password: user123
eureka:
host: 172.18.0.2:7001
# end-dev-这里是配置信息基本值
spring:
profiles:
include: service-consumer
\ No newline at end of file
spring:
application:
name: liquidnet-service-consumer
profiles:
active: dev
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment