Я хочу установить java17!пожалуйста!мне очень нужна помощь. Я пытаюсь с моими MQTT-клиентами подписаться на тему без подписки на тему несколько раз после того, как клиент некоторое время работает. (У меня также есть проблема с тем, что клиенты больше не обрабатывают входящие сообщения по некоторым темам после того, как клиент некоторое время работает (возможно, потому, что брокер забывает о подписках), но это уже другая тема, которую следует задать в другом вопросе. Но именно по этой причине я перешел с постоянных сеансов на cleanStart(true) + sessionExpiryInterval(0). (Это не помогло.))
Я новичок в MQTT и Клиент HiveMQ, поэтому с моей стороны может возникнуть некоторое недоразумение. Также приветствуются любые идеи по улучшению или альтернативные подходы к моему коду.
Я использую брокер сообщений Mosquitto 2.0.22 на Windows Server 2019 (я бы предпочел Linux, но на данный момент я привязан к Windows). Конфигурация брокера:
public class Ref154PostProcess extends RefApiPost {
@Override
public ResBasisEntity execute(Map req, RefExtMainMst mst, Object data, Exception e) {
ResBasisEntity res = super.execute(req, mst, data, e);
if (res == null || res.payload == null) {
return res;
}
try {
// 处理 payload -> estmProdInfo
List prodList = safeGetList(res.payload, "estmProdInfo");
if (prodList == null) {
return res;
}
for (Map prod : prodList) {
// 1. 清理 estmProdAttInfo 中多余父 ID
removeParentId(safeGetList(prod, "estmProdAttInfo"), "estmSubscriptionId");
// 2. 商材层 estmCostInfo (重命名 + 清理)
cleanCostInfo(prod, "estmCostInfo_Prod", "estmSubscriptionId");
// 3. プラン层
List planList = safeGetList(prod, "estmPlanInfo");
if (planList != null) {
for (Map plan : planList) {
// 3a. 清理 estmPlanAttributeInfo 中多余父 ID
removeParentId(safeGetList(plan, "estmPlanAttributeInfo"), "estmRatePlanId");
// 3b. プラン层 estmCostInfo (重命名 + 清理)
cleanCostInfo(plan, "estmCostInfo_Plan", "estmRatePlanId");
// 3c. 課金层
List chargeList = safeGetList(plan, "estmRatePlanChargeInfo");
if (chargeList != null) {
for (Map charge : chargeList) {
// 3c-1. 清理 estmBillUsage 的父 ID
removeParentIdFromMap(safeGetMap(charge, "estmBillUsage"), "estmRatePlanChargeId");
// 3c-2. 課金层 estmCostInfo (重命名 + 清理)
cleanCostInfo(charge, "estmCostInfo_Charge", "estmRatePlanChargeId");
// 3c-3. 清理 estmRatePlanChargeTierInfo 多余父 ID
removeParentId(safeGetList(charge, "estmRatePlanChargeTierInfo"), "estmRatePlanChargeId");
}
}
}
}
}
} catch (Exception ex) {
// 记录日志但不影响原有响应
// Logger.error("Failed to clean response data", ex);
}
return res;
}
/**
* 安全获取 List (避免 ClassCastException)
*/
@SuppressWarnings("unchecked")
private List safeGetList(Map map, String key) {
Object obj = map.get(key);
if (obj instanceof List) {
return (List) obj;
}
return null;
}
/**
* 安全获取 Map (避免 ClassCastException)
*/
@SuppressWarnings("unchecked")
private Map safeGetMap(Map map, String key) {
Object obj = map.get(key);
if (obj instanceof Map) {
return (Map) obj;
}
return null;
}
/**
* 批量删除列表中所有项的指定父 ID
*/
private void removeParentId(List list, String parentIdKey) {
if (list != null) {
for (Map item : list) {
item.remove(parentIdKey);
}
}
}
/**
* 从单个 Map 删除父 ID
*/
private void removeParentIdFromMap(Map map, String parentIdKey) {
if (map != null) {
map.remove(parentIdKey);
}
}
/**
* 清理 CostInfo 及其 costCalcParamInfo 中多余父 ID
* 并统一字段名为 estmCostInfo
*
* @param parent 父对象 (商材/プラン/課金)
* @param costInfoKey 原始键名 (estmCostInfo_Prod/Plan/Charge)
* @param parentIdKey 要删除的父 ID 键名
*/
private void cleanCostInfo(Map parent, String costInfoKey, String parentIdKey) {
List costList = safeGetList(parent, costInfoKey);
if (costList != null) {
for (Map cost : costList) {
// 移除多余父 ID
cost.remove(parentIdKey);
// 清理 costCalcParamInfo 中的父 CostInfo ID
removeParentId(safeGetList(cost, "costCalcParamInfo"), "estmCostId");
}
// 统一重命名为 estmCostInfo
if (!"estmCostInfo".equals(costInfoKey)) {
parent.put("estmCostInfo", costList);
parent.remove(costInfoKey);
}
}
}
}
Подробнее здесь: https://stackoverflow.com/questions/798 ... topic-with