Java源码示例:com.alibaba.csp.sentinel.transport.HeartbeatSender

示例1
@Test
public void testRetrieveInterval() {
    HeartbeatSender sender = mock(HeartbeatSender.class);

    long senderInterval = 5666;
    long configInterval = 6777;

    when(sender.intervalMs()).thenReturn(senderInterval);

    HeartbeatSenderInitFunc func = new HeartbeatSenderInitFunc();
    assertEquals(senderInterval, func.retrieveInterval(sender));

    // Invalid interval.
    SentinelConfig.setConfig(TransportConfig.HEARTBEAT_INTERVAL_MS, "-1");
    assertEquals(senderInterval, func.retrieveInterval(sender));

    SentinelConfig.setConfig(TransportConfig.HEARTBEAT_INTERVAL_MS, String.valueOf(configInterval));
    assertEquals(configInterval, func.retrieveInterval(sender));
}
 
示例2
@Test
public void testRetrieveInterval() {
    HeartbeatSender sender = mock(HeartbeatSender.class);

    long senderInterval = 5666;
    long configInterval = 6777;

    when(sender.intervalMs()).thenReturn(senderInterval);

    HeartbeatSenderInitFunc func = new HeartbeatSenderInitFunc();
    assertEquals(senderInterval, func.retrieveInterval(sender));

    // Invalid interval.
    SentinelConfig.setConfig(TransportConfig.HEARTBEAT_INTERVAL_MS, "-1");
    assertEquals(senderInterval, func.retrieveInterval(sender));

    SentinelConfig.setConfig(TransportConfig.HEARTBEAT_INTERVAL_MS, String.valueOf(configInterval));
    assertEquals(configInterval, func.retrieveInterval(sender));
}
 
示例3
private static void resolveInstance() {
    HeartbeatSender resolved = SpiLoader.loadHighestPriorityInstance(HeartbeatSender.class);
    if (resolved == null) {
        RecordLog.warn("[HeartbeatSenderProvider] WARN: No existing HeartbeatSender found");
    } else {
        heartbeatSender = resolved;
        RecordLog.info("[HeartbeatSenderProvider] HeartbeatSender activated: " + resolved.getClass()
            .getCanonicalName());
    }
}
 
示例4
@Override
public void init() {
    HeartbeatSender sender = HeartbeatSenderProvider.getHeartbeatSender();
    if (sender == null) {
        RecordLog.warn("[HeartbeatSenderInitFunc] WARN: No HeartbeatSender loaded");
        return;
    }

    initSchedulerIfNeeded();
    long interval = retrieveInterval(sender);
    setIntervalIfNotExists(interval);
    scheduleHeartbeatTask(sender, interval);
}
 
示例5
long retrieveInterval(/*@NonNull*/ HeartbeatSender sender) {
    Long intervalInConfig = TransportConfig.getHeartbeatIntervalMs();
    if (isValidHeartbeatInterval(intervalInConfig)) {
        RecordLog.info("[HeartbeatSenderInitFunc] Using heartbeat interval "
            + "in Sentinel config property: " + intervalInConfig);
        return intervalInConfig;
    } else {
        long senderInterval = sender.intervalMs();
        RecordLog.info("[HeartbeatSenderInit] Heartbeat interval not configured in "
            + "config property or invalid, using sender default: " + senderInterval);
        return senderInterval;
    }
}
 
示例6
private void scheduleHeartbeatTask(/*@NonNull*/ final HeartbeatSender sender, /*@Valid*/ long interval) {
    pool.scheduleAtFixedRate(new Runnable() {
        @Override
        public void run() {
            try {
                sender.sendHeartbeat();
            } catch (Throwable e) {
                RecordLog.warn("[HeartbeatSender] Send heartbeat error", e);
            }
        }
    }, 5000, interval, TimeUnit.MILLISECONDS);
    RecordLog.info("[HeartbeatSenderInit] HeartbeatSender started: "
        + sender.getClass().getCanonicalName());
}
 
示例7
private static void resolveInstance() {
    HeartbeatSender resolved = SpiLoader.loadHighestPriorityInstance(HeartbeatSender.class);
    if (resolved == null) {
        RecordLog.warn("[HeartbeatSenderProvider] WARN: No existing HeartbeatSender found");
    } else {
        heartbeatSender = resolved;
        RecordLog.info("[HeartbeatSenderProvider] HeartbeatSender activated: " + resolved.getClass()
            .getCanonicalName());
    }
}
 
示例8
@Override
public void init() {
    HeartbeatSender sender = HeartbeatSenderProvider.getHeartbeatSender();
    if (sender == null) {
        RecordLog.warn("[HeartbeatSenderInitFunc] WARN: No HeartbeatSender loaded");
        return;
    }

    initSchedulerIfNeeded();
    long interval = retrieveInterval(sender);
    setIntervalIfNotExists(interval);
    scheduleHeartbeatTask(sender, interval);
}
 
示例9
long retrieveInterval(/*@NonNull*/ HeartbeatSender sender) {
    Long intervalInConfig = TransportConfig.getHeartbeatIntervalMs();
    if (isValidHeartbeatInterval(intervalInConfig)) {
        RecordLog.info("[HeartbeatSenderInitFunc] Using heartbeat interval "
            + "in Sentinel config property: " + intervalInConfig);
        return intervalInConfig;
    } else {
        long senderInterval = sender.intervalMs();
        RecordLog.info("[HeartbeatSenderInit] Heartbeat interval not configured in "
            + "config property or invalid, using sender default: " + senderInterval);
        return senderInterval;
    }
}
 
示例10
private void scheduleHeartbeatTask(/*@NonNull*/ final HeartbeatSender sender, /*@Valid*/ long interval) {
    pool.scheduleAtFixedRate(new Runnable() {
        @Override
        public void run() {
            try {
                sender.sendHeartbeat();
            } catch (Throwable e) {
                RecordLog.warn("[HeartbeatSender] Send heartbeat error", e);
            }
        }
    }, 5000, interval, TimeUnit.MILLISECONDS);
    RecordLog.info("[HeartbeatSenderInit] HeartbeatSender started: "
        + sender.getClass().getCanonicalName());
}
 
示例11
@Before
public void setUp() {
	beanFactory = mock(DefaultListableBeanFactory.class);
	sentinelProperties = mock(SentinelProperties.class);
	sentinelHealthIndicator = new SentinelHealthIndicator(beanFactory,
			sentinelProperties);

	SentinelConfig.setConfig(TransportConfig.CONSOLE_SERVER, "");

	heartbeatSender = mock(HeartbeatSender.class);
	Field heartbeatSenderField = ReflectionUtils
			.findField(HeartbeatSenderProvider.class, "heartbeatSender");
	heartbeatSenderField.setAccessible(true);
	ReflectionUtils.setField(heartbeatSenderField, null, heartbeatSender);
}
 
示例12
@Override
protected void doHealthCheck(Health.Builder builder) throws Exception {
	Map<String, Object> detailMap = new HashMap<>();

	// If sentinel isn't enabled, set the status up and set the enabled to false in
	// detail
	if (!sentinelProperties.isEnabled()) {
		detailMap.put("enabled", false);
		builder.up().withDetails(detailMap);
		return;
	}

	detailMap.put("enabled", true);

	// Check health of Dashboard
	boolean dashboardUp = true;
	List<Tuple2<String, Integer>> consoleServerList = TransportConfig
			.getConsoleServerList();
	if (CollectionUtils.isEmpty(consoleServerList)) {
		// If Dashboard isn't configured, it's OK and mark the status of Dashboard
		// with UNKNOWN.
		detailMap.put("dashboard",
				new Status(Status.UNKNOWN.getCode(), "dashboard isn't configured"));
	}
	else {
		// If Dashboard is configured, send a heartbeat message to it and check the
		// result
		HeartbeatSender heartbeatSender = HeartbeatSenderProvider
				.getHeartbeatSender();
		boolean result = heartbeatSender.sendHeartbeat();
		if (result) {
			detailMap.put("dashboard", Status.UP);
		}
		else {
			// If failed to send heartbeat message, means that the Dashboard is DOWN
			dashboardUp = false;
			detailMap.put("dashboard",
					new Status(Status.DOWN.getCode(), String.format(
							"the dashboard servers [%s] one of them can't be connected",
							consoleServerList)));
		}
	}

	// Check health of DataSource
	boolean dataSourceUp = true;
	Map<String, Object> dataSourceDetailMap = new HashMap<>();
	detailMap.put("dataSource", dataSourceDetailMap);

	// Get all DataSources and each call loadConfig to check if it's OK
	// If no Exception thrown, it's OK
	// Note:
	// Even if the dynamic config center is down, the loadConfig() might return
	// successfully
	// e.g. for Nacos client, it might retrieve from the local cache)
	// But in most circumstances it's okay
	Map<String, AbstractDataSource> dataSourceMap = beanFactory
			.getBeansOfType(AbstractDataSource.class);
	for (Map.Entry<String, AbstractDataSource> dataSourceMapEntry : dataSourceMap
			.entrySet()) {
		String dataSourceBeanName = dataSourceMapEntry.getKey();
		AbstractDataSource dataSource = dataSourceMapEntry.getValue();
		try {
			dataSource.loadConfig();
			dataSourceDetailMap.put(dataSourceBeanName, Status.UP);
		}
		catch (Exception e) {
			// If one DataSource failed to loadConfig, means that the DataSource is
			// DOWN
			dataSourceUp = false;
			dataSourceDetailMap.put(dataSourceBeanName,
					new Status(Status.DOWN.getCode(), e.getMessage()));
		}
	}

	// If Dashboard and DataSource are both OK, the health status is UP
	if (dashboardUp && dataSourceUp) {
		builder.up().withDetails(detailMap);
	}
	else {
		builder.down().withDetails(detailMap);
	}
}
 
示例13
/**
 * Get resolved {@link HeartbeatSender} instance.
 *
 * @return resolved {@code HeartbeatSender} instance
 */
public static HeartbeatSender getHeartbeatSender() {
    return heartbeatSender;
}
 
示例14
/**
 * Get resolved {@link HeartbeatSender} instance.
 *
 * @return resolved {@code HeartbeatSender} instance
 */
public static HeartbeatSender getHeartbeatSender() {
    return heartbeatSender;
}