取消一个具体的Timer实例。 需要在事务内调用。
(@Nullable String timerId)
| 737 | * 需要在事务内调用。 |
| 738 | */ |
| 739 | public void cancel(@Nullable String timerId) { |
| 740 | if (timerId == null) |
| 741 | return; // 忽略没有初始化的timerId。 |
| 742 | /* |
| 743 | try { |
| 744 | // XXX 统一通过这里取消定时器,可能会浪费一次内存表查询。 |
| 745 | // 还是让账户相关Timer自己取消吧。 |
| 746 | if (null != timerRole && timerRole.cancel(timerId)) |
| 747 | return; // done |
| 748 | |
| 749 | if (null != timerAccount && timerAccount.cancel(timerId)) |
| 750 | return; // done |
| 751 | |
| 752 | } catch (Exception ex) { |
| 753 | logger.error("ignore cancel error.", ex); |
| 754 | return; // done; |
| 755 | } |
| 756 | */ |
| 757 | var index = _tIndexs.get(timerId); |
| 758 | if (index != null) { |
| 759 | int serverId = index.getServerId(); |
| 760 | if (serverId != zeze.getConfig().getServerId()) |
| 761 | Transaction.whileCommit(() -> tryRedirectCancel(serverId, timerId)); |
| 762 | TimerHandle handle = null; |
| 763 | var nodeId = index.getNodeId(); |
| 764 | var node = _tNodes.get(nodeId); |
| 765 | if (node != null) { |
| 766 | var timer = node.getTimers().get(timerId); |
| 767 | if (timer != null) { |
| 768 | var handleName = timer.getHandleName(); |
| 769 | try { |
| 770 | handle = findTimerHandle(handleName); |
| 771 | } catch (Exception e) { |
| 772 | logger.error("cancel: findTimerHandle({}) exception:", handleName, e); |
| 773 | } |
| 774 | } |
| 775 | } |
| 776 | cancel(serverId, timerId, nodeId, node, handle); |
| 777 | } else // 定时器数据已经不存在了,尝试移除future |
| 778 | Transaction.whileCommit(() -> cancelFuture(timerId)); |
| 779 | } |
| 780 | |
| 781 | @NotNull tAccountTimers tAccountTimers() { |
| 782 | return _tAccountTimers; |
no test coverage detected