Merge branch 'opengoofy:develop' into develop

pull/440/head
lucky 8 3 years ago committed by GitHub
commit c968828d67
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

@ -0,0 +1,83 @@
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package cn.hippo4j.common.toolkit;
import lombok.AccessLevel;
import lombok.NoArgsConstructor;
import java.util.concurrent.ConcurrentHashMap;
import java.util.function.Supplier;
/**
* Singleton object container.
*/
@NoArgsConstructor(access = AccessLevel.PRIVATE)
public final class Singleton {
private static final ConcurrentHashMap<String, Object> SINGLE_OBJECT_POOL = new ConcurrentHashMap();
/**
* Get a singleton object by key.
*
* @param key
* @param <T>
* @return
*/
public static <T> T get(String key) {
Object result = SINGLE_OBJECT_POOL.get(key);
return result == null ? null : (T) result;
}
/**
* Get a singleton object by key.
*
* <p> When empty, build a singleton object through supplier and put it into the container.
*
* @param key
* @param supplier
* @param <T>
* @return
*/
public static <T> T get(String key, Supplier<T> supplier) {
Object result = SINGLE_OBJECT_POOL.get(key);
if (result == null && (result = supplier.get()) != null) {
SINGLE_OBJECT_POOL.put(key, result);
}
return result != null ? (T) result : null;
}
/**
* Object into container.
*
* @param value
*/
public static void put(Object value) {
put(value.getClass().getName(), value);
}
/**
* Object into container.
*
* @param key
* @param value
*/
public static void put(String key, Object value) {
SINGLE_OBJECT_POOL.put(key, value);
}
}

@ -30,23 +30,27 @@ import lombok.Data;
public class ItemQueryReqDTO extends Page {
/**
* tenantId
* Tenant id
*/
private String tenantId;
/**
* itemId
* Item id
*/
private String itemId;
/**
* itemName
* Item name
*/
private String itemName;
/**
* owner
* Owner
*/
private String owner;
/**
* Desc
*/
private Boolean desc;
}

@ -30,18 +30,22 @@ import lombok.Data;
public class TenantQueryReqDTO extends Page {
/**
* tenantId
* Tenant id
*/
private String tenantId;
/**
* tenantName
* Tenant name
*/
private String tenantName;
/**
* owner
* Owner
*/
private String owner;
/**
* Desc
*/
private Boolean desc;
}

@ -61,8 +61,8 @@ public class ItemServiceImpl implements ItemService {
.eq(!StringUtils.isEmpty(reqDTO.getItemId()), ItemInfo::getItemId, reqDTO.getItemId())
.eq(!StringUtils.isEmpty(reqDTO.getItemName()), ItemInfo::getItemName, reqDTO.getItemName())
.eq(!StringUtils.isEmpty(reqDTO.getTenantId()), ItemInfo::getTenantId, reqDTO.getTenantId())
.eq(!StringUtils.isEmpty(reqDTO.getOwner()), ItemInfo::getOwner, reqDTO.getOwner());
.eq(!StringUtils.isEmpty(reqDTO.getOwner()), ItemInfo::getOwner, reqDTO.getOwner())
.orderByDesc(reqDTO.getDesc() != null, ItemInfo::getGmtCreate);
Page<ItemInfo> resultPage = itemInfoMapper.selectPage(reqDTO, wrapper);
return resultPage.convert(each -> BeanUtil.convert(each, ItemRespDTO.class));
}

@ -66,7 +66,6 @@ public class TenantServiceImpl implements TenantService {
public TenantRespDTO getTenantByTenantId(String tenantId) {
LambdaQueryWrapper<TenantInfo> queryWrapper = Wrappers
.lambdaQuery(TenantInfo.class).eq(TenantInfo::getTenantId, tenantId);
TenantInfo tenantInfo = tenantInfoMapper.selectOne(queryWrapper);
TenantRespDTO result = BeanUtil.convert(tenantInfo, TenantRespDTO.class);
return result;
@ -77,8 +76,8 @@ public class TenantServiceImpl implements TenantService {
LambdaQueryWrapper<TenantInfo> wrapper = Wrappers.lambdaQuery(TenantInfo.class)
.eq(!StringUtils.isEmpty(reqDTO.getTenantId()), TenantInfo::getTenantId, reqDTO.getTenantId())
.eq(!StringUtils.isEmpty(reqDTO.getTenantName()), TenantInfo::getTenantName, reqDTO.getTenantName())
.eq(!StringUtils.isEmpty(reqDTO.getOwner()), TenantInfo::getOwner, reqDTO.getOwner());
.eq(!StringUtils.isEmpty(reqDTO.getOwner()), TenantInfo::getOwner, reqDTO.getOwner())
.orderByDesc(reqDTO.getDesc() != null, TenantInfo::getGmtCreate);
Page resultPage = tenantInfoMapper.selectPage(reqDTO, wrapper);
return resultPage.convert(each -> BeanUtil.convert(each, TenantRespDTO.class));
}
@ -87,8 +86,7 @@ public class TenantServiceImpl implements TenantService {
public void saveTenant(TenantSaveReqDTO reqDTO) {
LambdaQueryWrapper<TenantInfo> queryWrapper = Wrappers.lambdaQuery(TenantInfo.class)
.eq(TenantInfo::getTenantId, reqDTO.getTenantId());
// 当前为单体应用, 后续支持集群部署时切换分布式锁.
// Currently it is a single application, and it supports switching distributed locks during cluster deployment in the future.
synchronized (TenantService.class) {
TenantInfo existTenantInfo = tenantInfoMapper.selectOne(queryWrapper);
Assert.isNull(existTenantInfo, "租户配置已存在.");
@ -109,7 +107,6 @@ public class TenantServiceImpl implements TenantService {
TenantInfo tenantInfo = BeanUtil.convert(reqDTO, TenantInfo.class);
int updateResult = tenantInfoMapper.update(tenantInfo, Wrappers
.lambdaUpdate(TenantInfo.class).eq(TenantInfo::getTenantId, reqDTO.getTenantId()));
boolean retBool = SqlHelper.retBool(updateResult);
if (!retBool) {
throw new RuntimeException("Update Error.");
@ -124,7 +121,6 @@ public class TenantServiceImpl implements TenantService {
if (CollectionUtils.isNotEmpty(itemList)) {
throw new RuntimeException("租户包含项目引用, 删除失败.");
}
int updateResult = tenantInfoMapper.update(new TenantInfo(),
Wrappers.lambdaUpdate(TenantInfo.class)
.eq(TenantInfo::getTenantId, tenantId)

File diff suppressed because one or more lines are too long

@ -1 +1 @@
.waves-ripple{position:absolute;border-radius:100%;background-color:rgba(0,0,0,.15);background-clip:padding-box;pointer-events:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-transform:scale(0);transform:scale(0);opacity:1}.waves-ripple.z-active{opacity:0;-webkit-transform:scale(2);transform:scale(2);-webkit-transition:opacity 1.2s ease-out,-webkit-transform .6s ease-out;transition:opacity 1.2s ease-out,-webkit-transform .6s ease-out;transition:opacity 1.2s ease-out,transform .6s ease-out;transition:opacity 1.2s ease-out,transform .6s ease-out,-webkit-transform .6s ease-out}.pagination-container[data-v-6af373ef]{background:#fff;padding:32px 16px}.pagination-container.hidden[data-v-6af373ef]{display:none}[data-v-17dbeafa]::-webkit-scrollbar{width:8px;height:8px}[data-v-17dbeafa]::-webkit-scrollbar-track{border-radius:5px;background:rgba(0,0,0,.06);-webkit-box-shadow:inset 0 0 5px rgba(0,0,0,.08)}[data-v-17dbeafa]::-webkit-scrollbar-thumb{border-radius:5px;background:rgba(0,0,0,.12);-webkit-box-shadow:inset 0 0 10px rgba(0,0,0,.2)}.stack-info[data-v-17dbeafa]{height:400px;overflow:auto}.stack-info>li[data-v-17dbeafa]{margin-bottom:24px}.stack-info>li p[data-v-17dbeafa]:first-child{color:#06f;font-weight:600;margin-top:10px}.stack-info>li ul[data-v-17dbeafa]{margin-left:30px}.stack-info>li ul li[data-v-17dbeafa]{color:#fc5531;text-align:justify;margin:10px auto}
.waves-ripple{position:absolute;border-radius:100%;background-color:rgba(0,0,0,.15);background-clip:padding-box;pointer-events:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-transform:scale(0);transform:scale(0);opacity:1}.waves-ripple.z-active{opacity:0;-webkit-transform:scale(2);transform:scale(2);-webkit-transition:opacity 1.2s ease-out,-webkit-transform .6s ease-out;transition:opacity 1.2s ease-out,-webkit-transform .6s ease-out;transition:opacity 1.2s ease-out,transform .6s ease-out;transition:opacity 1.2s ease-out,transform .6s ease-out,-webkit-transform .6s ease-out}.pagination-container[data-v-df7d1fa0]{background:#fff;padding:32px 16px}.pagination-container.hidden[data-v-df7d1fa0]{display:none}[data-v-4a957af4]::-webkit-scrollbar{width:8px;height:8px}[data-v-4a957af4]::-webkit-scrollbar-track{border-radius:5px;background:rgba(0,0,0,.06);-webkit-box-shadow:inset 0 0 5px rgba(0,0,0,.08)}[data-v-4a957af4]::-webkit-scrollbar-thumb{border-radius:5px;background:rgba(0,0,0,.12);-webkit-box-shadow:inset 0 0 10px rgba(0,0,0,.2)}.stack-info[data-v-4a957af4]{height:400px;overflow:auto}.stack-info>li[data-v-4a957af4]{margin-bottom:24px}.stack-info>li p[data-v-4a957af4]:first-child{color:#06f;font-weight:600;margin-top:10px}.stack-info>li ul[data-v-4a957af4]{margin-left:30px}.stack-info>li ul li[data-v-4a957af4]{color:#fc5531;text-align:justify;margin:10px auto}

@ -1 +1 @@
.waves-ripple{position:absolute;border-radius:100%;background-color:rgba(0,0,0,.15);background-clip:padding-box;pointer-events:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-transform:scale(0);transform:scale(0);opacity:1}.waves-ripple.z-active{opacity:0;-webkit-transform:scale(2);transform:scale(2);-webkit-transition:opacity 1.2s ease-out,-webkit-transform .6s ease-out;transition:opacity 1.2s ease-out,-webkit-transform .6s ease-out;transition:opacity 1.2s ease-out,transform .6s ease-out;transition:opacity 1.2s ease-out,transform .6s ease-out,-webkit-transform .6s ease-out}.pagination-container[data-v-6af373ef]{background:#fff;padding:32px 16px}.pagination-container.hidden[data-v-6af373ef]{display:none}
.waves-ripple{position:absolute;border-radius:100%;background-color:rgba(0,0,0,.15);background-clip:padding-box;pointer-events:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-transform:scale(0);transform:scale(0);opacity:1}.waves-ripple.z-active{opacity:0;-webkit-transform:scale(2);transform:scale(2);-webkit-transition:opacity 1.2s ease-out,-webkit-transform .6s ease-out;transition:opacity 1.2s ease-out,-webkit-transform .6s ease-out;transition:opacity 1.2s ease-out,transform .6s ease-out;transition:opacity 1.2s ease-out,transform .6s ease-out,-webkit-transform .6s ease-out}.pagination-container[data-v-df7d1fa0]{background:#fff;padding:32px 16px}.pagination-container.hidden[data-v-df7d1fa0]{display:none}

@ -0,0 +1 @@
.waves-ripple{position:absolute;border-radius:100%;background-color:rgba(0,0,0,.15);background-clip:padding-box;pointer-events:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-transform:scale(0);transform:scale(0);opacity:1}.waves-ripple.z-active{opacity:0;-webkit-transform:scale(2);transform:scale(2);-webkit-transition:opacity 1.2s ease-out,-webkit-transform .6s ease-out;transition:opacity 1.2s ease-out,-webkit-transform .6s ease-out;transition:opacity 1.2s ease-out,transform .6s ease-out;transition:opacity 1.2s ease-out,transform .6s ease-out,-webkit-transform .6s ease-out}

@ -1 +1 @@
.waves-ripple{position:absolute;border-radius:100%;background-color:rgba(0,0,0,.15);background-clip:padding-box;pointer-events:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-transform:scale(0);transform:scale(0);opacity:1}.waves-ripple.z-active{opacity:0;-webkit-transform:scale(2);transform:scale(2);-webkit-transition:opacity 1.2s ease-out,-webkit-transform .6s ease-out;transition:opacity 1.2s ease-out,-webkit-transform .6s ease-out;transition:opacity 1.2s ease-out,transform .6s ease-out;transition:opacity 1.2s ease-out,transform .6s ease-out,-webkit-transform .6s ease-out}.pagination-container[data-v-6af373ef]{background:#fff;padding:32px 16px}.pagination-container.hidden[data-v-6af373ef]{display:none}
.waves-ripple{position:absolute;border-radius:100%;background-color:rgba(0,0,0,.15);background-clip:padding-box;pointer-events:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-transform:scale(0);transform:scale(0);opacity:1}.waves-ripple.z-active{opacity:0;-webkit-transform:scale(2);transform:scale(2);-webkit-transition:opacity 1.2s ease-out,-webkit-transform .6s ease-out;transition:opacity 1.2s ease-out,-webkit-transform .6s ease-out;transition:opacity 1.2s ease-out,transform .6s ease-out;transition:opacity 1.2s ease-out,transform .6s ease-out,-webkit-transform .6s ease-out}.pagination-container[data-v-df7d1fa0]{background:#fff;padding:32px 16px}.pagination-container.hidden[data-v-df7d1fa0]{display:none}

@ -1 +0,0 @@
.waves-ripple{position:absolute;border-radius:100%;background-color:rgba(0,0,0,.15);background-clip:padding-box;pointer-events:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-transform:scale(0);transform:scale(0);opacity:1}.waves-ripple.z-active{opacity:0;-webkit-transform:scale(2);transform:scale(2);-webkit-transition:opacity 1.2s ease-out,-webkit-transform .6s ease-out;transition:opacity 1.2s ease-out,-webkit-transform .6s ease-out;transition:opacity 1.2s ease-out,transform .6s ease-out;transition:opacity 1.2s ease-out,transform .6s ease-out,-webkit-transform .6s ease-out}.pagination-container[data-v-6af373ef]{background:#fff;padding:32px 16px}.pagination-container.hidden[data-v-6af373ef]{display:none}.dashboard-editor-container[data-v-7cd58fea]{padding:32px;background-color:#f0f2f5;position:relative}.dashboard-editor-container .github-corner[data-v-7cd58fea]{position:absolute;top:0;border:0;right:0}.dashboard-editor-container .chart-wrapper[data-v-7cd58fea]{background:#fff;padding:16px 16px 0;margin-bottom:32px}@media(max-width:1024px){.chart-wrapper[data-v-7cd58fea]{padding:8px}}

@ -0,0 +1 @@
.waves-ripple{position:absolute;border-radius:100%;background-color:rgba(0,0,0,.15);background-clip:padding-box;pointer-events:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-transform:scale(0);transform:scale(0);opacity:1}.waves-ripple.z-active{opacity:0;-webkit-transform:scale(2);transform:scale(2);-webkit-transition:opacity 1.2s ease-out,-webkit-transform .6s ease-out;transition:opacity 1.2s ease-out,-webkit-transform .6s ease-out;transition:opacity 1.2s ease-out,transform .6s ease-out;transition:opacity 1.2s ease-out,transform .6s ease-out,-webkit-transform .6s ease-out}

@ -1 +1 @@
.github-corner:hover .octo-arm[data-v-fedac698]{-webkit-animation:octocat-wave-data-v-fedac698 .56s ease-in-out;animation:octocat-wave-data-v-fedac698 .56s ease-in-out}@-webkit-keyframes octocat-wave-data-v-fedac698{0%,to{-webkit-transform:rotate(0);transform:rotate(0)}20%,60%{-webkit-transform:rotate(-25deg);transform:rotate(-25deg)}40%,80%{-webkit-transform:rotate(10deg);transform:rotate(10deg)}}@keyframes octocat-wave-data-v-fedac698{0%,to{-webkit-transform:rotate(0);transform:rotate(0)}20%,60%{-webkit-transform:rotate(-25deg);transform:rotate(-25deg)}40%,80%{-webkit-transform:rotate(10deg);transform:rotate(10deg)}}@media (max-width:500px){.github-corner:hover .octo-arm[data-v-fedac698]{-webkit-animation:none;animation:none}.github-corner .octo-arm[data-v-fedac698]{-webkit-animation:octocat-wave-data-v-fedac698 .56s ease-in-out;animation:octocat-wave-data-v-fedac698 .56s ease-in-out}}.panel-group[data-v-787f9ab2]{margin-top:18px}.panel-group .card-panel-col[data-v-787f9ab2]{margin-bottom:32px}.panel-group .card-panel[data-v-787f9ab2]{height:108px;cursor:pointer;font-size:12px;position:relative;overflow:hidden;color:#666;background:#fff;-webkit-box-shadow:4px 4px 40px rgba(0,0,0,.05);box-shadow:4px 4px 40px rgba(0,0,0,.05);border-color:rgba(0,0,0,.05)}.panel-group .card-panel:hover .card-panel-icon-wrapper[data-v-787f9ab2]{color:#fff}.panel-group .card-panel:hover .icon-people[data-v-787f9ab2]{background:#dae8d6}.panel-group .card-panel:hover .icon-message[data-v-787f9ab2]{background:#36a3f7}.panel-group .card-panel:hover .icon-money[data-v-787f9ab2]{background:#a0a6f4}.panel-group .card-panel:hover .icon-shopping[data-v-787f9ab2]{background:#dae8d6}.panel-group .card-panel .icon-people[data-v-787f9ab2]{color:#40c9c6}.panel-group .card-panel .icon-message[data-v-787f9ab2]{color:#36a3f7}.panel-group .card-panel .icon-money[data-v-787f9ab2]{color:#a0a6f4}.panel-group .card-panel .icon-shopping[data-v-787f9ab2]{color:#34bfa3}.panel-group .card-panel .card-panel-icon-wrapper[data-v-787f9ab2]{float:left;margin:14px 0 0 14px;padding:16px;-webkit-transition:all .38s ease-out;transition:all .38s ease-out;border-radius:6px}.panel-group .card-panel .card-panel-icon[data-v-787f9ab2]{float:left;font-size:48px}.panel-group .card-panel .card-panel-description[data-v-787f9ab2]{float:right;font-weight:700;margin:26px;margin-left:0}.panel-group .card-panel .card-panel-description .card-panel-text[data-v-787f9ab2]{line-height:18px;color:rgba(0,0,0,.45);font-size:16px;margin-bottom:12px}.panel-group .card-panel .card-panel-description .card-panel-num[data-v-787f9ab2]{font-size:20px}@media(max-width:550px){.card-panel-description[data-v-787f9ab2]{display:none}.card-panel-icon-wrapper[data-v-787f9ab2]{float:none!important;width:100%;height:100%;margin:0!important}.card-panel-icon-wrapper .svg-icon[data-v-787f9ab2]{display:block;margin:14px auto!important;float:none!important}}.dashboard-editor-container[data-v-384bf764]{padding:32px;background-color:#f0f2f5;position:relative}.dashboard-editor-container .github-corner[data-v-384bf764]{position:absolute;top:0;border:0;right:0}.dashboard-editor-container .el-form-item[data-v-384bf764]{margin-bottom:5px!important;padding-bottom:20px}.dashboard-editor-container .chart-wrapper[data-v-384bf764]{background:#fff;padding:16px 16px 0;margin-bottom:32px}@media(max-width:1024px){.chart-wrapper[data-v-384bf764]{padding:8px}}
.github-corner:hover .octo-arm[data-v-fedac698]{-webkit-animation:octocat-wave-data-v-fedac698 .56s ease-in-out;animation:octocat-wave-data-v-fedac698 .56s ease-in-out}@-webkit-keyframes octocat-wave-data-v-fedac698{0%,to{-webkit-transform:rotate(0);transform:rotate(0)}20%,60%{-webkit-transform:rotate(-25deg);transform:rotate(-25deg)}40%,80%{-webkit-transform:rotate(10deg);transform:rotate(10deg)}}@keyframes octocat-wave-data-v-fedac698{0%,to{-webkit-transform:rotate(0);transform:rotate(0)}20%,60%{-webkit-transform:rotate(-25deg);transform:rotate(-25deg)}40%,80%{-webkit-transform:rotate(10deg);transform:rotate(10deg)}}@media (max-width:500px){.github-corner:hover .octo-arm[data-v-fedac698]{-webkit-animation:none;animation:none}.github-corner .octo-arm[data-v-fedac698]{-webkit-animation:octocat-wave-data-v-fedac698 .56s ease-in-out;animation:octocat-wave-data-v-fedac698 .56s ease-in-out}}.panel-group[data-v-787f9ab2]{margin-top:18px}.panel-group .card-panel-col[data-v-787f9ab2]{margin-bottom:32px}.panel-group .card-panel[data-v-787f9ab2]{height:108px;cursor:pointer;font-size:12px;position:relative;overflow:hidden;color:#666;background:#fff;-webkit-box-shadow:4px 4px 40px rgba(0,0,0,.05);box-shadow:4px 4px 40px rgba(0,0,0,.05);border-color:rgba(0,0,0,.05)}.panel-group .card-panel:hover .card-panel-icon-wrapper[data-v-787f9ab2]{color:#fff}.panel-group .card-panel:hover .icon-people[data-v-787f9ab2]{background:#dae8d6}.panel-group .card-panel:hover .icon-message[data-v-787f9ab2]{background:#36a3f7}.panel-group .card-panel:hover .icon-money[data-v-787f9ab2]{background:#a0a6f4}.panel-group .card-panel:hover .icon-shopping[data-v-787f9ab2]{background:#dae8d6}.panel-group .card-panel .icon-people[data-v-787f9ab2]{color:#40c9c6}.panel-group .card-panel .icon-message[data-v-787f9ab2]{color:#36a3f7}.panel-group .card-panel .icon-money[data-v-787f9ab2]{color:#a0a6f4}.panel-group .card-panel .icon-shopping[data-v-787f9ab2]{color:#34bfa3}.panel-group .card-panel .card-panel-icon-wrapper[data-v-787f9ab2]{float:left;margin:14px 0 0 14px;padding:16px;-webkit-transition:all .38s ease-out;transition:all .38s ease-out;border-radius:6px}.panel-group .card-panel .card-panel-icon[data-v-787f9ab2]{float:left;font-size:48px}.panel-group .card-panel .card-panel-description[data-v-787f9ab2]{float:right;font-weight:700;margin:26px;margin-left:0}.panel-group .card-panel .card-panel-description .card-panel-text[data-v-787f9ab2]{line-height:18px;color:rgba(0,0,0,.45);font-size:16px;margin-bottom:12px}.panel-group .card-panel .card-panel-description .card-panel-num[data-v-787f9ab2]{font-size:20px}@media(max-width:550px){.card-panel-description[data-v-787f9ab2]{display:none}.card-panel-icon-wrapper[data-v-787f9ab2]{float:none!important;width:100%;height:100%;margin:0!important}.card-panel-icon-wrapper .svg-icon[data-v-787f9ab2]{display:block;margin:14px auto!important;float:none!important}}.dashboard-editor-container[data-v-73ee0239]{padding:32px;background-color:#f0f2f5;position:relative}.dashboard-editor-container .github-corner[data-v-73ee0239]{position:absolute;top:0;border:0;right:0}.dashboard-editor-container .el-form-item[data-v-73ee0239]{margin-bottom:5px!important;padding-bottom:20px}.dashboard-editor-container .chart-wrapper[data-v-73ee0239]{background:#fff;padding:16px 16px 0;margin-bottom:32px}@media(max-width:1024px){.chart-wrapper[data-v-73ee0239]{padding:8px}}

@ -1 +1 @@
.waves-ripple{position:absolute;border-radius:100%;background-color:rgba(0,0,0,.15);background-clip:padding-box;pointer-events:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-transform:scale(0);transform:scale(0);opacity:1}.waves-ripple.z-active{opacity:0;-webkit-transform:scale(2);transform:scale(2);-webkit-transition:opacity 1.2s ease-out,-webkit-transform .6s ease-out;transition:opacity 1.2s ease-out,-webkit-transform .6s ease-out;transition:opacity 1.2s ease-out,transform .6s ease-out;transition:opacity 1.2s ease-out,transform .6s ease-out,-webkit-transform .6s ease-out}.pagination-container[data-v-6af373ef]{background:#fff;padding:32px 16px}.pagination-container.hidden[data-v-6af373ef]{display:none}
.waves-ripple{position:absolute;border-radius:100%;background-color:rgba(0,0,0,.15);background-clip:padding-box;pointer-events:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-transform:scale(0);transform:scale(0);opacity:1}.waves-ripple.z-active{opacity:0;-webkit-transform:scale(2);transform:scale(2);-webkit-transition:opacity 1.2s ease-out,-webkit-transform .6s ease-out;transition:opacity 1.2s ease-out,-webkit-transform .6s ease-out;transition:opacity 1.2s ease-out,transform .6s ease-out;transition:opacity 1.2s ease-out,transform .6s ease-out,-webkit-transform .6s ease-out}.pagination-container[data-v-df7d1fa0]{background:#fff;padding:32px 16px}.pagination-container.hidden[data-v-df7d1fa0]{display:none}

@ -1 +0,0 @@
.waves-ripple{position:absolute;border-radius:100%;background-color:rgba(0,0,0,.15);background-clip:padding-box;pointer-events:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-transform:scale(0);transform:scale(0);opacity:1}.waves-ripple.z-active{opacity:0;-webkit-transform:scale(2);transform:scale(2);-webkit-transition:opacity 1.2s ease-out,-webkit-transform .6s ease-out;transition:opacity 1.2s ease-out,-webkit-transform .6s ease-out;transition:opacity 1.2s ease-out,transform .6s ease-out;transition:opacity 1.2s ease-out,transform .6s ease-out,-webkit-transform .6s ease-out}.pagination-container[data-v-6af373ef]{background:#fff;padding:32px 16px}.pagination-container.hidden[data-v-6af373ef]{display:none}

@ -1 +0,0 @@
.waves-ripple{position:absolute;border-radius:100%;background-color:rgba(0,0,0,.15);background-clip:padding-box;pointer-events:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-transform:scale(0);transform:scale(0);opacity:1}.waves-ripple.z-active{opacity:0;-webkit-transform:scale(2);transform:scale(2);-webkit-transition:opacity 1.2s ease-out,-webkit-transform .6s ease-out;transition:opacity 1.2s ease-out,-webkit-transform .6s ease-out;transition:opacity 1.2s ease-out,transform .6s ease-out;transition:opacity 1.2s ease-out,transform .6s ease-out,-webkit-transform .6s ease-out}.pagination-container[data-v-6af373ef]{background:#fff;padding:32px 16px}.pagination-container.hidden[data-v-6af373ef]{display:none}

@ -0,0 +1 @@
.waves-ripple{position:absolute;border-radius:100%;background-color:rgba(0,0,0,.15);background-clip:padding-box;pointer-events:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-transform:scale(0);transform:scale(0);opacity:1}.waves-ripple.z-active{opacity:0;-webkit-transform:scale(2);transform:scale(2);-webkit-transition:opacity 1.2s ease-out,-webkit-transform .6s ease-out;transition:opacity 1.2s ease-out,-webkit-transform .6s ease-out;transition:opacity 1.2s ease-out,transform .6s ease-out;transition:opacity 1.2s ease-out,transform .6s ease-out,-webkit-transform .6s ease-out}

@ -0,0 +1 @@
.waves-ripple{position:absolute;border-radius:100%;background-color:rgba(0,0,0,.15);background-clip:padding-box;pointer-events:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-transform:scale(0);transform:scale(0);opacity:1}.waves-ripple.z-active{opacity:0;-webkit-transform:scale(2);transform:scale(2);-webkit-transition:opacity 1.2s ease-out,-webkit-transform .6s ease-out;transition:opacity 1.2s ease-out,-webkit-transform .6s ease-out;transition:opacity 1.2s ease-out,transform .6s ease-out;transition:opacity 1.2s ease-out,transform .6s ease-out,-webkit-transform .6s ease-out}

@ -1 +0,0 @@
.waves-ripple{position:absolute;border-radius:100%;background-color:rgba(0,0,0,.15);background-clip:padding-box;pointer-events:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-transform:scale(0);transform:scale(0);opacity:1}.waves-ripple.z-active{opacity:0;-webkit-transform:scale(2);transform:scale(2);-webkit-transition:opacity 1.2s ease-out,-webkit-transform .6s ease-out;transition:opacity 1.2s ease-out,-webkit-transform .6s ease-out;transition:opacity 1.2s ease-out,transform .6s ease-out;transition:opacity 1.2s ease-out,transform .6s ease-out,-webkit-transform .6s ease-out}.pagination-container[data-v-6af373ef]{background:#fff;padding:32px 16px}.pagination-container.hidden[data-v-6af373ef]{display:none}

@ -1 +1 @@
.waves-ripple{position:absolute;border-radius:100%;background-color:rgba(0,0,0,.15);background-clip:padding-box;pointer-events:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-transform:scale(0);transform:scale(0);opacity:1}.waves-ripple.z-active{opacity:0;-webkit-transform:scale(2);transform:scale(2);-webkit-transition:opacity 1.2s ease-out,-webkit-transform .6s ease-out;transition:opacity 1.2s ease-out,-webkit-transform .6s ease-out;transition:opacity 1.2s ease-out,transform .6s ease-out;transition:opacity 1.2s ease-out,transform .6s ease-out,-webkit-transform .6s ease-out}.pagination-container[data-v-6af373ef]{background:#fff;padding:32px 16px}.pagination-container.hidden[data-v-6af373ef]{display:none}
.waves-ripple{position:absolute;border-radius:100%;background-color:rgba(0,0,0,.15);background-clip:padding-box;pointer-events:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-transform:scale(0);transform:scale(0);opacity:1}.waves-ripple.z-active{opacity:0;-webkit-transform:scale(2);transform:scale(2);-webkit-transition:opacity 1.2s ease-out,-webkit-transform .6s ease-out;transition:opacity 1.2s ease-out,-webkit-transform .6s ease-out;transition:opacity 1.2s ease-out,transform .6s ease-out;transition:opacity 1.2s ease-out,transform .6s ease-out,-webkit-transform .6s ease-out}.pagination-container[data-v-df7d1fa0]{background:#fff;padding:32px 16px}.pagination-container.hidden[data-v-df7d1fa0]{display:none}

@ -0,0 +1 @@
.waves-ripple{position:absolute;border-radius:100%;background-color:rgba(0,0,0,.15);background-clip:padding-box;pointer-events:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-transform:scale(0);transform:scale(0);opacity:1}.waves-ripple.z-active{opacity:0;-webkit-transform:scale(2);transform:scale(2);-webkit-transition:opacity 1.2s ease-out,-webkit-transform .6s ease-out;transition:opacity 1.2s ease-out,-webkit-transform .6s ease-out;transition:opacity 1.2s ease-out,transform .6s ease-out;transition:opacity 1.2s ease-out,transform .6s ease-out,-webkit-transform .6s ease-out}

@ -0,0 +1 @@
.waves-ripple{position:absolute;border-radius:100%;background-color:rgba(0,0,0,.15);background-clip:padding-box;pointer-events:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-transform:scale(0);transform:scale(0);opacity:1}.waves-ripple.z-active{opacity:0;-webkit-transform:scale(2);transform:scale(2);-webkit-transition:opacity 1.2s ease-out,-webkit-transform .6s ease-out;transition:opacity 1.2s ease-out,-webkit-transform .6s ease-out;transition:opacity 1.2s ease-out,transform .6s ease-out;transition:opacity 1.2s ease-out,transform .6s ease-out,-webkit-transform .6s ease-out}

@ -0,0 +1 @@
.waves-ripple{position:absolute;border-radius:100%;background-color:rgba(0,0,0,.15);background-clip:padding-box;pointer-events:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-transform:scale(0);transform:scale(0);opacity:1}.waves-ripple.z-active{opacity:0;-webkit-transform:scale(2);transform:scale(2);-webkit-transition:opacity 1.2s ease-out,-webkit-transform .6s ease-out;transition:opacity 1.2s ease-out,-webkit-transform .6s ease-out;transition:opacity 1.2s ease-out,transform .6s ease-out;transition:opacity 1.2s ease-out,transform .6s ease-out,-webkit-transform .6s ease-out}.pagination-container[data-v-df7d1fa0]{background:#fff;padding:32px 16px}.pagination-container.hidden[data-v-df7d1fa0]{display:none}

@ -0,0 +1 @@
.waves-ripple{position:absolute;border-radius:100%;background-color:rgba(0,0,0,.15);background-clip:padding-box;pointer-events:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-transform:scale(0);transform:scale(0);opacity:1}.waves-ripple.z-active{opacity:0;-webkit-transform:scale(2);transform:scale(2);-webkit-transition:opacity 1.2s ease-out,-webkit-transform .6s ease-out;transition:opacity 1.2s ease-out,-webkit-transform .6s ease-out;transition:opacity 1.2s ease-out,transform .6s ease-out;transition:opacity 1.2s ease-out,transform .6s ease-out,-webkit-transform .6s ease-out}

@ -1 +0,0 @@
.waves-ripple{position:absolute;border-radius:100%;background-color:rgba(0,0,0,.15);background-clip:padding-box;pointer-events:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-transform:scale(0);transform:scale(0);opacity:1}.waves-ripple.z-active{opacity:0;-webkit-transform:scale(2);transform:scale(2);-webkit-transition:opacity 1.2s ease-out,-webkit-transform .6s ease-out;transition:opacity 1.2s ease-out,-webkit-transform .6s ease-out;transition:opacity 1.2s ease-out,transform .6s ease-out;transition:opacity 1.2s ease-out,transform .6s ease-out,-webkit-transform .6s ease-out}.pagination-container[data-v-6af373ef]{background:#fff;padding:32px 16px}.pagination-container.hidden[data-v-6af373ef]{display:none}

@ -1 +0,0 @@
.waves-ripple{position:absolute;border-radius:100%;background-color:rgba(0,0,0,.15);background-clip:padding-box;pointer-events:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-transform:scale(0);transform:scale(0);opacity:1}.waves-ripple.z-active{opacity:0;-webkit-transform:scale(2);transform:scale(2);-webkit-transition:opacity 1.2s ease-out,-webkit-transform .6s ease-out;transition:opacity 1.2s ease-out,-webkit-transform .6s ease-out;transition:opacity 1.2s ease-out,transform .6s ease-out;transition:opacity 1.2s ease-out,transform .6s ease-out,-webkit-transform .6s ease-out}.pagination-container[data-v-6af373ef]{background:#fff;padding:32px 16px}.pagination-container.hidden[data-v-6af373ef]{display:none}

@ -0,0 +1 @@
.waves-ripple{position:absolute;border-radius:100%;background-color:rgba(0,0,0,.15);background-clip:padding-box;pointer-events:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-transform:scale(0);transform:scale(0);opacity:1}.waves-ripple.z-active{opacity:0;-webkit-transform:scale(2);transform:scale(2);-webkit-transition:opacity 1.2s ease-out,-webkit-transform .6s ease-out;transition:opacity 1.2s ease-out,-webkit-transform .6s ease-out;transition:opacity 1.2s ease-out,transform .6s ease-out;transition:opacity 1.2s ease-out,transform .6s ease-out,-webkit-transform .6s ease-out}.pagination-container[data-v-df7d1fa0]{background:#fff;padding:32px 16px}.pagination-container.hidden[data-v-df7d1fa0]{display:none}

@ -0,0 +1 @@
.waves-ripple{position:absolute;border-radius:100%;background-color:rgba(0,0,0,.15);background-clip:padding-box;pointer-events:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-transform:scale(0);transform:scale(0);opacity:1}.waves-ripple.z-active{opacity:0;-webkit-transform:scale(2);transform:scale(2);-webkit-transition:opacity 1.2s ease-out,-webkit-transform .6s ease-out;transition:opacity 1.2s ease-out,-webkit-transform .6s ease-out;transition:opacity 1.2s ease-out,transform .6s ease-out;transition:opacity 1.2s ease-out,transform .6s ease-out,-webkit-transform .6s ease-out}.dashboard-editor-container[data-v-7c9290ee]{padding:32px;background-color:#f0f2f5;position:relative;min-height:100vh}

@ -1 +0,0 @@
.waves-ripple{position:absolute;border-radius:100%;background-color:rgba(0,0,0,.15);background-clip:padding-box;pointer-events:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-transform:scale(0);transform:scale(0);opacity:1}.waves-ripple.z-active{opacity:0;-webkit-transform:scale(2);transform:scale(2);-webkit-transition:opacity 1.2s ease-out,-webkit-transform .6s ease-out;transition:opacity 1.2s ease-out,-webkit-transform .6s ease-out;transition:opacity 1.2s ease-out,transform .6s ease-out;transition:opacity 1.2s ease-out,transform .6s ease-out,-webkit-transform .6s ease-out}.pagination-container[data-v-6af373ef]{background:#fff;padding:32px 16px}.pagination-container.hidden[data-v-6af373ef]{display:none}

@ -1 +0,0 @@
.waves-ripple{position:absolute;border-radius:100%;background-color:rgba(0,0,0,.15);background-clip:padding-box;pointer-events:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-transform:scale(0);transform:scale(0);opacity:1}.waves-ripple.z-active{opacity:0;-webkit-transform:scale(2);transform:scale(2);-webkit-transition:opacity 1.2s ease-out,-webkit-transform .6s ease-out;transition:opacity 1.2s ease-out,-webkit-transform .6s ease-out;transition:opacity 1.2s ease-out,transform .6s ease-out;transition:opacity 1.2s ease-out,transform .6s ease-out,-webkit-transform .6s ease-out}.pagination-container[data-v-6af373ef]{background:#fff;padding:32px 16px}.pagination-container.hidden[data-v-6af373ef]{display:none}

@ -1 +0,0 @@
.waves-ripple{position:absolute;border-radius:100%;background-color:rgba(0,0,0,.15);background-clip:padding-box;pointer-events:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-transform:scale(0);transform:scale(0);opacity:1}.waves-ripple.z-active{opacity:0;-webkit-transform:scale(2);transform:scale(2);-webkit-transition:opacity 1.2s ease-out,-webkit-transform .6s ease-out;transition:opacity 1.2s ease-out,-webkit-transform .6s ease-out;transition:opacity 1.2s ease-out,transform .6s ease-out;transition:opacity 1.2s ease-out,transform .6s ease-out,-webkit-transform .6s ease-out}.pagination-container[data-v-6af373ef]{background:#fff;padding:32px 16px}.pagination-container.hidden[data-v-6af373ef]{display:none}

@ -1 +0,0 @@
.waves-ripple{position:absolute;border-radius:100%;background-color:rgba(0,0,0,.15);background-clip:padding-box;pointer-events:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-transform:scale(0);transform:scale(0);opacity:1}.waves-ripple.z-active{opacity:0;-webkit-transform:scale(2);transform:scale(2);-webkit-transition:opacity 1.2s ease-out,-webkit-transform .6s ease-out;transition:opacity 1.2s ease-out,-webkit-transform .6s ease-out;transition:opacity 1.2s ease-out,transform .6s ease-out;transition:opacity 1.2s ease-out,transform .6s ease-out,-webkit-transform .6s ease-out}.pagination-container[data-v-6af373ef]{background:#fff;padding:32px 16px}.pagination-container.hidden[data-v-6af373ef]{display:none}

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

@ -24,7 +24,7 @@ import cn.hippo4j.core.executor.manage.GlobalThreadPoolManage;
import cn.hippo4j.core.executor.support.ThreadPoolBuilder;
import cn.hippo4j.core.toolkit.IdentifyUtil;
import cn.hippo4j.core.toolkit.TraceContextUtil;
import cn.hippo4j.message.service.HippoSendMessageService;
import cn.hippo4j.message.service.Hippo4jSendMessageService;
import cn.hippo4j.message.enums.NotifyTypeEnum;
import cn.hippo4j.message.service.ThreadPoolNotifyAlarm;
import cn.hippo4j.message.request.AlarmNotifyRequest;
@ -51,7 +51,7 @@ import java.util.concurrent.*;
public class ThreadPoolNotifyAlarmHandler implements Runnable, CommandLineRunner {
@NonNull
private final HippoSendMessageService hippoSendMessageService;
private final Hippo4jSendMessageService hippoSendMessageService;
@Value("${spring.profiles.active:UNKNOWN}")
private String active;

@ -22,8 +22,8 @@ import cn.hippo4j.message.platform.DingSendMessageHandler;
import cn.hippo4j.message.platform.LarkSendMessageHandler;
import cn.hippo4j.message.platform.WeChatSendMessageHandler;
import cn.hippo4j.message.service.AlarmControlHandler;
import cn.hippo4j.message.service.HippoBaseSendMessageService;
import cn.hippo4j.message.service.HippoSendMessageService;
import cn.hippo4j.message.service.Hippo4jBaseSendMessageService;
import cn.hippo4j.message.service.Hippo4jSendMessageService;
import cn.hippo4j.message.service.SendMessageHandler;
import org.springframework.context.annotation.Bean;
@ -33,9 +33,9 @@ import org.springframework.context.annotation.Bean;
public class MessageConfiguration {
@Bean
public HippoSendMessageService hippoSendMessageService(NotifyConfigBuilder serverNotifyConfigBuilder,
AlarmControlHandler alarmControlHandler) {
return new HippoBaseSendMessageService(serverNotifyConfigBuilder, alarmControlHandler);
public Hippo4jSendMessageService hippo4jSendMessageService(NotifyConfigBuilder serverNotifyConfigBuilder,
AlarmControlHandler alarmControlHandler) {
return new Hippo4jBaseSendMessageService(serverNotifyConfigBuilder, alarmControlHandler);
}
@Bean

@ -22,29 +22,29 @@ import lombok.Builder;
import lombok.Data;
/**
* Alarm control dto.
* Alarm control DTO.
*/
@Data
@Builder
public class AlarmControlDTO {
/**
* 线 Id
* Thread pool id
*/
private String threadPool;
/**
*
* Push alarm platform
*/
private String platform;
/**
*
* Push Alert Type
*/
private NotifyTypeEnum typeEnum;
/**
* 线
* Build thread pool alarm id
*
* @return
*/

@ -23,7 +23,7 @@ import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
/**
* Notify config dto.
* Notify config DTO.
*/
@Data
@EqualsAndHashCode

@ -28,12 +28,12 @@ import java.util.List;
public class ThreadPoolNotifyDTO {
/**
* notifyKey
* Notify key
*/
private String notifyKey;
/**
* notifyList
* Notify list
*/
private List<NotifyConfigDTO> notifyList;
}

@ -17,6 +17,7 @@
package cn.hippo4j.message.platform;
import cn.hippo4j.common.toolkit.Singleton;
import cn.hippo4j.common.toolkit.StringUtil;
import cn.hippo4j.message.dto.NotifyConfigDTO;
import cn.hippo4j.message.enums.NotifyPlatformEnum;
@ -54,13 +55,15 @@ public class DingSendMessageHandler extends AbstractRobotSendMessageHandler {
@Override
protected RobotMessageActualContent buildMessageActualContent() {
String dingAlarmTxtKey = "message/robot/dynamic-thread-pool/ding-alarm.txt";
String dingConfigTxtKey = "message/robot/dynamic-thread-pool/ding-config.txt";
RobotMessageActualContent robotMessageActualContent = RobotMessageActualContent.builder()
.receiveSeparator(", @")
.changeSeparator(" -> ")
.replaceTxt(DING_ALARM_TIMOUT_REPLACE_TXT)
.traceReplaceTxt(DING_ALARM_TIMOUT_TRACE_REPLACE_TXT)
.alarmMessageContent(FileUtil.readUtf8String("message/robot/dynamic-thread-pool/ding-alarm.txt"))
.configMessageContent(FileUtil.readUtf8String("message/robot/dynamic-thread-pool/ding-config.txt"))
.alarmMessageContent(Singleton.get(dingAlarmTxtKey, () -> FileUtil.readUtf8String(dingAlarmTxtKey)))
.configMessageContent(Singleton.get(dingConfigTxtKey, () -> FileUtil.readUtf8String(dingConfigTxtKey)))
.build();
return robotMessageActualContent;
}

@ -17,6 +17,7 @@
package cn.hippo4j.message.platform;
import cn.hippo4j.common.toolkit.Singleton;
import cn.hippo4j.message.dto.NotifyConfigDTO;
import cn.hippo4j.message.enums.NotifyPlatformEnum;
import cn.hippo4j.message.enums.NotifyTypeEnum;
@ -25,6 +26,7 @@ import cn.hippo4j.message.request.AlarmNotifyRequest;
import cn.hippo4j.message.request.ChangeParameterNotifyRequest;
import cn.hippo4j.common.toolkit.StringUtil;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.io.FileUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.http.HttpRequest;
import lombok.AllArgsConstructor;
@ -53,20 +55,25 @@ public class LarkSendMessageHandler implements SendMessageHandler<AlarmNotifyReq
@SneakyThrows
public void sendAlarmMessage(NotifyConfigDTO notifyConfig, AlarmNotifyRequest alarmNotifyRequest) {
String afterReceives = getReceives(notifyConfig.getReceives());
String larkAlarmTxt;
String larkAlarmTimoutReplaceTxt;
String larkAlarmTxtKey = "message/robot/dynamic-thread-pool/lark-alarm.json";
String larkAlarmTxt = Singleton.get(larkAlarmTxtKey, () -> FileUtil.readUtf8String(larkAlarmTxtKey));
String larkAlarmTimoutReplaceJsonKey = "message/robot/dynamic-thread-pool/lark-alarm-timeout-replace.json";
String larkAlarmTimoutReplaceJson = Singleton.get(larkAlarmTimoutReplaceJsonKey, () -> FileUtil.readUtf8String(larkAlarmTimoutReplaceJsonKey));
if (Objects.equals(alarmNotifyRequest.getNotifyTypeEnum(), NotifyTypeEnum.TIMEOUT)) {
String executeTimeoutTrace = alarmNotifyRequest.getExecuteTimeoutTrace();
String larkAlarmTimoutTraceReplaceJsonKey = "message/robot/dynamic-thread-pool/lark-alarm-trace-replace.json";
String larkAlarmTimoutTraceReplaceJson = Singleton.get(larkAlarmTimoutTraceReplaceJsonKey, () -> FileUtil.readUtf8String(larkAlarmTimoutTraceReplaceJsonKey));
if (StringUtil.isNotBlank(executeTimeoutTrace)) {
String larkAlarmTimoutTraceReplaceTxt = String.format(LARK_ALARM_TIMOUT_TRACE_REPLACE_TXT, executeTimeoutTrace);
larkAlarmTimoutReplaceTxt = StrUtil.replace(LARK_ALARM_TIMOUT_REPLACE_TXT, LARK_ALARM_TIMOUT_TRACE_REPLACE_TXT, larkAlarmTimoutTraceReplaceTxt);
String larkAlarmTimoutTraceReplaceTxt = String.format(larkAlarmTimoutTraceReplaceJson, executeTimeoutTrace);
larkAlarmTimoutReplaceTxt = StrUtil.replace(larkAlarmTimoutReplaceJson, larkAlarmTimoutTraceReplaceJson, larkAlarmTimoutTraceReplaceTxt);
} else {
larkAlarmTimoutReplaceTxt = StrUtil.replace(LARK_ALARM_TIMOUT_REPLACE_TXT, LARK_ALARM_TIMOUT_TRACE_REPLACE_TXT, "");
larkAlarmTimoutReplaceTxt = StrUtil.replace(larkAlarmTimoutReplaceJson, larkAlarmTimoutTraceReplaceJson, "");
}
larkAlarmTimoutReplaceTxt = String.format(larkAlarmTimoutReplaceTxt, alarmNotifyRequest.getExecuteTime(), alarmNotifyRequest.getExecuteTimeOut());
larkAlarmTxt = StrUtil.replace(LARK_ALARM_JSON_STR, LARK_ALARM_TIMOUT_REPLACE_TXT, larkAlarmTimoutReplaceTxt);
larkAlarmTxt = StrUtil.replace(larkAlarmTxt, larkAlarmTimoutReplaceJson, larkAlarmTimoutReplaceTxt);
} else {
larkAlarmTxt = StrUtil.replace(LARK_ALARM_JSON_STR, LARK_ALARM_TIMOUT_REPLACE_TXT, "");
larkAlarmTxt = StrUtil.replace(larkAlarmTxt, larkAlarmTimoutReplaceJson, "");
}
String text = String.format(larkAlarmTxt,
@ -118,7 +125,8 @@ public class LarkSendMessageHandler implements SendMessageHandler<AlarmNotifyReq
public void sendChangeMessage(NotifyConfigDTO notifyConfig, ChangeParameterNotifyRequest changeParameterNotifyRequest) {
String threadPoolId = changeParameterNotifyRequest.getThreadPoolId();
String afterReceives = getReceives(notifyConfig.getReceives());
String larkNoticeJson = LARK_NOTICE_JSON_STR;
String larkNoticeJsonKey = "message/robot/dynamic-thread-pool/lark-config.json";
String larkNoticeJson = Singleton.get(larkNoticeJsonKey, () -> FileUtil.readUtf8String(larkNoticeJsonKey));
String text = String.format(larkNoticeJson,
// 环境
changeParameterNotifyRequest.getActive(),

@ -18,6 +18,7 @@
package cn.hippo4j.message.platform;
import cn.hippo4j.common.toolkit.JSONUtil;
import cn.hippo4j.common.toolkit.Singleton;
import cn.hippo4j.message.enums.NotifyPlatformEnum;
import cn.hippo4j.message.platform.base.AbstractRobotSendMessageHandler;
import cn.hippo4j.message.platform.base.RobotMessageActualContent;
@ -43,13 +44,15 @@ public class WeChatSendMessageHandler extends AbstractRobotSendMessageHandler {
@Override
protected RobotMessageActualContent buildMessageActualContent() {
String weChatAlarmTxtKet = "message/robot/dynamic-thread-pool/wechat-alarm.txt";
String weChatConfigTxtKet = "message/robot/dynamic-thread-pool/wechat-alarm.txt";
RobotMessageActualContent robotMessageActualContent = RobotMessageActualContent.builder()
.receiveSeparator("><@")
.changeSeparator(" ➲ ")
.replaceTxt(WE_CHAT_ALARM_TIMOUT_REPLACE_TXT)
.traceReplaceTxt(WE_CHAT_ALARM_TIMOUT_TRACE_REPLACE_TXT)
.alarmMessageContent(FileUtil.readUtf8String("message/robot/dynamic-thread-pool/wechat-alarm.txt"))
.configMessageContent(FileUtil.readUtf8String("message/robot/dynamic-thread-pool/wechat-config.txt"))
.alarmMessageContent(Singleton.get(weChatAlarmTxtKet, () -> FileUtil.readUtf8String(weChatAlarmTxtKet)))
.configMessageContent(Singleton.get(weChatConfigTxtKet, () -> FileUtil.readUtf8String(weChatConfigTxtKet)))
.build();
return robotMessageActualContent;
}

@ -23,87 +23,31 @@ package cn.hippo4j.message.platform.constant;
public class DingAlarmConstants {
/**
* Url
* DingTalk Robot Url
*/
public static final String DING_ROBOT_SERVER_URL = "https://oapi.dingtalk.com/robot/send?access_token=";
/**
* 线
* Thread Pool Alert Notification Title
*/
public static final String DING_ALARM_TITLE = "动态线程池告警";
/**
* 线
* Thread pool parameter change notification title
*/
public static final String DING_NOTICE_TITLE = "动态线程池通知";
/**
* Trace
* Trace info
*/
public static final String DING_ALARM_TIMOUT_TRACE_REPLACE_TXT = "<font color=#708090 size=2>链路信息:%s</font> \n\n ";
/**
*
* Replace task timeout template
*/
public static final String DING_ALARM_TIMOUT_REPLACE_TXT =
"<font color=#708090 size=2>任务执行时间:%d / ms </font> \n\n " +
"<font color=#708090 size=2>超时时间:%d / ms</font> \n\n " +
DING_ALARM_TIMOUT_TRACE_REPLACE_TXT +
" --- \n\n ";
/**
* 线
*/
public static final String DING_ALARM_TXT =
"**<font color=#FF0000>[警报] </font>%s - 动态线程池运行告警(%s** \n\n" +
" --- \n\n " +
"<font color=#708090 size=2>线程池ID%s</font> \n\n " +
"<font color=#708090 size=2>应用名称:%s</font> \n\n " +
"<font color=#778899 size=2>应用实例:%s</font> \n\n " +
" --- \n\n " +
"<font color=#708090 size=2>核心线程数:%d</font> \n\n " +
"<font color=#708090 size=2>最大线程数:%d</font> \n\n " +
"<font color=#708090 size=2>当前线程数:%d</font> \n\n " +
"<font color=#708090 size=2>活跃线程数:%d</font> \n\n " +
"<font color=#708090 size=2>同存最大线程数:%d</font> \n\n " +
"<font color=#708090 size=2>线程池任务总量:%d</font> \n\n " +
" --- \n\n " +
"<font color=#708090 size=2>队列类型:%s</font> \n\n " +
"<font color=#708090 size=2>队列容量:%d</font> \n\n " +
"<font color=#708090 size=2>队列元素个数:%d</font> \n\n " +
"<font color=#708090 size=2>队列剩余个数:%d</font> \n\n " +
" --- \n\n " +
DING_ALARM_TIMOUT_REPLACE_TXT +
"<font color=#708090 size=2>拒绝策略:%s</font> \n\n" +
"<font color=#708090 size=2>拒绝策略执行次数:</font><font color=#FF0000 size=2>%d</font> \n\n " +
"<font color=#708090 size=2>OWNER@%s</font> \n\n" +
"<font color=#708090 size=2>提示:%d 分钟内此线程池不会重复告警(可配置)</font> \n\n" +
" --- \n\n " +
"**播报时间:%s**";
/**
* 线
*/
public static final String DING_NOTICE_TXT =
"**<font color=#2a9d8f>[通知] </font>%s - 动态线程池参数变更** \n\n" +
" --- \n\n " +
"<font color=#708090 size=2>线程池ID%s</font> \n\n " +
"<font color=#708090 size=2>应用名称:%s</font> \n\n " +
"<font color=#778899 size=2>应用实例:%s</font> \n\n " +
" --- \n\n " +
"<font color=#708090 size=2>核心线程数:%s</font> \n\n " +
"<font color=#708090 size=2>最大线程数:%s</font> \n\n " +
"<font color=#708090 size=2>核心线程超时:%s</font> \n\n " +
"<font color=#708090 size=2>线程存活时间:%s</font> \n\n" +
"<font color=#708090 size=2>执行超时时间:%s</font> \n\n" +
" --- \n\n " +
"<font color=#708090 size=2>队列类型:%s</font> \n\n " +
"<font color=#708090 size=2>队列容量:%s</font> \n\n " +
"<font color=#708090 size=2>AGO 拒绝策略:%s</font> \n\n" +
"<font color=#708090 size=2>NOW 拒绝策略:%s</font> \n\n" +
" --- \n\n " +
"<font color=#708090 size=2>提示:动态线程池配置变更实时通知(无限制)</font> \n\n" +
"<font color=#708090 size=2>OWNER@%s</font> \n\n" +
" --- \n\n " +
"**播报时间:%s**";
}

@ -23,51 +23,24 @@ package cn.hippo4j.message.platform.constant;
public class LarkAlarmConstants {
/**
* lark bot url
* Lark bot url
*/
public static final String LARK_BOT_URL = "https://open.feishu.cn/open-apis/bot/v2/hook/";
/**
* lark at format. openid
* openid,@
* Lark at format. openid
* When openid is configured, the bot can @person
*/
public static final String LARK_AT_FORMAT_OPENID = "<at id='%s'></at>";
/**
* lark at format. username
* username,@username,@@
* Lark at format. username
* When configuring username, only @username can be displayed in blue font, and it is reminded by @people without @
*/
public static final String LARK_AT_FORMAT_USERNAME = "<at id=''>%s</at>";
/**
* lark openid prefix
* Lark openid prefix
*/
public static final String LARK_OPENID_PREFIX = "ou_";
/**
* Trace
*/
public static final String LARK_ALARM_TIMOUT_TRACE_REPLACE_TXT = ",{\"is_short\":true,\"text\":{\"content\":\"** 链路信息:** %s\",\"tag\":\"lark_md\"}}";
/**
*
*/
public static final String LARK_ALARM_TIMOUT_REPLACE_TXT =
"{\"fields\":[{\"is_short\":true,\"text\":{\"content\":\"** 任务执行时间:** %s\",\"tag\":\"lark_md\"}},{\"is_short\":true,\"text\":{\"content\":\"** 超时时间:** %s\",\"tag\":\"lark_md\"}}" +
LARK_ALARM_TIMOUT_TRACE_REPLACE_TXT +
"],\"tag\":\"div\"},{\"tag\":\"hr\"},";
/**
* lark alarm json str
*/
public static final String LARK_ALARM_JSON_STR =
"{\"msg_type\":\"interactive\",\"card\":{\"config\":{\"wide_screen_mode\":true},\"header\":{\"template\":\"red\",\"title\":{\"content\":\"[\uD83D\uDD25警报] %s 动态线程池运行告警(%s\",\"tag\":\"plain_text\"}},\"elements\":[{\"fields\":[{\"is_short\":true,\"text\":{\"content\":\"** 线程池ID** %s\",\"tag\":\"lark_md\"}},{\"is_short\":true,\"text\":{\"content\":\"** 应用名称:** %s\",\"tag\":\"lark_md\"}},{\"is_short\":true,\"text\":{\"content\":\"** 应用实例:** %s\",\"tag\":\"lark_md\"}}],\"tag\":\"div\"},{\"tag\":\"hr\"},{\"fields\":[{\"is_short\":true,\"text\":{\"content\":\"** 核心线程数:** %s\",\"tag\":\"lark_md\"}},{\"is_short\":true,\"text\":{\"content\":\"** 最大线程数:** %s\",\"tag\":\"lark_md\"}},{\"is_short\":true,\"text\":{\"content\":\"** 当前线程数:** %s\",\"tag\":\"lark_md\"}},{\"is_short\":true,\"text\":{\"content\":\"** 活跃线程数:** %s\",\"tag\":\"lark_md\"}},{\"is_short\":true,\"text\":{\"content\":\"** 同存最大线程数:** %s\",\"tag\":\"lark_md\"}},{\"is_short\":true,\"text\":{\"content\":\"** 线程池任务总量:** %s\",\"tag\":\"lark_md\"}}],\"tag\":\"div\"},{\"tag\":\"hr\"},{\"fields\":[{\"is_short\":true,\"text\":{\"content\":\"** 队列类型:** %s\",\"tag\":\"lark_md\"}},{\"is_short\":true,\"text\":{\"content\":\"** 队列容量:** %s\",\"tag\":\"lark_md\"}},{\"is_short\":true,\"text\":{\"content\":\"** 队列元素个数:** %s\",\"tag\":\"lark_md\"}},{\"is_short\":true,\"text\":{\"content\":\"** 队列剩余个数:** %s\",\"tag\":\"lark_md\"}}],\"tag\":\"div\"},{\"tag\":\"hr\"},"
+ LARK_ALARM_TIMOUT_REPLACE_TXT
+ "{\"fields\":[{\"is_short\":true,\"text\":{\"content\":\"** 拒绝策略:** %s\",\"tag\":\"lark_md\"}},{\"is_short\":true,\"text\":{\"content\":\"** 拒绝策略执行次数:** %s\",\"tag\":\"lark_md\"}},{\"is_short\":true,\"text\":{\"content\":\"** OWNER** %s\",\"tag\":\"lark_md\"}},{\"is_short\":true,\"text\":{\"content\":\"** 播报时间: ** %s\",\"tag\":\"lark_md\"}}],\"tag\":\"div\"},{\"tag\":\"hr\"},{\"tag\":\"note\",\"elements\":[{\"tag\":\"plain_text\",\"content\":\"提示: %s 分钟内此线程池不会重复告警(可配置)\"}]}]}}";
/**
* lark notice json str
*/
public static final String LARK_NOTICE_JSON_STR =
"{\"msg_type\":\"interactive\",\"card\":{\"config\":{\"wide_screen_mode\":true},\"header\":{\"template\":\"greed\",\"title\":{\"content\":\"[通知] %s 动态线程池参数变更\",\"tag\":\"plain_text\"}},\"elements\":[{\"fields\":[{\"is_short\":true,\"text\":{\"content\":\"** 线程池ID** %s\",\"tag\":\"lark_md\"}},{\"is_short\":true,\"text\":{\"content\":\"** 应用名称:** %s\",\"tag\":\"lark_md\"}},{\"is_short\":true,\"text\":{\"content\":\"** 应用实例:** %s\",\"tag\":\"lark_md\"}}],\"tag\":\"div\"},{\"tag\":\"hr\"},{\"fields\":[{\"is_short\":true,\"text\":{\"content\":\"** 核心线程数:** %s\",\"tag\":\"lark_md\"}},{\"is_short\":true,\"text\":{\"content\":\"** 最大线程数:** %s\",\"tag\":\"lark_md\"}},{\"is_short\":true,\"text\":{\"content\":\"** 核心线程超时:** %s\",\"tag\":\"lark_md\"}},{\"is_short\":true,\"text\":{\"content\":\"** 线程存活时间:** %s\",\"tag\":\"lark_md\"}}],\"tag\":\"div\"},{\"tag\":\"hr\"},{\"fields\":[{\"is_short\":true,\"text\":{\"content\":\"** 队列类型:** %s\",\"tag\":\"lark_md\"}},{\"is_short\":true,\"text\":{\"content\":\"** 队列容量:** %s\",\"tag\":\"lark_md\"}},{\"is_short\":true,\"text\":{\"content\":\"** 执行超时时间:** %s\",\"tag\":\"lark_md\"}}],\"tag\":\"div\"},{\"tag\":\"hr\"},{\"fields\":[{\"is_short\":true,\"text\":{\"content\":\"** AGO 拒绝策略:** %s\",\"tag\":\"lark_md\"}},{\"is_short\":true,\"text\":{\"content\":\"** NOW 拒绝策略:** %s\",\"tag\":\"lark_md\"}},{\"is_short\":true,\"text\":{\"content\":\"** OWNER** %s\",\"tag\":\"lark_md\"}},{\"is_short\":true,\"text\":{\"content\":\"** 播报时间: ** %s\",\"tag\":\"lark_md\"}}],\"tag\":\"div\"},{\"tag\":\"hr\"},{\"tag\":\"note\",\"elements\":[{\"tag\":\"plain_text\",\"content\":\"提示:动态线程池配置变更实时通知(无限制)\"}]}]}}";
}

@ -23,17 +23,17 @@ package cn.hippo4j.message.platform.constant;
public class WeChatAlarmConstants {
/**
* Url
* Enterprise Micro Robot Url
*/
public static final String WE_CHAT_SERVER_URL = "https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=";
/**
* Trace
* Trace info
*/
public static final String WE_CHAT_ALARM_TIMOUT_TRACE_REPLACE_TXT = "\n> 链路信息:%s ";
/**
*
* Replace task timeout template
*/
public static final String WE_CHAT_ALARM_TIMOUT_REPLACE_TXT =
"\n> 任务执行时间:%s / ms \n" +

@ -30,102 +30,102 @@ import lombok.experimental.Accessors;
public class AlarmNotifyRequest extends BaseNotifyRequest {
/**
* interval
* Interval
*/
private Integer interval;
/**
* notifyTypeEnum
* Notify type enum
*/
private NotifyTypeEnum notifyTypeEnum;
/**
* active
* Active
*/
private String active;
/**
* appName
* App name
*/
private String appName;
/**
* identify
* Identify
*/
private String identify;
/**
* corePoolSize
* Core pool size
*/
private Integer corePoolSize;
/**
* maximumPoolSize
* Maximum pool size
*/
private Integer maximumPoolSize;
/**
* poolSize
* Pool size
*/
private Integer poolSize;
/**
* activeCount
* Active count
*/
private Integer activeCount;
/**
* largestPoolSize
* Largest pool size
*/
private Integer largestPoolSize;
/**
* completedTaskCount
* Completed task count
*/
private Long completedTaskCount;
/**
* queueName
* Queue name
*/
private String queueName;
/**
* capacity
* Capacity
*/
private Integer capacity;
/**
* queueSize
* Queue size
*/
private Integer queueSize;
/**
* remainingCapacity
* Remaining capacity
*/
private Integer remainingCapacity;
/**
* rejectedExecutionHandlerName
* Rejected execution handler name
*/
private String rejectedExecutionHandlerName;
/**
* rejectCountNum
* Reject count num
*/
private Long rejectCountNum;
/**
* executeTime
* Execute time
*/
private Long executeTime;
/**
* executeTimeOut
* Execute timeout
*/
private Long executeTimeOut;
/**
* executeTimeoutTrace
* Execute timeout trace
*/
private String executeTimeoutTrace;
}

@ -26,7 +26,7 @@ import lombok.Data;
public class RobotAlarmNotifyRequest extends AlarmNotifyRequest {
/**
* secretKey
* Secret key
*/
private String secretKey;
}

@ -26,7 +26,7 @@ import lombok.Data;
public class RobotChangeParameterNotifyRequest extends ChangeParameterNotifyRequest {
/**
* secretKey
* Secret key
*/
private String secretKey;
}

@ -30,7 +30,7 @@ import java.util.List;
public class ThreadPoolNotifyRequest {
/**
* groupKeys
* Group keys
*/
private List<String> groupKeys;
}

@ -26,32 +26,32 @@ import lombok.Data;
public class BaseNotifyRequest implements NotifyRequest {
/**
* tenantId
* Tenant id
*/
private String tenantId;
/**
* itemId
* Item id
*/
private String itemId;
/**
* threadPoolId
* Thread pool id
*/
private String threadPoolId;
/**
* platform
* Platform
*/
private String platform;
/**
* type
* Type
*/
private String type;
/**
* receives
* Receives
*/
private String receives;
}

@ -36,11 +36,11 @@ import java.util.List;
import java.util.Map;
/**
* Hippo base send message service.
* Hippo-4j base send message service.
*/
@Slf4j
@RequiredArgsConstructor
public class HippoBaseSendMessageService implements HippoSendMessageService, CommandLineRunner {
public class Hippo4jBaseSendMessageService implements Hippo4jSendMessageService, CommandLineRunner {
private final NotifyConfigBuilder notifyConfigBuilder;

@ -22,12 +22,12 @@ import cn.hippo4j.message.request.AlarmNotifyRequest;
import cn.hippo4j.message.request.ChangeParameterNotifyRequest;
/**
* Hippo4j send message service.
* Hippo-4j send message service.
*/
public interface HippoSendMessageService {
public interface Hippo4jSendMessageService {
/**
* Send alarm message.
* Send dynamic thread pool alert notifications.
*
* @param typeEnum
* @param alarmNotifyRequest
@ -35,7 +35,7 @@ public interface HippoSendMessageService {
void sendAlarmMessage(NotifyTypeEnum typeEnum, AlarmNotifyRequest alarmNotifyRequest);
/**
* Send change message.
* Send dynamic thread pool parameter change notification.
*
* @param changeParameterNotifyRequest
*/

@ -63,9 +63,7 @@ public class ThreadPoolNotifyAlarm {
/**
* Receives
*
* <p>
* Do not enable this configuration for the time being, it may be useful if you develop mailboxes in the future.
* </p>
* <p> Do not enable this configuration for the time being, it may be useful if you develop mailboxes in the future.
*/
@Deprecated
private Map<String, String> receives;

@ -0,0 +1,30 @@
{
"fields": [
{
"is_short": true,
"text": {
"content": "** 任务执行时间:** %s",
"tag": "lark_md"
}
},
{
"is_short": true,
"text": {
"content": "** 超时时间:** %s",
"tag": "lark_md"
}
},
{
"is_short": true,
"text": {
"content": "** 链路信息:** %s",
"tag": "lark_md"
}
}
],
"tag": "div"
},
{
"tag": "hr"
},

@ -0,0 +1,8 @@
{
"is_short": true,
"text": {
"content": "** 链路信息:** %s",
"tag": "lark_md"
}
}

@ -1,3 +1,206 @@
{
"name": "123"
"msg_type": "interactive",
"card": {
"config": {
"wide_screen_mode": true
},
"header": {
"template": "red",
"title": {
"content": "[🔥警报] %s 动态线程池运行告警(%s",
"tag": "plain_text"
}
},
"elements": [
{
"fields": [
{
"is_short": true,
"text": {
"content": "** 线程池ID** %s",
"tag": "lark_md"
}
},
{
"is_short": true,
"text": {
"content": "** 应用名称:** %s",
"tag": "lark_md"
}
},
{
"is_short": true,
"text": {
"content": "** 应用实例:** %s",
"tag": "lark_md"
}
}
],
"tag": "div"
},
{
"tag": "hr"
},
{
"fields": [
{
"is_short": true,
"text": {
"content": "** 核心线程数:** %s",
"tag": "lark_md"
}
},
{
"is_short": true,
"text": {
"content": "** 最大线程数:** %s",
"tag": "lark_md"
}
},
{
"is_short": true,
"text": {
"content": "** 当前线程数:** %s",
"tag": "lark_md"
}
},
{
"is_short": true,
"text": {
"content": "** 活跃线程数:** %s",
"tag": "lark_md"
}
},
{
"is_short": true,
"text": {
"content": "** 同存最大线程数:** %s",
"tag": "lark_md"
}
},
{
"is_short": true,
"text": {
"content": "** 线程池任务总量:** %s",
"tag": "lark_md"
}
}
],
"tag": "div"
},
{
"tag": "hr"
},
{
"fields": [
{
"is_short": true,
"text": {
"content": "** 队列类型:** %s",
"tag": "lark_md"
}
},
{
"is_short": true,
"text": {
"content": "** 队列容量:** %s",
"tag": "lark_md"
}
},
{
"is_short": true,
"text": {
"content": "** 队列元素个数:** %s",
"tag": "lark_md"
}
},
{
"is_short": true,
"text": {
"content": "** 队列剩余个数:** %s",
"tag": "lark_md"
}
}
],
"tag": "div"
},
{
"tag": "hr"
},
{
"fields": [
{
"is_short": true,
"text": {
"content": "** 任务执行时间:** %s",
"tag": "lark_md"
}
},
{
"is_short": true,
"text": {
"content": "** 超时时间:** %s",
"tag": "lark_md"
}
},
{
"is_short": true,
"text": {
"content": "** 链路信息:** %s",
"tag": "lark_md"
}
}
],
"tag": "div"
},
{
"tag": "hr"
},
{
"fields": [
{
"is_short": true,
"text": {
"content": "** 拒绝策略:** %s",
"tag": "lark_md"
}
},
{
"is_short": true,
"text": {
"content": "** 拒绝策略执行次数:** %s",
"tag": "lark_md"
}
},
{
"is_short": true,
"text": {
"content": "** OWNER** %s",
"tag": "lark_md"
}
},
{
"is_short": true,
"text": {
"content": "** 播报时间: ** %s",
"tag": "lark_md"
}
}
],
"tag": "div"
},
{
"tag": "hr"
},
{
"tag": "note",
"elements": [
{
"tag": "plain_text",
"content": "提示: %s 分钟内此线程池不会重复告警(可配置)"
}
]
}
]
}
}

@ -0,0 +1,156 @@
{
"msg_type": "interactive",
"card": {
"config": {
"wide_screen_mode": true
},
"header": {
"template": "greed",
"title": {
"content": "[通知] %s 动态线程池参数变更",
"tag": "plain_text"
}
},
"elements": [
{
"fields": [
{
"is_short": true,
"text": {
"content": "** 线程池ID** %s",
"tag": "lark_md"
}
},
{
"is_short": true,
"text": {
"content": "** 应用名称:** %s",
"tag": "lark_md"
}
},
{
"is_short": true,
"text": {
"content": "** 应用实例:** %s",
"tag": "lark_md"
}
}
],
"tag": "div"
},
{
"tag": "hr"
},
{
"fields": [
{
"is_short": true,
"text": {
"content": "** 核心线程数:** %s",
"tag": "lark_md"
}
},
{
"is_short": true,
"text": {
"content": "** 最大线程数:** %s",
"tag": "lark_md"
}
},
{
"is_short": true,
"text": {
"content": "** 核心线程超时:** %s",
"tag": "lark_md"
}
},
{
"is_short": true,
"text": {
"content": "** 线程存活时间:** %s",
"tag": "lark_md"
}
}
],
"tag": "div"
},
{
"tag": "hr"
},
{
"fields": [
{
"is_short": true,
"text": {
"content": "** 队列类型:** %s",
"tag": "lark_md"
}
},
{
"is_short": true,
"text": {
"content": "** 队列容量:** %s",
"tag": "lark_md"
}
},
{
"is_short": true,
"text": {
"content": "** 执行超时时间:** %s",
"tag": "lark_md"
}
}
],
"tag": "div"
},
{
"tag": "hr"
},
{
"fields": [
{
"is_short": true,
"text": {
"content": "** AGO 拒绝策略:** %s",
"tag": "lark_md"
}
},
{
"is_short": true,
"text": {
"content": "** NOW 拒绝策略:** %s",
"tag": "lark_md"
}
},
{
"is_short": true,
"text": {
"content": "** OWNER** %s",
"tag": "lark_md"
}
},
{
"is_short": true,
"text": {
"content": "** 播报时间: ** %s",
"tag": "lark_md"
}
}
],
"tag": "div"
},
{
"tag": "hr"
},
{
"tag": "note",
"elements": [
{
"tag": "plain_text",
"content": "提示:动态线程池配置变更实时通知(无限制)"
}
]
}
]
}
}

@ -33,8 +33,8 @@ import cn.hippo4j.core.springboot.starter.support.ThreadPoolAdapterRegister;
import cn.hippo4j.message.api.NotifyConfigBuilder;
import cn.hippo4j.message.config.MessageConfiguration;
import cn.hippo4j.message.service.AlarmControlHandler;
import cn.hippo4j.message.service.HippoBaseSendMessageService;
import cn.hippo4j.message.service.HippoSendMessageService;
import cn.hippo4j.message.service.Hippo4jBaseSendMessageService;
import cn.hippo4j.message.service.Hippo4jSendMessageService;
import lombok.AllArgsConstructor;
import org.springframework.boot.autoconfigure.ImportAutoConfiguration;
import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
@ -78,7 +78,7 @@ public class DynamicThreadPoolCoreAutoConfiguration {
}
@Bean
public ThreadPoolNotifyAlarmHandler threadPoolNotifyAlarmHandler(HippoSendMessageService hippoSendMessageService) {
public ThreadPoolNotifyAlarmHandler threadPoolNotifyAlarmHandler(Hippo4jSendMessageService hippoSendMessageService) {
return new ThreadPoolNotifyAlarmHandler(hippoSendMessageService);
}
@ -96,7 +96,7 @@ public class DynamicThreadPoolCoreAutoConfiguration {
@SuppressWarnings("all")
public ExecutorsListener hippo4jExecutorsListener(ThreadPoolNotifyAlarmHandler threadPoolNotifyAlarmHandler,
CoreNotifyConfigBuilder coreNotifyConfigBuilder,
HippoBaseSendMessageService hippoBaseSendMessageService) {
Hippo4jBaseSendMessageService hippoBaseSendMessageService) {
return new ExecutorsListener(threadPoolNotifyAlarmHandler, coreNotifyConfigBuilder, hippoBaseSendMessageService);
}

@ -31,7 +31,7 @@ public class PrometheusMonitorCondition implements Condition {
@Override
public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
String collectType = context.getEnvironment().getProperty(BootstrapCoreProperties.PREFIX + "collect-type", "");
String collectType = context.getEnvironment().getProperty(BootstrapCoreProperties.PREFIX + ".collect-type", "");
return StringUtil.isNotEmpty(collectType) && collectType.contains(MonitorTypeEnum.PROMETHEUS.name().toLowerCase()) ? true : false;
}
}

@ -33,7 +33,7 @@ import cn.hippo4j.core.springboot.starter.notify.CoreNotifyConfigBuilder;
import cn.hippo4j.core.springboot.starter.support.GlobalCoreThreadPoolManage;
import cn.hippo4j.message.dto.NotifyConfigDTO;
import cn.hippo4j.message.request.ChangeParameterNotifyRequest;
import cn.hippo4j.message.service.HippoBaseSendMessageService;
import cn.hippo4j.message.service.Hippo4jBaseSendMessageService;
import cn.hippo4j.message.service.ThreadPoolNotifyAlarm;
import com.google.common.collect.Lists;
import lombok.RequiredArgsConstructor;
@ -65,7 +65,7 @@ public class ExecutorsListener implements ApplicationListener<Hippo4jCoreDynamic
private final CoreNotifyConfigBuilder coreNotifyConfigBuilder;
private final HippoBaseSendMessageService hippoBaseSendMessageService;
private final Hippo4jBaseSendMessageService hippo4jBaseSendMessageService;
@Override
public void onApplicationEvent(Hippo4jCoreDynamicRefreshEvent threadPoolDynamicRefreshEvent) {
@ -141,7 +141,7 @@ public class ExecutorsListener implements ApplicationListener<Hippo4jCoreDynamic
boolean checkNotifyAlarm = false;
List<String> changeKeys = Lists.newArrayList();
Map<String, List<NotifyConfigDTO>> newDynamicThreadPoolNotifyMap = coreNotifyConfigBuilder.buildSingleNotifyConfig(properties);
Map<String, List<NotifyConfigDTO>> notifyConfigs = hippoBaseSendMessageService.getNotifyConfigs();
Map<String, List<NotifyConfigDTO>> notifyConfigs = hippo4jBaseSendMessageService.getNotifyConfigs();
if (CollectionUtil.isNotEmpty(notifyConfigs)) {
for (Map.Entry<String, List<NotifyConfigDTO>> each : newDynamicThreadPoolNotifyMap.entrySet()) {
if (checkNotifyConfig) {
@ -159,7 +159,7 @@ public class ExecutorsListener implements ApplicationListener<Hippo4jCoreDynamic
}
if (checkNotifyConfig) {
coreNotifyConfigBuilder.initCacheAndLock(newDynamicThreadPoolNotifyMap);
hippoBaseSendMessageService.putPlatform(newDynamicThreadPoolNotifyMap);
hippo4jBaseSendMessageService.putPlatform(newDynamicThreadPoolNotifyMap);
}
ThreadPoolNotifyAlarm threadPoolNotifyAlarm = GlobalNotifyAlarmManage.get(properties.getThreadPoolId());
if (threadPoolNotifyAlarm != null && properties.getNotify() != null) {

Some files were not shown because too many files have changed in this diff Show More

Loading…
Cancel
Save