| 83 | import org.jetbrains.annotations.Nullable; |
| 84 | |
| 85 | public class Online extends AbstractOnline implements HotUpgrade, HotBeanFactory { |
| 86 | protected static final @NotNull Logger logger = LogManager.getLogger(Online.class); |
| 87 | protected static final BeanFactory beanFactory = new BeanFactory(); |
| 88 | protected static @Nullable Online defaultInstance; // 默认Online实例,stop后会置null |
| 89 | |
| 90 | public final @NotNull ProviderApp providerApp; |
| 91 | private final AtomicLong loginTimes = new AtomicLong(); |
| 92 | private final @NotNull TimerRole timerRole; |
| 93 | |
| 94 | private final @NotNull EventDispatcher loginEvents; |
| 95 | private final @NotNull EventDispatcher reloginEvents; |
| 96 | private final @NotNull EventDispatcher logoutEvents; |
| 97 | private final @NotNull EventDispatcher localRemoveEvents; |
| 98 | private final @NotNull EventDispatcher linkBrokenEvents; |
| 99 | |
| 100 | // 缓存拥有Local数据的HotModule,用来优化。 |
| 101 | private final ConcurrentHashSet<HotModule> hotModulesHaveLocal = new ConcurrentHashSet<>(); |
| 102 | private boolean freshStopModuleLocal; |
| 103 | private final ConcurrentHashSet<HotModule> hotModulesHaveDynamic = new ConcurrentHashSet<>(); |
| 104 | private boolean freshStopModuleDynamic; |
| 105 | private volatile long localActiveTimeout = 600 * 1000; // 活跃时间超时。 |
| 106 | private volatile long localCheckPeriod = 600 * 1000; // 检查间隔 |
| 107 | private final AtomicInteger verifyLocalCount = new AtomicInteger(); |
| 108 | |
| 109 | private final ConcurrentHashMap<String, TransmitAction> transmitActions = new ConcurrentHashMap<>(); |
| 110 | private @Nullable Future<?> verifyLocalTimer; |
| 111 | |
| 112 | public @NotNull ProviderApp getProviderApp() { |
| 113 | return providerApp; |
| 114 | } |
| 115 | |
| 116 | public void setLocalActiveTimeout(long timeout) { |
| 117 | lock(); |
| 118 | try { |
| 119 | localActiveTimeout = timeout; |
| 120 | } finally { |
| 121 | unlock(); |
| 122 | } |
| 123 | } |
| 124 | |
| 125 | public void setLocalCheckPeriod(long period) { |
| 126 | lock(); |
| 127 | try { |
| 128 | if (period <= 1) |
| 129 | throw new IllegalArgumentException(); |
| 130 | localCheckPeriod = period; |
| 131 | } finally { |
| 132 | unlock(); |
| 133 | } |
| 134 | } |
| 135 | |
| 136 | private void startLocalCheck() { |
| 137 | if (verifyLocalTimer != null) |
| 138 | verifyLocalTimer.cancel(false); |
| 139 | verifyLocalTimer = Task.scheduleUnsafe(localCheckPeriod, this::verifyLocal); |
| 140 | } |
| 141 | |
| 142 | private void onHotModuleStop(HotModule hot) { |
nothing calls this directly
no outgoing calls
no test coverage detected