提交 cb920fd2 编写于 作者: zhouweidong's avatar zhouweidong

合并分支 'dev' 到 '2020.10.28【673】'

Dev

查看合并请求 !41
# **iBiz4j Spring R7 Template ChangeLog** # **iBiz4j Spring R7 Template ChangeLog**
## [v2021.01.05]
- 修复:mybatis游标异常
- 修复:liquibase内网环境启动错误
- 修复:save带id时保存时,无法填充createDate的问题
- 修复:service中ProxyService无法注入子服务对象
- 优化:实体数据同步(RocketMQ)消息发送与接收逻辑
- 优化:logback 日志文件到达上限后重新生成新日志文件
- 优化:补充 docker 故障重启次数
- 优化:资源同步服务(PermissionSyncJob)逻辑优化
- 优化:服务接口补充空的返回值类型
- 优化:服务接口补充实体行为批处理,用于界面行为多项数据
## [v2020.12.13] ## [v2020.12.13]
- 支持工作流操作视图、操作表单配置 - 支持工作流操作视图、操作表单配置
- 支持实体数据同步(RocketMQ) - 支持实体数据同步(RocketMQ)
......
...@@ -103,6 +103,10 @@ services: ...@@ -103,6 +103,10 @@ services:
memory: 256M memory: 256M
mode: replicated mode: replicated
replicas: 1 replicas: 1
restart_policy:
condition: on-failure
max_attempts: 3
window: 120s
volumes: volumes:
- "nfs:/app/file" - "nfs:/app/file"
......
...@@ -31,18 +31,17 @@ TARGET=PSSYSTEM ...@@ -31,18 +31,17 @@ TARGET=PSSYSTEM
<appender name="file" class="ch.qos.logback.core.rolling.RollingFileAppender"> <appender name="file" class="ch.qos.logback.core.rolling.RollingFileAppender">
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!--日志文件输出的文件名--> <!--日志文件输出的文件名-->
<FileNamePattern>${r'${LOG_PATH}'}/${sys.getCodeName()?lower_case}.%d{yyyy-MM-dd}.log</FileNamePattern> <FileNamePattern>${r'${LOG_PATH}'}/${sys.getCodeName()?lower_case}.%d{yyyy-MM-dd}.%i.log</FileNamePattern>
<!--日志文件最大的大小-->
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>100MB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
<!--日志文件保留天数--> <!--日志文件保留天数-->
<MaxHistory>30</MaxHistory> <MaxHistory>30</MaxHistory>
</rollingPolicy> </rollingPolicy>
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder"> <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<pattern>${r'${LOG_PATTERN}'}</pattern> <pattern>${r'${LOG_PATTERN}'}</pattern>
</encoder> </encoder>
<!--日志文件最大的大小-->
<triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
<MaxFileSize>100MB</MaxFileSize>
</triggeringPolicy>
</appender> </appender>
<!-- 日志输出级别 --> <!-- 日志输出级别 -->
<root level="INFO"> <root level="INFO">
......
...@@ -60,7 +60,7 @@ public interface ${de.codeName}InheritMapping { ...@@ -60,7 +60,7 @@ public interface ${de.codeName}InheritMapping {
</#list> </#list>
</#if> </#if>
}) })
${majorIndexDECodeName} to${majorIndexDECodeNameCamel}(${MinorIndexDECodeName} ${MinorIndexDECodeName?lower_case}); ${majorIndexDECodeName} to${majorIndexDECodeNameCamel}(${MinorIndexDECodeName} minorEntity);
@Mappings({ @Mappings({
@Mapping(source ="${majorIndexDEKeyFieldCodeName}" ,target = "${MinorIndexDEKeyFieldCodeName}"), @Mapping(source ="${majorIndexDEKeyFieldCodeName}" ,target = "${MinorIndexDEKeyFieldCodeName}"),
...@@ -81,11 +81,11 @@ public interface ${de.codeName}InheritMapping { ...@@ -81,11 +81,11 @@ public interface ${de.codeName}InheritMapping {
</#list> </#list>
</#if> </#if>
}) })
${MinorIndexDECodeName} to${MinorIndexDECodeNameCamel}(${majorIndexDECodeName} ${majorIndexDECodeName?lower_case}); ${MinorIndexDECodeName} to${MinorIndexDECodeNameCamel}(${majorIndexDECodeName} majorEntity);
List<${majorIndexDECodeName}> to${majorIndexDECodeNameCamel}(List<${MinorIndexDECodeName}> ${MinorIndexDECodeName?lower_case}); List<${majorIndexDECodeName}> to${majorIndexDECodeNameCamel}(List<${MinorIndexDECodeName}> minorEntities);
List<${MinorIndexDECodeName}> to${MinorIndexDECodeNameCamel}(List<${majorIndexDECodeName}> ${majorIndexDECodeName?lower_case}); List<${MinorIndexDECodeName}> to${MinorIndexDECodeNameCamel}(List<${majorIndexDECodeName}> majorEntities);
} }
</#if> </#if>
......
...@@ -44,6 +44,11 @@ import com.baomidou.mybatisplus.extension.service.IService; ...@@ -44,6 +44,11 @@ import com.baomidou.mybatisplus.extension.service.IService;
/** /**
* 实体[${item.codeName}] 服务对象接口 * 实体[${item.codeName}] 服务对象接口
*/ */
<#if item.getDSLink?? && item.getDSLink()??>
<#if item.getDSLink()!='DEFAULT'>
@com.baomidou.dynamic.datasource.annotation.DS("${item.getDSLink()?lower_case}")
</#if>
</#if>
public interface I${item.codeName}Service extends IService<${item.codeName}> { public interface I${item.codeName}Service extends IService<${item.codeName}> {
<@addIDESerivceBody /> <@addIDESerivceBody />
......
...@@ -67,6 +67,9 @@ TARGET=PSDATAENTITY ...@@ -67,6 +67,9 @@ TARGET=PSDATAENTITY
</#list> </#list>
</#if> </#if>
<#assign isDupCheck=isDupCheckEntity(de)> <#assign isDupCheck=isDupCheckEntity(de)>
<#assign keyfield=de.getKeyPSDEField()>
<#assign keyfieldPrivateCodeName = srfcaseformat(keyfield.getCodeName(),'l_u2lC') >
<#assign keyfieldPublicCodeName = keyfieldPrivateCodeName?cap_first >
package ${pub.getPKGCodeName()}.core.${item.getPSSystemModule().getCodeName()?lower_case}.service.impl; package ${pub.getPKGCodeName()}.core.${item.getPSSystemModule().getCodeName()?lower_case}.service.impl;
import java.io.Serializable; import java.io.Serializable;
...@@ -122,10 +125,6 @@ import org.springframework.util.StringUtils; ...@@ -122,10 +125,6 @@ import org.springframework.util.StringUtils;
@Service("${item.getCodeName()}ServiceImpl") @Service("${item.getCodeName()}ServiceImpl")
public class ${item.getCodeName()}ServiceImpl extends ServiceImpl<${de.getCodeName()}Mapper, ${de.getCodeName()}> implements I${de.getCodeName()}Service { public class ${item.getCodeName()}ServiceImpl extends ServiceImpl<${de.getCodeName()}Mapper, ${de.getCodeName()}> implements I${de.getCodeName()}Service {
<#assign keyfield=de.getKeyPSDEField()>
<#assign keyfieldPrivateCodeName = srfcaseformat(keyfield.getCodeName(),'l_u2lC') >
<#assign keyfieldPublicCodeName = keyfieldPrivateCodeName?cap_first >
<#comment>引入关联依赖-从关系</#comment> <#comment>引入关联依赖-从关系</#comment>
<#if de.getMajorPSDERs()??> <#if de.getMajorPSDERs()??>
<#list de.getMajorPSDERs() as der> <#list de.getMajorPSDERs() as der>
...@@ -451,7 +450,7 @@ public class ${item.getCodeName()}ServiceImpl extends ServiceImpl<${de.getCodeNa ...@@ -451,7 +450,7 @@ public class ${item.getCodeName()}ServiceImpl extends ServiceImpl<${de.getCodeNa
if (null == et) { if (null == et) {
return false; return false;
} else { } else {
return checkKey(et) ? this.update(et) : this.create(et); return checkKey(et) ? getProxyService().update(et) : getProxyService().create(et);
} }
} }
...@@ -463,7 +462,7 @@ public class ${item.getCodeName()}ServiceImpl extends ServiceImpl<${de.getCodeNa ...@@ -463,7 +462,7 @@ public class ${item.getCodeName()}ServiceImpl extends ServiceImpl<${de.getCodeNa
<#if hasMinorPSDERs gt 0> <#if hasMinorPSDERs gt 0>
list.forEach(item->fillParentData(item)); list.forEach(item->fillParentData(item));
</#if> </#if>
saveOrUpdateBatch(list,batchSize); <@saveBatch/>
return true; return true;
} }
...@@ -475,7 +474,7 @@ public class ${item.getCodeName()}ServiceImpl extends ServiceImpl<${de.getCodeNa ...@@ -475,7 +474,7 @@ public class ${item.getCodeName()}ServiceImpl extends ServiceImpl<${de.getCodeNa
<#if hasMinorPSDERs gt 0> <#if hasMinorPSDERs gt 0>
list.forEach(item->fillParentData(item)); list.forEach(item->fillParentData(item));
</#if> </#if>
saveOrUpdateBatch(list,batchSize); <@saveBatch/>
} }
<#elseif deaction.getCodeName()?lower_case == "remove"> <#elseif deaction.getCodeName()?lower_case == "remove">
...@@ -646,11 +645,11 @@ public class ${item.getCodeName()}ServiceImpl extends ServiceImpl<${de.getCodeNa ...@@ -646,11 +645,11 @@ public class ${item.getCodeName()}ServiceImpl extends ServiceImpl<${de.getCodeNa
_create.add(sub); _create.add(sub);
} }
if(_update.size()>0) if(_update.size()>0)
proxyService.updateBatch(_update); getProxyService().updateBatch(_update);
if(_create.size()>0) if(_create.size()>0)
proxyService.createBatch(_create); getProxyService().createBatch(_create);
if(delIds.size()>0) if(delIds.size()>0)
proxyService.removeBatch(delIds); getProxyService().removeBatch(delIds);
} }
</#if> </#if>
...@@ -993,6 +992,9 @@ public class ${item.getCodeName()}ServiceImpl extends ServiceImpl<${de.getCodeNa ...@@ -993,6 +992,9 @@ public class ${item.getCodeName()}ServiceImpl extends ServiceImpl<${de.getCodeNa
<#comment>重复值检查-searchContext</#comment> <#comment>重复值检查-searchContext</#comment>
<@outputSearchContext/> <@outputSearchContext/>
<#comment>引入proxyservice</#comment>
<@autowiredProxyService/>
} }
<#comment>NOSQL存储</#comment> <#comment>NOSQL存储</#comment>
...@@ -1414,11 +1416,11 @@ public class ${item.getCodeName()}ServiceImpl implements I${de.getCodeName()}Ser ...@@ -1414,11 +1416,11 @@ public class ${item.getCodeName()}ServiceImpl implements I${de.getCodeName()}Ser
_create.add(sub); _create.add(sub);
} }
if(_update.size()>0) if(_update.size()>0)
proxyService.updateBatch(_update); getProxyService().updateBatch(_update);
if(_create.size()>0) if(_create.size()>0)
proxyService.createBatch(_create); getProxyService().createBatch(_create);
if(delIds.size()>0) if(delIds.size()>0)
proxyService.removeBatch(delIds); getProxyService().removeBatch(delIds);
} }
</#if> </#if>
...@@ -1956,11 +1958,11 @@ public class ${item.getCodeName()}ServiceImpl implements I${de.getCodeName()}Ser ...@@ -1956,11 +1958,11 @@ public class ${item.getCodeName()}ServiceImpl implements I${de.getCodeName()}Ser
_create.add(sub); _create.add(sub);
} }
if(_update.size()>0) if(_update.size()>0)
proxyService.updateBatch(_update); getProxyService().updateBatch(_update);
if(_create.size()>0) if(_create.size()>0)
proxyService.createBatch(_create); getProxyService().createBatch(_create);
if(delIds.size()>0) if(delIds.size()>0)
proxyService.removeBatch(delIds); getProxyService().removeBatch(delIds);
} }
</#if> </#if>
...@@ -2281,11 +2283,11 @@ public class ${item.getCodeName()}ServiceImpl implements I${de.getCodeName()}Ser ...@@ -2281,11 +2283,11 @@ public class ${item.getCodeName()}ServiceImpl implements I${de.getCodeName()}Ser
_create.add(sub); _create.add(sub);
} }
if(_update.size()>0) if(_update.size()>0)
proxyService.updateBatch(_update); getProxyService().updateBatch(_update);
if(_create.size()>0) if(_create.size()>0)
proxyService.createBatch(_create); getProxyService().createBatch(_create);
if(delIds.size()>0) if(delIds.size()>0)
proxyService.removeBatch(delIds); getProxyService().removeBatch(delIds);
} }
</#if> </#if>
...@@ -2672,9 +2674,9 @@ public class ${item.getCodeName()}ServiceImpl implements I${de.getCodeName()}Ser ...@@ -2672,9 +2674,9 @@ public class ${item.getCodeName()}ServiceImpl implements I${de.getCodeName()}Ser
<#comment>注入代理行为</#comment> <#comment>注入代理行为</#comment>
<#macro autowiredProxyService> <#macro autowiredProxyService>
<#if !P.exists(de.codeName,'proxyService')> <#if !P.exists(de.codeName,'proxyService')>
@Autowired public I${de.getCodeName()}Service getProxyService() {
@Lazy return ${pub.getPKGCodeName()}.util.security.SpringContextHolder.getBean(this.getClass());
I${de.codeName}Service proxyService; }
</#if> </#if>
</#macro> </#macro>
...@@ -2795,7 +2797,7 @@ public class ${item.getCodeName()}ServiceImpl implements I${de.getCodeName()}Ser ...@@ -2795,7 +2797,7 @@ public class ${item.getCodeName()}ServiceImpl implements I${de.getCodeName()}Ser
@Transactional @Transactional
public JSONObject importData(List<${de.codeName}> entities, int batchSize ,boolean isIgnoreError) { public JSONObject importData(List<${de.codeName}> entities, int batchSize ,boolean isIgnoreError) {
if(entities.size()>syncImportLimit){ if(entities.size()>syncImportLimit){
proxyService.asyncImportData(entities,batchSize,isIgnoreError); getProxyService().asyncImportData(entities,batchSize,isIgnoreError);
JSONObject rs=new JSONObject(); JSONObject rs=new JSONObject();
rs.put("rst", 0); rs.put("rst", 0);
rs.put("msg",String.format("当前导入数据已超过同步导入数量上限[%s],系统正在进行异步导入,请稍后!",syncImportLimit)); rs.put("msg",String.format("当前导入数据已超过同步导入数量上限[%s],系统正在进行异步导入,请稍后!",syncImportLimit));
...@@ -2871,10 +2873,10 @@ public class ${item.getCodeName()}ServiceImpl implements I${de.getCodeName()}Ser ...@@ -2871,10 +2873,10 @@ public class ${item.getCodeName()}ServiceImpl implements I${de.getCodeName()}Ser
} }
} }
if(_update.size()>0) { if(_update.size()>0) {
proxyService.updateBatch(_update); getProxyService().updateBatch(_update);
} }
if(_create.size()>0) { if(_create.size()>0) {
proxyService.createBatch(_create); getProxyService().createBatch(_create);
} }
} }
</#if> </#if>
...@@ -3070,4 +3072,23 @@ public class ${item.getCodeName()}ServiceImpl implements I${de.getCodeName()}Ser ...@@ -3070,4 +3072,23 @@ public class ${item.getCodeName()}ServiceImpl implements I${de.getCodeName()}Ser
} }
</#macro> </#macro>
<#comment>批量保存</#comment>
<#macro saveBatch>
List<${item.getCodeName()}> create = new ArrayList<>();
List<${item.getCodeName()}> update = new ArrayList<>();
for (${item.getCodeName()} et : list) {
if (ObjectUtils.isEmpty(et.get${keyfieldPublicCodeName}()) || ObjectUtils.isEmpty(getById(et.get${keyfieldPublicCodeName}()))) {
create.add(et);
} else {
update.add(et);
}
}
if (create.size() > 0) {
getProxyService().createBatch(create);
}
if (update.size() > 0) {
getProxyService().updateBatch(update);
}
</#macro>
</#if> </#if>
<#ibiztemplate>
TARGET=PSSYSTEM
</#ibiztemplate>
<#assign hasMQEntity=false>
<#list sys.getAllPSDataEntities() as dataEntity>
<#if dataEntity.getAllPSDEDataSyncs?? && dataEntity.getAllPSDEDataSyncs()??>
<#list dataEntity.getAllPSDEDataSyncs() as dataSync>
<#assign hasMQEntity=true>
<#break>
</#list>
</#if>
</#list>
<#if hasMQEntity>
<#assign nameAddress="127.0.0.1:9876">
<#assign instanceName="rmq-instance">
package ${pub.getPKGCodeName()}.core.util.config;
import com.alibaba.fastjson.JSON;
import com.alibaba.rocketmq.client.consumer.DefaultMQPushConsumer;
import com.alibaba.rocketmq.client.consumer.listener.ConsumeConcurrentlyContext;
import com.alibaba.rocketmq.client.consumer.listener.ConsumeConcurrentlyStatus;
import com.alibaba.rocketmq.client.consumer.listener.MessageListenerConcurrently;
import com.alibaba.rocketmq.client.producer.DefaultMQProducer;
import com.alibaba.rocketmq.common.message.MessageExt;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Lazy;
import java.util.List;
@Slf4j
@Configuration
public class RocketMQConfig {
<#list sys.getAllPSDataEntities() as dataEntity>
<#if dataEntity.getAllPSDEDataSyncs?? && dataEntity.getAllPSDEDataSyncs()??>
<#list dataEntity.getAllPSDEDataSyncs() as dataSync>
<#if dataSync.getOutPSSysDataSyncAgent?? && dataSync.getOutPSSysDataSyncAgent()??>
<#assign syncAgent=dataSync.getOutPSSysDataSyncAgent()>
<#assign producer=dataEntity.codeName+syncAgent.codeName+"producer">
<#if ((syncAgent.getAgentTag())!'')!=''>
<#assign nameAddress=syncAgent.getAgentTag()>
</#if>
<#if ((syncAgent.getAgentTag2())!'')!=''>
<#assign instanceName=syncAgent.getAgentTag2()>
</#if>
@Bean("${producer}")
public DefaultMQProducer ${srfmethodname(producer)}(){
DefaultMQProducer producer = null;
try{
producer= new DefaultMQProducer();
producer.setSendMsgTimeout(6000);
producer.setNamesrvAddr("${nameAddress}");
producer.setInstanceName("${instanceName}");
}
catch(Exception e){
log.error("初始化消息发送对象异常!");
}
return producer;
}
</#if>
</#list>
</#if>
</#list>
<#list sys.getAllPSDataEntities() as dataEntity>
<#if dataEntity.getAllPSDEDataSyncs?? && dataEntity.getAllPSDEDataSyncs()??>
<#list dataEntity.getAllPSDEDataSyncs() as dataSync>
<#if dataSync.getInPSSysDataSyncAgent?? && dataSync.getInPSSysDataSyncAgent()??>
<#assign syncAgent=dataSync.getInPSSysDataSyncAgent()>
<#assign consumer=dataEntity.codeName+syncAgent.codeName+"consumer">
<#assign entityName=dataEntity.getCodeName()>
<#if ((syncAgent.getAgentTag())!'')!=''>
<#assign nameAddress=syncAgent.getAgentTag()>
</#if>
<#if ((syncAgent.getAgentTag2())!'')!=''>
<#assign instanceName=syncAgent.getAgentTag2()>
</#if>
@Autowired
@Lazy
${pub.getPKGCodeName()}.core.${dataEntity.getPSSystemModule().getCodeName()?lower_case}.service.I${entityName}Service ${entityName}Service;
@Bean("${consumer}")
public DefaultMQPushConsumer ${srfmethodname(consumer)}(){
DefaultMQPushConsumer consumer = null;
try {
consumer = new DefaultMQPushConsumer();
consumer.setNamesrvAddr("${nameAddress}");
consumer.setInstanceName("${instanceName}");
consumer.subscribe("${dataSync.codeName}", "${dataSync.codeName}");
consumer.registerMessageListener(new MessageListenerConcurrently() {
public ConsumeConcurrentlyStatus consumeMessage(
List<MessageExt> msgs, ConsumeConcurrentlyContext context) {
for (MessageExt msg : msgs) {
<#if dataSync.getInTestPSDEAction()??>
<#assign inputAction=srfmethodname(dataSync.getInTestPSDEAction().codeName)>
${pub.getPKGCodeName()}.core.${dataEntity.getPSSystemModule().getCodeName()?lower_case}.domain.${entityName} domain = JSON.parseObject(new String(msg.getBody()),${pub.getPKGCodeName()}.core.${dataEntity.getPSSystemModule().getCodeName()?lower_case}.domain.${entityName}.class);
${entityName}Service.${inputAction}(domain);
<#else>
log.info("接收到[]消息,但未配置实体输入过滤行为,消息将被忽略。"+new String(msg.getBody()));
</#if>
}
return ConsumeConcurrentlyStatus.CONSUME_SUCCESS;
}
});
consumer.start();
}catch (Exception e){
log.error("初始化消息接收对象异常!");
}
return consumer;
}
</#if>
</#list>
</#if>
</#list>
}
</#if>
\ No newline at end of file
<#ibiztemplate>
TARGET=PSSYSTEM
</#ibiztemplate>
<#assign hasMQConsumer=false>
<#list sys.getAllPSDataEntities() as dataEntity>
<#if dataEntity.getAllPSDEDataSyncs?? && dataEntity.getAllPSDEDataSyncs()??>
<#list dataEntity.getAllPSDEDataSyncs() as dataSync>
<#if dataSync.getInPSSysDataSyncAgent?? && dataSync.getInPSSysDataSyncAgent()??>
<#assign hasMQConsumer=true>
<#break >
</#if>
</#list>
</#if>
</#list>
<#if hasMQConsumer>
<#comment>服务接口微服务平台配置</#comment>
<#assign mqServerAddress="">
<#if sys.getAllPSDevSlnMSDepAPIs()??>
<#list sys.getAllPSDevSlnMSDepAPIs() as depSysApi>
<#if depSysApi.getPSDCMSPlatform()?? >
<#if depSysApi.getUserParam("rocketmq.consumer.namesrvAddr","")??>
<#assign mqServerAddress = depSysApi.getUserParam("rocketmq.consumer.namesrvAddr","")>
</#if>
</#if>
</#list>
</#if>
<#if mqServerAddress!=''>
<#assign mqServer="on">
<#else>
<#assign mqServer="off">
</#if>
package ${pub.getPKGCodeName()}.core.util.config;
import lombok.extern.slf4j.Slf4j;
import org.apache.rocketmq.client.consumer.DefaultMQPushConsumer;
import org.apache.rocketmq.client.exception.MQClientException;
import org.apache.rocketmq.client.producer.DefaultMQProducer;
import org.apache.rocketmq.common.consumer.ConsumeFromWhere;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Lazy;
import org.springframework.boot.autoconfigure.condition.ConditionalOnExpression;
@Slf4j
@Configuration
@ConditionalOnExpression("'${r'${rocketmq.consumer.isOnOff:'+mqServer+"}'.equals('on')"}")
public class RocketMQConsumer {
@Value("${r'${rocketmq.consumer.groupName:default}'}")
private String groupName;
@Value("${r'${rocketmq.consumer.topic:default}'}")
private String topic;
@Value("${r'${rocketmq.consumer.namesrvAddr:127.0.0.1:9876}'}")
private String namesrvAddr;
@Value("${r'${rocketmq.consumer.consumeThreadMin:1}'}")
private Integer consumeThreadMin;
@Value("${r'${rocketmq.consumer.consumeThreadMax:1}'}")
private Integer consumeThreadMax;
@Value("${r'${rocketmq.consumer.consumeMessageBatchMaxSize:1}'}")
private Integer consumeMessageBatchMaxSize;
@Autowired
@Lazy
private RocketMQListenerProcessor listenerProcessor;
/**
* mq 消费者配置
*
* @return
* @throws MQClientException
*/
@Bean
public DefaultMQPushConsumer defaultConsumer() {
log.info("defaultConsumer 正在创建---------------------------------------");
DefaultMQPushConsumer consumer = new DefaultMQPushConsumer(groupName);
consumer.setNamesrvAddr(namesrvAddr);
consumer.setConsumeThreadMin(consumeThreadMin);
consumer.setConsumeThreadMax(consumeThreadMax);
consumer.setConsumeMessageBatchMaxSize(consumeMessageBatchMaxSize);
// 设置监听
consumer.registerMessageListener(listenerProcessor);
/**
* 设置consumer第一次启动是从队列头部开始还是队列尾部开始
* 如果不是第一次启动,那么按照上次消费的位置继续消费
*/
consumer.setConsumeFromWhere(ConsumeFromWhere.CONSUME_FROM_FIRST_OFFSET);
/**
* 设置消费模型,集群还是广播,默认为集群
*/
// consumer.setMessageModel(MessageModel.CLUSTERING);
try {
consumer.subscribe(topic, "${getSubscribeTags()}");
consumer.start();
log.info("rocketmq consumer 创建成功 groupName={}, topics={}, namesrvAddr={}", groupName, topic, namesrvAddr);
} catch (MQClientException e) {
log.error("rocketmq consumer 创建失败!" + e);
}
return consumer;
}
}
</#if>
<#function getSubscribeTags>
<#assign result="">
<#list sys.getAllPSDataEntities() as dataEntity>
<#if dataEntity.getAllPSDEDataSyncs?? && dataEntity.getAllPSDEDataSyncs()??>
<#list dataEntity.getAllPSDEDataSyncs() as dataSync>
<#if dataSync.getInPSSysDataSyncAgent?? && dataSync.getInPSSysDataSyncAgent()??>
<#if result!="">
<#assign result=result+" || ">
</#if>
<#assign result=result+dataSync.codeName?lower_case>
</#if>
</#list>
</#if>
</#list>
<#return result>
</#function>
\ No newline at end of file
<#ibiztemplate>
TARGET=PSSYSTEM
</#ibiztemplate>
<#assign hasMQConsumer=false>
<#comment>实体中配置输入数据同步</#comment>
<#list sys.getAllPSDataEntities() as dataEntity>
<#if dataEntity.getAllPSDEDataSyncs?? && dataEntity.getAllPSDEDataSyncs()??>
<#list dataEntity.getAllPSDEDataSyncs() as dataSync>
<#if dataSync.getInPSSysDataSyncAgent?? && dataSync.getInPSSysDataSyncAgent()??>
<#assign hasMQConsumer=true>
<#break >
</#if>
</#list>
</#if>
</#list>
<#if hasMQConsumer>
<#comment>服务接口微服务平台配置</#comment>
<#assign mqServerAddress="">
<#if sys.getAllPSDevSlnMSDepAPIs()??>
<#list sys.getAllPSDevSlnMSDepAPIs() as depSysApi>
<#if depSysApi.getPSDCMSPlatform()?? >
<#if depSysApi.getUserParam("rocketmq.consumer.namesrvAddr","")??>
<#assign mqServerAddress = depSysApi.getUserParam("rocketmq.consumer.namesrvAddr","")>
</#if>
</#if>
</#list>
</#if>
<#if mqServerAddress!=''>
<#assign mqServer="on">
<#else>
<#assign mqServer="off">
</#if>
package ${pub.getPKGCodeName()}.core.util.config;
import lombok.extern.slf4j.Slf4j;
import com.alibaba.fastjson.JSON;
import org.apache.rocketmq.client.consumer.listener.ConsumeOrderlyContext;
import org.apache.rocketmq.client.consumer.listener.ConsumeOrderlyStatus;
import org.apache.rocketmq.client.consumer.listener.MessageListenerOrderly;
import org.springframework.boot.autoconfigure.condition.ConditionalOnExpression;
import org.apache.rocketmq.common.message.MessageExt;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Lazy;
import org.springframework.stereotype.Component;
import org.springframework.util.CollectionUtils;
import java.util.List;
/**
* MQ订阅消息处理
*/
@Slf4j
@Component
@ConditionalOnExpression("'${r'${rocketmq.consumer.isOnOff:'+mqServer+"}'.equals('on')"}")
public class RocketMQListenerProcessor implements MessageListenerOrderly {
<#list sys.getAllPSDataEntities() as dataEntity>
<#if dataEntity.getAllPSDEDataSyncs?? && dataEntity.getAllPSDEDataSyncs()??>
<#list dataEntity.getAllPSDEDataSyncs() as dataSync>
<#if dataSync.getInPSSysDataSyncAgent?? && dataSync.getInPSSysDataSyncAgent()?? &&dataSync.getInTestPSDEAction?? && dataSync.getInTestPSDEAction()??>
<#assign entityName=dataEntity.getCodeName()>
<#if !P.exists(entityName,"service")>
@Autowired
@Lazy
${pub.getPKGCodeName()}.core.${dataEntity.getPSSystemModule().getCodeName()?lower_case}.service.I${entityName}Service ${entityName}Service;
</#if>
</#if>
</#list>
</#if>
</#list>
@Override
public ConsumeOrderlyStatus consumeMessage(List<MessageExt> list, ConsumeOrderlyContext consumeOrderlyContext) {
if (CollectionUtils.isEmpty(list)) {
log.info("MQ接收消息为空,直接返回成功");
return ConsumeOrderlyStatus.SUCCESS;
}
for (MessageExt messageExt : list) {
log.info("MQ接收到的消息为:" + messageExt.toString());
try {
String topic = messageExt.getTopic();
String tags = messageExt.getTags();
String body = new String(messageExt.getBody(), "utf-8");
log.info("MQ消息topic={}, tags={}, 消息内容={}", topic, tags, body);
<#list sys.getAllPSDataEntities() as dataEntity>
<#if dataEntity.getAllPSDEDataSyncs?? && dataEntity.getAllPSDEDataSyncs()??>
<#list dataEntity.getAllPSDEDataSyncs() as dataSync>
<#if dataSync.getInPSSysDataSyncAgent?? && dataSync.getInPSSysDataSyncAgent()??>
<#assign dataSyncCodeName=dataSync.codeName?lower_case>
<#if dataSync.getInTestPSDEAction?? && dataSync.getInTestPSDEAction()??>
<#assign inputAction=srfmethodname(dataSync.getInTestPSDEAction().codeName)>
if ("${dataSyncCodeName}".equalsIgnoreCase(tags)) {
${pub.getPKGCodeName()}.core.${dataEntity.getPSSystemModule().getCodeName()?lower_case}.domain.${entityName} domain = JSON.parseObject(new String(body),${pub.getPKGCodeName()}.core.${dataEntity.getPSSystemModule().getCodeName()?lower_case}.domain.${entityName}.class);
${entityName}Service.${inputAction}(domain);
}
<#else>
log.info("接收到[{}]消息,但未配置实体输入过滤行为,消息将被忽略。"+new String(msg.getBody()));
</#if>
</#if>
</#list>
</#if>
</#list>
} catch (Exception e) {
log.error("获取MQ消息内容异常{}", e);
}
}
return ConsumeOrderlyStatus.SUCCESS;
}
}
</#if>
\ No newline at end of file
<#ibiztemplate>
TARGET=PSSYSTEM
</#ibiztemplate>
<#assign hasMQProducer=false>
<#list sys.getAllPSDataEntities() as dataEntity>
<#if dataEntity.getAllPSDEDataSyncs?? && dataEntity.getAllPSDEDataSyncs()??>
<#list dataEntity.getAllPSDEDataSyncs() as dataSync>
<#if dataSync.getOutPSSysDataSyncAgent?? && dataSync.getOutPSSysDataSyncAgent()??>
<#assign hasMQProducer=true>
<#break >
</#if>
</#list>
</#if>
</#list>
<#if hasMQProducer>
<#comment>服务接口微服务平台配置</#comment>
<#assign mqServerAddress="">
<#if sys.getAllPSDevSlnMSDepAPIs()??>
<#list sys.getAllPSDevSlnMSDepAPIs() as depSysApi>
<#if depSysApi.getPSDCMSPlatform()?? >
<#if depSysApi.getUserParam("rocketmq.producer.namesrvAddr","")??>
<#assign mqServerAddress = depSysApi.getUserParam("rocketmq.producer.namesrvAddr","")>
</#if>
</#if>
</#list>
</#if>
<#if mqServerAddress!=''>
<#assign mqServer="on">
<#else>
<#assign mqServer="off">
</#if>
package ${pub.getPKGCodeName()}.core.util.config;
import lombok.extern.slf4j.Slf4j;
import org.apache.rocketmq.client.consumer.DefaultMQPushConsumer;
import org.apache.rocketmq.client.exception.MQClientException;
import org.apache.rocketmq.client.producer.DefaultMQProducer;
import org.apache.rocketmq.common.consumer.ConsumeFromWhere;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Lazy;
import org.springframework.boot.autoconfigure.condition.ConditionalOnExpression;
@Slf4j
@Configuration
@ConditionalOnExpression("'${r'${rocketmq.producer.isOnOff:'+mqServer+"}'.equals('on')"}")
public class RocketMQProducer {
@Value("${r'${rocketmq.producer.groupName:default}'}")
private String groupName;
@Value("${r'${rocketmq.producer.namesrvAddr:127.0.0.1:9876}'}")
private String namesrvAddr;
// 消息最大值
@Value("${r'${rocketmq.producer.maxMessageSize:409600}'}")
private Integer maxMessageSize;
// 消息发送超时时间
@Value("${r'${rocketmq.producer.sendMsgTimeOut:3000}'}")
private Integer sendMsgTimeOut;
// 失败重试次数
@Value("${r'${rocketmq.producer.retryTimesWhenSendFailed:2}'}")
private Integer retryTimesWhenSendFailed;
/**
* mq 生成者配置
*
* @return
* @throws MQClientException
*/
@Bean
public DefaultMQProducer defaultProducer() throws MQClientException {
log.info("rocketmq defaultProducer 正在创建---------------------------------------");
DefaultMQProducer producer = new DefaultMQProducer(groupName);
producer.setNamesrvAddr(namesrvAddr);
producer.setVipChannelEnabled(false);
producer.setMaxMessageSize(maxMessageSize);
producer.setSendMsgTimeout(sendMsgTimeOut);
producer.setRetryTimesWhenSendAsyncFailed(retryTimesWhenSendFailed);
producer.start();
log.info("rocketmq producer server 开启成功----------------------------------");
return producer;
}
}
</#if>
<#function getSubscribeTags>
<#assign result="">
<#list sys.getAllPSDataEntities() as dataEntity>
<#if dataEntity.getAllPSDEDataSyncs?? && dataEntity.getAllPSDEDataSyncs()??>
<#list dataEntity.getAllPSDEDataSyncs() as dataSync>
<#if dataSync.getInPSSysDataSyncAgent?? && dataSync.getInPSSysDataSyncAgent()??>
<#if result!="">
<#assign result=result+" || ">
</#if>
<#assign result=result+dataSync.codeName?lower_case>
</#if>
</#list>
</#if>
</#list>
<#return result>
</#function>
\ No newline at end of file
...@@ -52,15 +52,12 @@ TARGET=PSSYSTEM ...@@ -52,15 +52,12 @@ TARGET=PSSYSTEM
<spring-cloud-openfeign.version>2.2.1.RELEASE</spring-cloud-openfeign.version> <spring-cloud-openfeign.version>2.2.1.RELEASE</spring-cloud-openfeign.version>
<!-- Alibaba Druid --> <!-- Alibaba Druid -->
<alibaba-druid.version>1.1.16</alibaba-druid.version> <alibaba-druid.version>1.1.21</alibaba-druid.version>
<!-- Mybatis Plus --> <!-- Mybatis Plus -->
<mybatis-plus.version>3.3.1</mybatis-plus.version> <mybatis-plus.version>3.3.1</mybatis-plus.version>
<mybatis-plus-dynamic-datasource.version>3.0.0</mybatis-plus-dynamic-datasource.version> <mybatis-plus-dynamic-datasource.version>3.0.0</mybatis-plus-dynamic-datasource.version>
<!-- Liquibase -->
<liquibase.version>3.6.3</liquibase.version>
<!-- Swagger2 --> <!-- Swagger2 -->
<springfox-swagger.version>2.9.2</springfox-swagger.version> <springfox-swagger.version>2.9.2</springfox-swagger.version>
...@@ -87,7 +84,7 @@ TARGET=PSSYSTEM ...@@ -87,7 +84,7 @@ TARGET=PSSYSTEM
<jsonwebtoken-jjwt.version>0.9.1</jsonwebtoken-jjwt.version> <jsonwebtoken-jjwt.version>0.9.1</jsonwebtoken-jjwt.version>
<!--Liquibase数据库版本更新工具--> <!--Liquibase数据库版本更新工具-->
<liquibase.version>3.8.7</liquibase.version> <liquibase.version>3.9.0</liquibase.version>
<!--H2内存数据库--> <!--H2内存数据库-->
<h2.version>1.4.200</h2.version> <h2.version>1.4.200</h2.version>
...@@ -117,7 +114,7 @@ TARGET=PSSYSTEM ...@@ -117,7 +114,7 @@ TARGET=PSSYSTEM
<#list sys.getAllPSSystemDBConfigs() as dbConfig> <#list sys.getAllPSSystemDBConfigs() as dbConfig>
<#if dbConfig.getDBType()=='MYSQL5'> <#if dbConfig.getDBType()=='MYSQL5'>
<#elseif dbConfig.getDBType()=='ORACLE'> <#elseif dbConfig.getDBType()=='ORACLE'>
<oracle.version>11.2.0.3</oracle.version> <oracle.version>19.8.0.0</oracle.version>
<#elseif dbConfig.getDBType()=='POSTGRESQL'> <#elseif dbConfig.getDBType()=='POSTGRESQL'>
<postgresql.version>42.2.6</postgresql.version> <postgresql.version>42.2.6</postgresql.version>
</#if> </#if>
...@@ -339,13 +336,7 @@ TARGET=PSSYSTEM ...@@ -339,13 +336,7 @@ TARGET=PSSYSTEM
</exclusions> </exclusions>
</dependency> </dependency>
</#if> </#if>
<#if hasMQEntity>
<dependency>
<groupId>org.apache.rocketmq</groupId>
<artifactId>rocketmq-client</artifactId>
<version>${r'${rocketmq.version}'}</version>
</dependency>
</#if>
</dependencies> </dependencies>
</dependencyManagement> </dependencyManagement>
...@@ -418,8 +409,13 @@ TARGET=PSSYSTEM ...@@ -418,8 +409,13 @@ TARGET=PSSYSTEM
<#elseif dbConfig.getDBType()=='ORACLE'> <#elseif dbConfig.getDBType()=='ORACLE'>
<!-- Oracle驱动包 --> <!-- Oracle驱动包 -->
<dependency> <dependency>
<groupId>com.oracle</groupId> <groupId>com.oracle.database.jdbc</groupId>
<artifactId>ojdbc6</artifactId> <artifactId>ojdbc8</artifactId>
<version>${r'${oracle.version}'}</version>
</dependency>
<dependency>
<groupId>com.oracle.database.nls</groupId>
<artifactId>orai18n</artifactId>
<version>${r'${oracle.version}'}</version> <version>${r'${oracle.version}'}</version>
</dependency> </dependency>
<#elseif dbConfig.getDBType()=='POSTGRESQL'> <#elseif dbConfig.getDBType()=='POSTGRESQL'>
...@@ -432,7 +428,6 @@ TARGET=PSSYSTEM ...@@ -432,7 +428,6 @@ TARGET=PSSYSTEM
</#if> </#if>
</#list> </#list>
</#if> </#if>
<#if bDynamicDS> <#if bDynamicDS>
<!-- mp动态数据源 --> <!-- mp动态数据源 -->
<dependency> <dependency>
...@@ -440,13 +435,19 @@ TARGET=PSSYSTEM ...@@ -440,13 +435,19 @@ TARGET=PSSYSTEM
<artifactId>dynamic-datasource-spring-boot-starter</artifactId> <artifactId>dynamic-datasource-spring-boot-starter</artifactId>
</dependency> </dependency>
</#if> </#if>
<#if hasESEntity> <#if hasESEntity>
<dependency> <dependency>
<groupId>org.springframework.boot</groupId> <groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-elasticsearch</artifactId> <artifactId>spring-boot-starter-data-elasticsearch</artifactId>
</dependency> </dependency>
</#if> </#if>
<#if hasMQEntity>
<dependency>
<groupId>org.apache.rocketmq</groupId>
<artifactId>rocketmq-client</artifactId>
<version>${r'${rocketmq.version}'}</version>
</dependency>
</#if>
<#comment>引用组件包</#comment> <#comment>引用组件包</#comment>
<#if pub.getPSSysSFPubPkgs?? && pub.getPSSysSFPubPkgs()??> <#if pub.getPSSysSFPubPkgs?? && pub.getPSSysSFPubPkgs()??>
......
...@@ -110,6 +110,10 @@ services: ...@@ -110,6 +110,10 @@ services:
memory: 400M memory: 400M
mode: replicated mode: replicated
replicas: 1 replicas: 1
restart_policy:
condition: on-failure
max_attempts: 3
window: 120s
volumes: volumes:
- "nfs:/app/file" - "nfs:/app/file"
......
...@@ -145,6 +145,10 @@ public class ${itemCodeName}Resource { ...@@ -145,6 +145,10 @@ public class ${itemCodeName}Resource {
<#assign deaction = apiMethod.getPSDEAction()> <#assign deaction = apiMethod.getPSDEAction()>
<#assign deactionName = deaction.getName()> <#assign deactionName = deaction.getName()>
<#assign deactionCodeName = deaction.getCodeName()> <#assign deactionCodeName = deaction.getCodeName()>
<#assign apiReturnValueType=itemCodeName+"DTO">
<#if apiMethod.getReturnValueType()?? && apiMethod.getReturnValueType()?lower_case =='void' >
<#assign apiReturnValueType = "Void">
</#if>
<#comment>输出主接口测试行为</#comment> <#comment>输出主接口测试行为</#comment>
<@outputTestActionDetail deaction/> <@outputTestActionDetail deaction/>
<#if deaction.codeName?lower_case == 'create'> <#if deaction.codeName?lower_case == 'create'>
...@@ -252,7 +256,7 @@ public class ${itemCodeName}Resource { ...@@ -252,7 +256,7 @@ public class ${itemCodeName}Resource {
<@SecurityAnnotation deaction/> <@SecurityAnnotation deaction/>
@ApiOperation(value = "${deaction.getLogicName()}", tags = {"${deLogicName}" }, notes = "${deaction.getLogicName()}") @ApiOperation(value = "${deaction.getLogicName()}", tags = {"${deLogicName}" }, notes = "${deaction.getLogicName()}")
@RequestMapping(method = RequestMethod.${reqMtd}, value = "${fullPath}<#if deaction.getRequestParamType() == 'NONE'><#else>/{${itemCodeNameLC + keyCNLC}}</#if>/${deactionCodeName?lower_case}") @RequestMapping(method = RequestMethod.${reqMtd}, value = "${fullPath}<#if deaction.getRequestParamType() == 'NONE'><#else>/{${itemCodeNameLC + keyCNLC}}</#if>/${deactionCodeName?lower_case}")
public ResponseEntity<${itemCodeName}DTO> ${deactionCodeName?uncap_first}(<#if deaction.getRequestParamType() == 'NONE'><#else>${id_etParams}</#if>) { public ResponseEntity<${apiReturnValueType}> ${deactionCodeName?uncap_first}(<#if deaction.getRequestParamType() == 'NONE'><#else>${id_etParams}</#if>) {
<#if deaction.getRequestParamType() == 'NONE'> <#if deaction.getRequestParamType() == 'NONE'>
${deCodeName} domain =new ${deCodeName}(); ${deCodeName} domain =new ${deCodeName}();
domain = ${deCodeNameLC}Service.${srfmethodname(deactionCodeName)}(domain); domain = ${deCodeNameLC}Service.${srfmethodname(deactionCodeName)}(domain);
...@@ -263,7 +267,11 @@ public class ${itemCodeName}Resource { ...@@ -263,7 +267,11 @@ public class ${itemCodeName}Resource {
domain = ${deCodeNameLC}Service.${srfmethodname(deactionCodeName)}(domain); domain = ${deCodeNameLC}Service.${srfmethodname(deactionCodeName)}(domain);
${itemCodeNameLC}dto = ${itemCodeNameLC}Mapping.toDto(domain); ${itemCodeNameLC}dto = ${itemCodeNameLC}Mapping.toDto(domain);
</#if> </#if>
<#if apiReturnValueType?lower_case =='void'>
return ResponseEntity.status(HttpStatus.OK).build();
<#else>
return ResponseEntity.status(HttpStatus.OK).body(${itemCodeNameLC}dto); return ResponseEntity.status(HttpStatus.OK).body(${itemCodeNameLC}dto);
</#if>
} }
<#comment>自定义行为批处理</#comment> <#comment>自定义行为批处理</#comment>
<#if (deaction.getActionType()=='USERCUSTOM')> <#if (deaction.getActionType()=='USERCUSTOM')>
...@@ -433,6 +441,10 @@ public class ${itemCodeName}Resource { ...@@ -433,6 +441,10 @@ public class ${itemCodeName}Resource {
<#assign deaction = apiMethod.getPSDEAction()> <#assign deaction = apiMethod.getPSDEAction()>
<#assign deactionName = deaction.getName()> <#assign deactionName = deaction.getName()>
<#assign deactionCodeName = deaction.getCodeName()> <#assign deactionCodeName = deaction.getCodeName()>
<#assign apiReturnValueType=itemCodeName+"DTO">
<#if apiMethod.getReturnValueType()?? && apiMethod.getReturnValueType()?lower_case =='void' >
<#assign apiReturnValueType = "Void">
</#if>
<#comment>输出从接口测试行为</#comment> <#comment>输出从接口测试行为</#comment>
<@outputTestActionDetail2 deaction/> <@outputTestActionDetail2 deaction/>
<#if deaction.codeName?lower_case == 'create'> <#if deaction.codeName?lower_case == 'create'>
...@@ -597,7 +609,7 @@ public class ${itemCodeName}Resource { ...@@ -597,7 +609,7 @@ public class ${itemCodeName}Resource {
<@SecurityAnnotation deaction/> <@SecurityAnnotation deaction/>
@ApiOperation(value = "${byTagParams}${deLogicName}", tags = {"${deLogicName}" }, notes = "${byTagParams}${deLogicName}") @ApiOperation(value = "${byTagParams}${deLogicName}", tags = {"${deLogicName}" }, notes = "${byTagParams}${deLogicName}")
@RequestMapping(method = RequestMethod.${reqMtd}, value = "${fullPath}<#if deaction.getRequestParamType() == 'NONE'><#else>/{${itemCodeNameLC + keyCNLC}}</#if>/${deactionCodeName?lower_case}") @RequestMapping(method = RequestMethod.${reqMtd}, value = "${fullPath}<#if deaction.getRequestParamType() == 'NONE'><#else>/{${itemCodeNameLC + keyCNLC}}</#if>/${deactionCodeName?lower_case}")
public ResponseEntity<${itemCodeName}DTO> ${deactionCodeName?uncap_first}${byParams}(<#if deaction.getRequestParamType() == 'NONE'><#else>${id_etParams}</#if>) { public ResponseEntity<${apiReturnValueType}> ${deactionCodeName?uncap_first}${byParams}(<#if deaction.getRequestParamType() == 'NONE'><#else>${id_etParams}</#if>) {
<#if deaction.getRequestParamType() == 'NONE'> <#if deaction.getRequestParamType() == 'NONE'>
${deCodeName} domain =new ${deCodeName}(); ${deCodeName} domain =new ${deCodeName}();
domain = ${deCodeNameLC}Service.${srfmethodname(deactionCodeName)}(domain) ; domain = ${deCodeNameLC}Service.${srfmethodname(deactionCodeName)}(domain) ;
...@@ -608,7 +620,11 @@ public class ${itemCodeName}Resource { ...@@ -608,7 +620,11 @@ public class ${itemCodeName}Resource {
domain = ${deCodeNameLC}Service.${srfmethodname(deactionCodeName)}(domain) ; domain = ${deCodeNameLC}Service.${srfmethodname(deactionCodeName)}(domain) ;
${itemCodeNameLC}dto = ${itemCodeNameLC}Mapping.toDto(domain); ${itemCodeNameLC}dto = ${itemCodeNameLC}Mapping.toDto(domain);
</#if> </#if>
<#if apiReturnValueType?lower_case =='void'>
return ResponseEntity.status(HttpStatus.OK).build();
<#else>
return ResponseEntity.status(HttpStatus.OK).body(${itemCodeNameLC}dto); return ResponseEntity.status(HttpStatus.OK).body(${itemCodeNameLC}dto);
</#if>
} }
<#comment>自定义行为批处理</#comment> <#comment>自定义行为批处理</#comment>
<#if (deaction.getActionType()=='USERCUSTOM')> <#if (deaction.getActionType()=='USERCUSTOM')>
...@@ -1002,24 +1018,56 @@ public class ${itemCodeName}Resource { ...@@ -1002,24 +1018,56 @@ public class ${itemCodeName}Resource {
<#comment>用户自定义行为批处理-主实体关系</#comment> <#comment>用户自定义行为批处理-主实体关系</#comment>
<#macro customBatchAction deaction> <#macro customBatchAction deaction>
<#assign resultValueType="Boolean">
<#if apiReturnValueType?? && apiReturnValueType?lower_case=='void'>
<#assign resultValueType='Void'>
</#if>
<@SecurityAnnotation deaction/> <@SecurityAnnotation deaction/>
@ApiOperation(value = "批量处理[${deaction.getLogicName()}]", tags = {"${deLogicName}" }, notes = "批量处理[${deaction.getLogicName()}]") @ApiOperation(value = "批量处理[${deaction.getLogicName()}]", tags = {"${deLogicName}" }, notes = "批量处理[${deaction.getLogicName()}]")
@RequestMapping(method = RequestMethod.${reqMtd}, value = "${fullPath}<#if deaction.getRequestParamType() == 'NONE'><#else>/{${itemCodeNameLC + keyCNLC}}</#if>/${deactionCodeName?lower_case}batch") @RequestMapping(method = RequestMethod.${reqMtd}, value = "${fullPath}/${deactionCodeName?lower_case}batch")
public ResponseEntity<Boolean> ${deactionCodeName?uncap_first}Batch(${etParamsList}) { public ResponseEntity<${resultValueType}> ${deactionCodeName?uncap_first}Batch(<#if deaction.getRequestParamType() == 'NONE'><#else>${etParamsList}</#if>) {
return ResponseEntity.status(HttpStatus.OK).body(${deCodeNameLC}Service.${srfmethodname(deactionCodeName)}Batch(${itemCodeNameLC}Mapping.toDomain(${itemCodeNameLC}dtos))); <#if deaction.getRequestParamType() == 'NONE'>
List<${deCodeName}> domains = new ArrayList<${deCodeName}>();
boolean result = ${deCodeNameLC}Service.${srfmethodname(deactionCodeName)}Batch(domains);
<#else>
List<${deCodeName}> domains = ${itemCodeNameLC}Mapping.toDomain(${itemCodeNameLC}dtos);
boolean result = ${deCodeNameLC}Service.${srfmethodname(deactionCodeName)}Batch(domains);
</#if>
<#if resultValueType?lower_case =='void'>
return ResponseEntity.status(HttpStatus.OK).build();
<#else>
return ResponseEntity.status(HttpStatus.OK).body(result);
</#if>
} }
</#macro> </#macro>
<#comment>用户自定义行为批处理-从实体关系</#comment> <#comment>用户自定义行为批处理-从实体关系</#comment>
<#macro customBatchActionRS deaction> <#macro customBatchActionRS deaction>
<#assign resultValueType="Boolean">
<#if apiReturnValueType?? && apiReturnValueType?lower_case=='void'>
<#assign resultValueType='Void'>
</#if>
@ApiOperation(value = "批量处理[${byTagParams}${deLogicName}]", tags = {"${deLogicName}" }, notes = "批量处理[${byTagParams}${deLogicName}]") @ApiOperation(value = "批量处理[${byTagParams}${deLogicName}]", tags = {"${deLogicName}" }, notes = "批量处理[${byTagParams}${deLogicName}]")
@RequestMapping(method = RequestMethod.${reqMtd}, value = "${fullPath}<#if deaction.getRequestParamType() == 'NONE'><#else>/{${itemCodeNameLC + keyCNLC}}</#if>/${deactionCodeName?lower_case}batch") @RequestMapping(method = RequestMethod.${reqMtd}, value = "${fullPath}/${deactionCodeName?lower_case}batch")
public ResponseEntity<Boolean> ${deactionCodeName?uncap_first}${byParams}(${etParamsList}) { public ResponseEntity<${resultValueType}> ${deactionCodeName?uncap_first}${byParams}(<#if deaction.getRequestParamType() == 'NONE'><#else>${etParamsList}</#if>) {
return ResponseEntity.status(HttpStatus.OK).body(${deCodeNameLC}Service.${srfmethodname(deactionCodeName)}Batch(${itemCodeNameLC}Mapping.toDomain(${itemCodeNameLC}dtos))); <#if deaction.getRequestParamType() == 'NONE'>
List<${deCodeName}> domains = new ArrayList<${deCodeName}>();
boolean result = ${deCodeNameLC}Service.${srfmethodname(deactionCodeName)}Batch(domains);
<#else>
List<${deCodeName}> domains = ${itemCodeNameLC}Mapping.toDomain(${itemCodeNameLC}dtos);
boolean result = ${deCodeNameLC}Service.${srfmethodname(deactionCodeName)}Batch(domains);
</#if>
<#if resultValueType?lower_case =='void'>
return ResponseEntity.status(HttpStatus.OK).build();
<#else>
return ResponseEntity.status(HttpStatus.OK).body(result);
</#if>
} }
</#macro> </#macro>
<#ibiztemplate> <#ibiztemplate>
TARGET=PSSYSTEM TARGET=PSSYSTEM
</#ibiztemplate> </#ibiztemplate>
<#assign hasMQEntity=false> <#assign hasMQProducer=false>
<#list sys.getAllPSDataEntities() as dataEntity> <#list sys.getAllPSDataEntities() as dataEntity>
<#if dataEntity.getAllPSDEDataSyncs?? && dataEntity.getAllPSDEDataSyncs()??> <#if dataEntity.getAllPSDEDataSyncs?? && dataEntity.getAllPSDEDataSyncs()??>
<#list dataEntity.getAllPSDEDataSyncs() as dataSync> <#list dataEntity.getAllPSDEDataSyncs() as dataSync>
<#if dataSync.getOutPSSysDataSyncAgent?? && dataSync.getOutPSSysDataSyncAgent()??> <#if dataSync.getOutPSSysDataSyncAgent?? && dataSync.getOutPSSysDataSyncAgent()??>
<#assign hasMQEntity=true> <#assign hasMQProducer=true>
<#break> <#break>
</#if> </#if>
</#list> </#list>
</#if> </#if>
</#list> </#list>
<#if hasMQEntity> <#if hasMQProducer>
<#comment>服务接口微服务平台配置</#comment>
<#assign mqServerAddress="">
<#if sys.getAllPSDevSlnMSDepAPIs()??>
<#list sys.getAllPSDevSlnMSDepAPIs() as depSysApi>
<#if depSysApi.getPSDCMSPlatform()?? >
<#if depSysApi.getUserParam("rocketmq.producer.namesrvAddr","")??>
<#assign mqServerAddress = depSysApi.getUserParam("rocketmq.producer.namesrvAddr","")>
</#if>
</#if>
</#list>
</#if>
<#if mqServerAddress!=''>
<#assign mqServer="on">
<#else>
<#assign mqServer="off">
</#if>
package ${pub.getPKGCodeName()}.util.aspect; package ${pub.getPKGCodeName()}.util.aspect;
import com.alibaba.fastjson.JSON;
import com.alibaba.rocketmq.client.producer.DefaultMQProducer;
import com.alibaba.rocketmq.common.message.Message;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import ${pub.getPKGCodeName()}.util.domain.EntityBase; import ${pub.getPKGCodeName()}.util.domain.EntityBase;
import com.alibaba.fastjson.JSON;
import org.apache.rocketmq.client.producer.DefaultMQProducer;
import org.apache.rocketmq.client.producer.SendResult;
import org.apache.rocketmq.common.message.Message;
import org.aspectj.lang.JoinPoint; import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.AfterReturning; import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.Aspect; import org.aspectj.lang.annotation.Aspect;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Lazy; import org.springframework.context.annotation.Lazy;
import org.springframework.expression.EvaluationContext; import org.springframework.expression.EvaluationContext;
import org.springframework.expression.Expression; import org.springframework.expression.Expression;
import org.springframework.expression.ExpressionParser; import org.springframework.expression.ExpressionParser;
import org.springframework.expression.spel.standard.SpelExpressionParser; import org.springframework.expression.spel.standard.SpelExpressionParser;
import org.springframework.expression.spel.support.StandardEvaluationContext; import org.springframework.expression.spel.support.StandardEvaluationContext;
import org.springframework.boot.autoconfigure.condition.ConditionalOnExpression;
import org.springframework.scheduling.annotation.Async; import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import org.springframework.util.ObjectUtils; import org.springframework.util.ObjectUtils;
...@@ -40,31 +58,34 @@ import java.util.List; ...@@ -40,31 +58,34 @@ import java.util.List;
/** /**
* rocketMQ消息切面 * rocketMQ消息切面
*/ */
@Slf4j
@Aspect @Aspect
@Component @Component
@Slf4j @ConditionalOnExpression("'${r'${rocketmq.producer.isOnOff:'+mqServer+"}'.equals('on')"}")
public class RocketMQAspect public class RocketMQAspect
{ {
private final ExpressionParser parser = new SpelExpressionParser(); private final ExpressionParser parser = new SpelExpressionParser();
@Autowired
@Lazy
DefaultMQProducer defaultMQProducer;
@Value("${r'${rocketmq.producer.topic:default}'}")
private String topic;
<#list sys.getAllPSDataEntities() as dataEntity> <#list sys.getAllPSDataEntities() as dataEntity>
<#if dataEntity.getAllPSDEDataSyncs?? && dataEntity.getAllPSDEDataSyncs()??> <#if dataEntity.getAllPSDEDataSyncs?? && dataEntity.getAllPSDEDataSyncs()??>
<#list dataEntity.getAllPSDEDataSyncs() as dataSync> <#list dataEntity.getAllPSDEDataSyncs() as dataSync>
<#if dataSync.getOutPSSysDataSyncAgent?? && dataSync.getOutPSSysDataSyncAgent()??> <#if dataSync.getOutPSSysDataSyncAgent?? && dataSync.getOutPSSysDataSyncAgent()??>
<#assign syncAgent=dataSync.getOutPSSysDataSyncAgent()> <#assign producer=dataEntity.codeName+dataSync.codeName>
<#assign producer=dataEntity.codeName+syncAgent.codeName+"producer"> @AfterReturning(value = "${getPointCut(dataEntity,dataSync)}")
@Autowired
@Qualifier("${producer}")
@Lazy
DefaultMQProducer ${producer};
@AfterReturning(value = "(execution(* ${pub.getPKGCodeName()}.core.*.service.*${dataEntity.codeName}*.create*(..))||execution(* ${pub.getPKGCodeName()}.core.*.service.*${dataEntity.codeName}*.update*(..))||execution(* ${pub.getPKGCodeName()}.core.*.service.*${dataEntity.codeName}*.save*(..)) ||execution(* ${pub.getPKGCodeName()}.core.*.service.*${dataEntity.codeName}*.remove*(..))) && !execution(* ${pub.getPKGCodeName()}.core.es.service.*.create*(..)) && !execution(* ${pub.getPKGCodeName()}.core.es.service.*.update*(..)) && !execution(* ${pub.getPKGCodeName()}.core.es.service.*.save*(..)) && !execution(* ${pub.getPKGCodeName()}.core.es.service.*.remove*(..))")
@Async @Async
public void ${srfmethodname(producer)}(JoinPoint point) { public void ${srfmethodname(producer)}(JoinPoint point) {
<#if dataSync.getOutTestPSDEAction?? && dataSync.getOutTestPSDEAction()??> <#if dataSync.getOutTestPSDEAction?? && dataSync.getOutTestPSDEAction()??>
<#assign actionName=srfmethodname(dataSync.getOutTestPSDEAction().codeName)> <#assign actionName=srfmethodname(dataSync.getOutTestPSDEAction().codeName)>
outputAction(point, "${actionName}"); outputAction(point, "${actionName}");
</#if> </#if>
sendMsg(${producer}, "${dataSync.codeName}", "${dataSync.codeName}", getEntity(point)); sendMsg(topic, "${dataSync.codeName?lower_case}", getEntity(point));
} }
</#if> </#if>
</#list> </#list>
...@@ -113,24 +134,53 @@ public class RocketMQAspect ...@@ -113,24 +134,53 @@ public class RocketMQAspect
/** /**
* 发送消息 * 发送消息
* @param producer
* @param topic * @param topic
* @param tag * @param tag
* @param body * @param body
*/ */
private void sendMsg(DefaultMQProducer producer, String topic, String tag, Object body) { private void sendMsg(String topic, String tag, Object body) {
if(ObjectUtils.isEmpty(body)) { if(ObjectUtils.isEmpty(body)) {
log.error("发送消息失败,无法获取到要发送的消息内容!"); log.error("消息内容为空,[{}]消息将被忽略!",tag);
return; return;
} }
try { try {
producer.start();
Message message = new Message(topic, tag, JSON.toJSONString(body).getBytes()); Message message = new Message(topic, tag, JSON.toJSONString(body).getBytes());
producer.send(message); SendResult sendResult = defaultMQProducer.send(message);
producer.shutdown(); log.info("消息发送响应:" + sendResult.toString());
} catch (Exception e) { } catch (Exception e) {
log.error("消息发送异常,"+e); log.error("消息发送异常,"+e);
} }
} }
} }
</#if> </#if>
\ No newline at end of file
<#comment>输出切点</#comment>
<#function getPointCut dataEntity dataSync>
<#comment>数值代码表 1=新建; 2=编辑; 4=删除</#comment>
<#assign createArray = [1,3,5,7]>
<#assign updateArray = [2,3,6,7]>
<#assign deleteArray=[4,5,6,7]>
<#assign result="">
<#if dataSync.getEventType?? && dataSync.getEventType()??>
<#assign type=dataSync.getEventType()>
<#assign isCreate=createArray?seq_contains(type)>
<#assign isUpdate=updateArray?seq_contains(type)>
<#assign isDelete=deleteArray?seq_contains(type)>
<#if isCreate>
<#assign result="execution(* "+pub.getPKGCodeName()+".core.*.service.*"+dataEntity.codeName+"*.create*(..))">
</#if>
<#if isUpdate>
<#if result!="">
<#assign result=result+"||">
</#if>
<#assign result=result+"execution(* "+pub.getPKGCodeName()+".core.*.service.*"+dataEntity.codeName+"*.update*(..))">
</#if>
<#if isDelete>
<#if result!="">
<#assign result=result+"||">
</#if>
<#assign result=result+"execution(* "+pub.getPKGCodeName()+".core.*.service.*"+dataEntity.codeName+"*.remove*(..))">
</#if>
</#if>
<#return "("+result+")">
</#function>
\ No newline at end of file
...@@ -43,6 +43,7 @@ import org.springframework.boot.ApplicationRunner; ...@@ -43,6 +43,7 @@ import org.springframework.boot.ApplicationRunner;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.context.annotation.Lazy; import org.springframework.context.annotation.Lazy;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import org.springframework.util.ObjectUtils;
import org.springframework.util.DigestUtils; import org.springframework.util.DigestUtils;
import java.io.InputStream; import java.io.InputStream;
import java.util.*; import java.util.*;
...@@ -55,119 +56,132 @@ import java.util.*; ...@@ -55,119 +56,132 @@ import java.util.*;
@ConditionalOnProperty( name = "ibiz.enablePermissionValid", havingValue = "true") @ConditionalOnProperty( name = "ibiz.enablePermissionValid", havingValue = "true")
public class PermissionSyncJob implements ApplicationRunner { public class PermissionSyncJob implements ApplicationRunner {
@Autowired
@Lazy
private IBZUAAFeignClient client;
@Value("${r'$'}{ibiz.systemid:${sid}}") @Value("${r'$'}{ibiz.systemid:${sid}}")
private String systemId; private String systemId;
@Value("${r'$'}{ibiz.systemname:${sname}}") @Value("${r'$'}{ibiz.systemname:${sname}}")
private String systemName; private String systemName;
<#if hasWF>
@Autowired @Autowired
@Lazy @Lazy
private ${pub.getPKGCodeName()}.util.client.IBZWFFeignClient client2; private IBZUAAFeignClient uaaClient;
</#if>
<#if hasMsgTemplate>
@Autowired @Autowired
@Lazy @Lazy
private ${pub.getPKGCodeName()}.util.client.IBZNotifyFeignClient notifyFeignClient; IBZLiteFeignClient liteClient;
</#if> <#if hasWF>
@Autowired @Autowired
@Lazy @Lazy
IBZLiteFeignClient liteFeignClient; private ${pub.getPKGCodeName()}.util.client.IBZWFFeignClient wfClient;
</#if>
<#if hasMsgTemplate>
@Autowired
@Lazy
private ${pub.getPKGCodeName()}.util.client.IBZNotifyFeignClient notifyClient;
</#if>
<#if hasPredefinedCodeList> <#if hasPredefinedCodeList>
@Autowired @Autowired
@Lazy @Lazy
${pub.getPKGCodeName()}.util.client.IBZDictFeignClient dictFeignClient; ${pub.getPKGCodeName()}.util.client.IBZDictFeignClient dictClient;
</#if> </#if>
@Override @Override
public void run(ApplicationArguments args) { public void run(ApplicationArguments args) {
try { try {
Thread.sleep(10000); Thread.sleep(10000);
InputStream permission = this.getClass().getResourceAsStream("/permission/systemResource.json"); //获取当前系统所有实体资源能力 InputStream permission = this.getClass().getResourceAsStream("/permission/systemResource.json"); //权限资源
String permissionResult = IOUtils.toString(permission,"UTF-8"); if (!ObjectUtils.isEmpty(permission)) {
JSONObject system= new JSONObject(); String strPermission = IOUtils.toString(permission, "UTF-8");
system.put("pssystemid",systemId); JSONObject system = new JSONObject() {{
system.put("pssystemname",systemName); put("pssystemid", systemId);
system.put("sysstructure",JSONObject.parseObject(permissionResult)); put("pssystemname", systemName);
system.put("md5check",DigestUtils.md5DigestAsHex(permissionResult.getBytes())); put("sysstructure", JSONObject.parseObject(strPermission));
if(client.syncSysAuthority(system)) { put("md5check", DigestUtils.md5DigestAsHex(strPermission.getBytes()));
log.info("向[UAA]同步系统资源成功"); }};
}else{ if (uaaClient.syncSysAuthority(system)) {
log.error("向[UAA]同步系统资源失败"); log.info("向[uaa]同步系统资源成功");
} else {
log.error("向[uaa]同步系统资源失败");
}
} }
} } catch (Exception ex) {
catch (Exception ex) { log.error("向[uaa]同步系统资源失败,请检查[uaa]服务是否正常运行! {}", ex.getMessage());
log.error(String.format("向[UAA]同步系统资源失败,请检查[UAA]服务是否正常! [%s]",ex));
} }
try { try {
InputStream sysModel = this.getClass().getResourceAsStream("/sysmodel/${sys.codeName}.json"); //获取当前系统所有实体资源能力 InputStream model = this.getClass().getResourceAsStream("/sysmodel/${sys.codeName}.json"); //系统模型
String strSysModel = IOUtils.toString(sysModel,"UTF-8"); if (!ObjectUtils.isEmpty(model)) {
if(liteFeignClient.syncSysModel(JSONObject.parseObject(strSysModel))) { String strModel = IOUtils.toString(model, "UTF-8");
log.info("向[lite]同步系统模型成功"); if (liteClient.syncSysModel(JSONObject.parseObject(strModel))) {
}else{ log.info("向[lite]同步模型成功");
log.error("向[lite]同步系统模型失败"); } else {
log.error("向[lite]同步模型失败");
}
} }
} catch (Exception ex) {
log.error("向[lite]同步系统模型失败,请检查[lite]服务是否正常运行! {}", ex.getMessage());
} }
catch (Exception ex) {
log.error(String.format("向[lite]同步系统模型失败,请检查[lite]服务是否正常! [%s]",ex));
}
<#if hasWF> <#if hasWF>
try{
List<Map<String,Object>> bpmnfiles = new ArrayList(); try {
List<Map<String, Object>> workflows = new ArrayList(); //工作流
<#list sys.getAllPSWorkflows() as wf> <#list sys.getAllPSWorkflows() as wf>
<#if wf.getPSWFVersions()??> <#if wf.getPSWFVersions()??>
<#list wf.getPSWFVersions() as wfvs> <#list wf.getPSWFVersions() as wfvs>
bpmnfiles.add(new HashMap<String,Object>(){{put("${wfvs.codeName}.bpmn",IOUtils.toString(this.getClass().getResourceAsStream("/workflow/${wfvs.codeName}.bpmn"),"UTF-8"));}}); if (!ObjectUtils.isEmpty(this.getClass().getResourceAsStream("/workflow/${wfvs.codeName}.bpmn"))) {
workflows.add(new HashMap<String, Object>() {{
put("${wfvs.codeName}.bpmn", IOUtils.toString(this.getClass().getResourceAsStream("/workflow/${wfvs.codeName}.bpmn"), "UTF-8"));
}});
}
</#list> </#list>
</#if> </#if>
</#list> </#list>
if(client2.deployBpmnFile(bpmnfiles)) { if (workflows.size() > 0) {
log.info("部署流程成功"); if (wfClient.deployBpmnFile(workflows)) {
}else{ log.info("向[wf]部署流程成功");
log.error("部署流程失败"); } else {
log.error("向[wf]部署流程失败");
}
} }
}catch(Exception ex) { } catch (Exception ex) {
log.error(String.format("部署流程失败,请检查[WF]服务是否正常! [%s]",ex)); log.error("向[wf]部署流程失败,请检查[wf]服务是否正常运行! {}", ex.getMessage());
} }
</#if> </#if>
<#if hasMsgTemplate> <#if hasMsgTemplate>
try { try {
InputStream msgTemplate = this.getClass().getResourceAsStream("/msgtempl/systemMsgTempl.json"); //获取当前系统所有实体资源能力 InputStream template = this.getClass().getResourceAsStream("/msgtempl/systemMsgTempl.json"); //消息模板
String strMsgTemplate = IOUtils.toString(msgTemplate,"UTF-8"); if (!ObjectUtils.isEmpty(template)) {
JSONObject template = new JSONObject(); String strTemplate = IOUtils.toString(template, "UTF-8");
template.put("template", JSONArray.parseArray(strMsgTemplate)); if (notifyClient.createMsgTemplate(new JSONObject() {{
if(notifyFeignClient.createMsgTemplate(template)) { put("template", JSONArray.parseArray(strTemplate));
log.info("推送消息模板成功"); }})) {
}else{ log.info("向[notify]同步消息模板成功");
log.error("推送消息模板失败"); } else {
log.error("向[notify]同步消息模板失败");
}
} }
} catch (Exception e) { } catch (Exception ex) {
log.error("推送消息模板失败"); log.error("向[notify]同步消息模板失败,请检查[notify]服务是否正常运行! {}", ex.getMessage());
} }
</#if> </#if>
<#if hasPredefinedCodeList> <#if hasPredefinedCodeList>
try { try {
InputStream runtimeDict = this.getClass().getResourceAsStream("/sysmodel/RuntimeDict.json"); //获取当前系统所有实体资源能力 InputStream dict = this.getClass().getResourceAsStream("/sysmodel/RuntimeDict.json"); //代码表
String strRuntimeDict = IOUtils.toString(runtimeDict,"UTF-8"); if (!ObjectUtils.isEmpty(dict)) {
if(dictFeignClient.syncRuntimeDict(JSONArray.parseArray(strRuntimeDict))) { String strDict = IOUtils.toString(dict, "UTF-8");
log.info("推送系统预置代码表成功"); if (dictClient.syncRuntimeDict(JSONArray.parseArray(strDict))) {
}else{ log.info("向[dict]同步代码表成功");
log.error("推送系统预置代码表失败"); } else {
log.error("向[dict]同步代码表失败");
}
} }
} catch (Exception e) { } catch (Exception ex) {
log.error("推送系统预置代码表失败"); log.error("向[dict]同步代码表失败,请检查[dict]服务是否正常运行! {}", ex.getMessage());
} }
</#if> </#if>
} }
......
...@@ -12,6 +12,8 @@ TARGET=PSSYSTEM ...@@ -12,6 +12,8 @@ TARGET=PSSYSTEM
<#assign bDynamicDS=false> <#assign bDynamicDS=false>
<#assign bmogo=false> <#assign bmogo=false>
<#assign mongodbUri="mongodb://"+sys.name+":"+sys.name+"@127.0.0.1:27017/"+sys.name> <#assign mongodbUri="mongodb://"+sys.name+":"+sys.name+"@127.0.0.1:27017/"+sys.name>
<#assign hasMQProducer=false>
<#assign hasMQConsumer=false>
<#if sys.getAllPSDataEntities()??> <#if sys.getAllPSDataEntities()??>
<#list sys.getAllPSDataEntities() as de> <#list sys.getAllPSDataEntities() as de>
<#if de.getStorageMode()?? && de.getStorageMode()==2> <#if de.getStorageMode()?? && de.getStorageMode()==2>
...@@ -323,6 +325,64 @@ seata: ...@@ -323,6 +325,64 @@ seata:
password: "${nacosPassWord}" #密码 password: "${nacosPassWord}" #密码
</#if> </#if>
<#assign producerMQServer="127.0.0.1:9876">
<#assign consumerMQServer="127.0.0.1:9876">
<#assign producerisOnOff="off">
<#assign consumerisOnOff="off">
<#assign producerGroupName="default">
<#assign consumerGroupName="default">
<#assign producerTopic="default">
<#assign consumerTopic="default">
<#if sys.getAllPSDevSlnMSDepAPIs()??>
<#list sys.getAllPSDevSlnMSDepAPIs() as depSysApi>
<#if depSysApi.getPSDCMSPlatform()?? >
<#if depSysApi.getUserParam("rocketmq.producer.namesrvAddr","")?? && depSysApi.getUserParam("rocketmq.producer.namesrvAddr","")!=''>
<#assign hasMQProducer=true>
<#assign producerMQServer=depSysApi.getUserParam("rocketmq.producer.namesrvAddr","")>
<#if depSysApi.getUserParam("rocketmq.producer.isOnOff","")?? && depSysApi.getUserParam("rocketmq.producer.isOnOff","")!=''>
<#assign producerMQServer=depSysApi.getUserParam("rocketmq.producer.isOnOff","")>
</#if>
<#if depSysApi.getUserParam("rocketmq.producer.groupName","")?? && depSysApi.getUserParam("rocketmq.producer.groupName","")!=''>
<#assign producerGroupName=depSysApi.getUserParam("rocketmq.producer.groupName","")>
</#if>
<#if depSysApi.getUserParam("rocketmq.producer.topic","")?? && depSysApi.getUserParam("rocketmq.producer.topic","")!=''>
<#assign producerTopic=depSysApi.getUserParam("rocketmq.producer.topic","")>
</#if>
</#if>
<#if depSysApi.getUserParam("rocketmq.consumer.namesrvAddr","")?? && depSysApi.getUserParam("rocketmq.consumer.namesrvAddr","")!=''>
<#assign hasMQConsumer=true>
<#assign consumerMQServer=depSysApi.getUserParam("rocketmq.consumer.namesrvAddr","")>
<#if depSysApi.getUserParam("rocketmq.consumer.isOnOff","")?? && depSysApi.getUserParam("rocketmq.consumer.isOnOff","")!=''>
<#assign consumerisOnOff=depSysApi.getUserParam("rocketmq.consumer.isOnOff","")>
</#if>
<#if depSysApi.getUserParam("rocketmq.consumer.groupName","")?? && depSysApi.getUserParam("rocketmq.consumer.groupName","")!=''>
<#assign consumerGroupName=depSysApi.getUserParam("rocketmq.consumer.groupName","")>
</#if>
<#if depSysApi.getUserParam("rocketmq.consumer.topic","")?? && depSysApi.getUserParam("rocketmq.consumer.topic","")!=''>
<#assign consumerTopic=depSysApi.getUserParam("rocketmq.consumer.topic","")>
</#if>
</#if>
</#if>
</#list>
</#if>
<#if hasMQProducer ||hasMQConsumer>
rocketmq:
<#if hasMQProducer>
producer:
namesrvAddr: ${producerMQServer}
isOnOff: '${producerisOnOff}'
groupName: ${producerGroupName}
topic: ${producerTopic}
</#if>
<#if hasMQConsumer>
consumer:
namesrvAddr: ${consumerMQServer}
isOnOff: '${consumerisOnOff}'
groupName: ${consumerGroupName}
topic: ${consumerTopic}
</#if>
</#if>
<#macro singleDatasourceConfig> <#macro singleDatasourceConfig>
datasource: datasource:
username: ${dbUserName} username: ${dbUserName}
......
Markdown 格式
0% or
您添加了 0 到此讨论。请谨慎行事。
先完成此消息的编辑!
想要评论请 注册