Java源码示例:org.springframework.cloud.context.environment.EnvironmentChangeEvent

示例1
@Order
@EventListener
public void rateLimiterConfigRefresh(EnvironmentChangeEvent changeEvent) {
    Set<String> refreshKey = changeEvent.getKeys();
    logger.debug("Received configuration update with keys: {}", refreshKey);
    logger.debug("Updated rateLimiterProperties are :{}", rateLimiterProperties);
    if (refreshKey != null && refreshKey.size() > 0
            && refreshKey.toString().contains("formula.ratelimiter")) {
        Set<FormulaRateLimiterConfig> cachedRateLimiterConfigs = new HashSet<>(ratelimiterConfigs.values());
        List<FormulaRateLimiterConfig> newRateLimiterConfigs = rateLimiterProperties.getRatelimiters();
        Set<String> names = getNamesWithUpdates(cachedRateLimiterConfigs, newRateLimiterConfigs);
        updateRateLimiterConfigMap();
        updatePatternsRequestMap();
        if (null != names && names.size() > 0) {
            for (String name : names) {
                logger.debug("RateLimiter to be refresh with name: {}", name);
                refreshRateLimiter(name, 1);
            }
        }
    }
}
 
示例2
@Test
public void testRateLimiterRuleUpdate() {

    List<FormulaRateLimiterConfig> configList = rateLimiterProperties.getRatelimiters();
    logger.info("Configure list: {}", configList);
    String key = configList.get(0).getLimiterName();
    Integer originalThreshHold = registryManager.getRatelimiterConfigs().get(key).getThreshold();
    Integer newThreshHold = originalThreshHold + 1;
    configList.get(0).setThreshold(newThreshHold);
    rateLimiterProperties.setRatelimiters(configList);
    // assert not equal before refresh
    assertNotEquals(newThreshHold, registryManager.getRatelimiterConfigs().get(key).getThreshold());

    // manually trigger change event
    Set<String> changedKeys = new HashSet<>();
    changedKeys.add("formula.ratelimiter.ratelimiters[0].threshold");
    EnvironmentChangeEvent changeEvent = new EnvironmentChangeEvent(changedKeys);
    registryManager.rateLimiterConfigRefresh(changeEvent);
    assertEquals(newThreshHold, registryManager.getRatelimiterConfigs().get(key).getThreshold());

    // change back
    configList.get(0).setThreshold(originalThreshHold);
    rateLimiterProperties.setRatelimiters(configList);
    registryManager.rateLimiterConfigRefresh(changeEvent);
    assertEquals(originalThreshHold, registryManager.getRatelimiterConfigs().get(key).getThreshold());
}
 
示例3
@Test
public void testRateLimiterRuleDisable() {

    List<FormulaRateLimiterConfig> configList = rateLimiterProperties.getRatelimiters();
    logger.info("Configure list: {}", configList);
    String key = configList.get(1).getLimiterName();
    configList.get(1).setEnabled(false);
    rateLimiterProperties.setRatelimiters(configList);
    // assert not equal before refresh
    assertNotEquals(false, registryManager.getRatelimiterConfigs().get(key).getEnabled());

    // manually trigger change event
    Set<String> changedKeys = new HashSet<>();
    changedKeys.add("formula.ratelimiter.ratelimiters[1].enabled");
    EnvironmentChangeEvent changeEvent = new EnvironmentChangeEvent(changedKeys);
    registryManager.rateLimiterConfigRefresh(changeEvent);
    assertEquals(false, registryManager.getRatelimiterConfigs().get(key).getEnabled());

    // change back
    configList.get(1).setEnabled(true);
    rateLimiterProperties.setRatelimiters(configList);
    registryManager.rateLimiterConfigRefresh(changeEvent);
    assertEquals(true, registryManager.getRatelimiterConfigs().get(key).getEnabled());
}
 
示例4
@Test
public void testRateLimiterRuleDelete() {

    List<FormulaRateLimiterConfig> configList = rateLimiterProperties.getRatelimiters();
    logger.info("Configure list: {}", configList);
    FormulaRateLimiterConfig configuration = configList.get(1);
    configList.remove(1);
    assertEquals(2, registryManager.getRatelimiterConfigs().size());

    // manually trigger change event
    Set<String> changedKeys = new HashSet<>();
    changedKeys.add("formula.ratelimiter.ratelimiters[1]");
    EnvironmentChangeEvent changeEvent = new EnvironmentChangeEvent(changedKeys);
    registryManager.rateLimiterConfigRefresh(changeEvent);
    assertEquals(1, registryManager.getRatelimiterConfigs().size());

    // change back
    configList.add(configuration);
    registryManager.rateLimiterConfigRefresh(changeEvent);
    assertEquals(2, registryManager.getRatelimiterConfigs().size());
}
 
示例5
private synchronized void refreshDataSource(Set<String> changedKeys) {
  try {
    logger.info("Refreshing data source");

    /**
     * rebind configuration beans, e.g. DataSourceProperties
     * @see org.springframework.cloud.context.properties.ConfigurationPropertiesRebinder#onApplicationEvent
     */
    this.applicationContext.publishEvent(new EnvironmentChangeEvent(changedKeys));

    DataSource newDataSource = dataSourceManager.createAndTestDataSource();
    DataSource oldDataSource = dynamicDataSource.setDataSource(newDataSource);
    asyncTerminate(oldDataSource);

    logger.info("Finished refreshing data source");
  } catch (Throwable ex) {
    logger.error("Refreshing data source failed", ex);
  }
}
 
示例6
private void refreshZuulProperties(ConfigChangeEvent changeEvent) {
  logger.info("Refreshing zuul properties!");

  /**
   * rebind configuration beans, e.g. ZuulProperties
   * @see org.springframework.cloud.context.properties.ConfigurationPropertiesRebinder#onApplicationEvent
   */
  this.applicationContext.publishEvent(new EnvironmentChangeEvent(changeEvent.changedKeys()));

  /**
   * refresh routes
   * @see org.springframework.cloud.netflix.zuul.ZuulServerAutoConfiguration.ZuulRefreshListener#onApplicationEvent
   */
  this.applicationContext.publishEvent(new RoutesRefreshedEvent(routeLocator));

  logger.info("Zuul properties refreshed!");
}
 
示例7
private void refreshZuulProperties(ConfigChangeEvent changeEvent) {
    logger.info("Refreshing zuul properties!");

    /**
     * rebind configuration beans, e.g. ZuulProperties
     * @see org.springframework.cloud.context.properties.ConfigurationPropertiesRebinder#onApplicationEvent
     */
    this.applicationContext.publishEvent(new EnvironmentChangeEvent(changeEvent.changedKeys()));

    /**
     * refresh routes
     * @see org.springframework.cloud.netflix.zuul.ZuulServerAutoConfiguration.ZuulRefreshListener#onApplicationEvent
     */
    this.applicationContext.publishEvent(new RoutesRefreshedEvent(routeLocator));

    logger.info("Zuul properties refreshed!");
}
 
示例8
@Test
public void updatedWhenRegionChanged() {
	changeProperty("eureka.client.use-dns-for-fetching-service-urls=false",
			"eureka.client.region=region1",
			"eureka.client.availability-zones.region1=region1-zone",
			"eureka.client.availability-zones.region2=region2-zone",
			"eureka.client.service-url.region1-zone=https://region1-zone-host:8678/eureka/",
			"eureka.client.service-url.region2-zone=https://region2-zone-host:8678/eureka/");
	this.context
			.publishEvent(new EnvironmentChangeEvent(Collections.singleton(REGION)));
	assertThat(serviceUrlMatches("https://region1-zone-host:8678/eureka/")).as(
			"PeerEurekaNodes' are not updated when eureka.client.region is changed")
			.isTrue();

	changeProperty("eureka.client.region=region2");
	this.context
			.publishEvent(new EnvironmentChangeEvent(Collections.singleton(REGION)));
	assertThat(serviceUrlMatches("https://region2-zone-host:8678/eureka/")).as(
			"PeerEurekaNodes' are not updated when eureka.client.region is changed")
			.isTrue();
}
 
示例9
@Test
public void updatedWhenAvailabilityZoneChanged() {
	changeProperty("eureka.client.use-dns-for-fetching-service-urls=false",
			"eureka.client.region=region4",
			"eureka.client.availability-zones.region3=region3-zone",
			"eureka.client.service-url.region4-zone=https://region4-zone-host:8678/eureka/",
			"eureka.client.service-url.defaultZone=https://default-host3:8678/eureka/");
	this.context.publishEvent(new EnvironmentChangeEvent(
			Collections.singleton("eureka.client.availability-zones.region3")));
	assertThat(this.peerEurekaNodes.getPeerEurekaNodes().get(0).getServiceUrl()
			.equals("https://default-host3:8678/eureka/")).isTrue();

	changeProperty("eureka.client.availability-zones.region4=region4-zone");
	this.context.publishEvent(new EnvironmentChangeEvent(
			Collections.singleton("eureka.client.availability-zones.region4")));
	assertThat(serviceUrlMatches("https://region4-zone-host:8678/eureka/")).as(
			"PeerEurekaNodes' are not updated when eureka.client.availability-zones are changed")
			.isTrue();
}
 
示例10
@EventListener
public void handle(EnvironmentChangeEvent event) {
    if (event.getKeys().contains(TEST_PROP)) {
        countDownLatch1().countDown();
    } else if (event.getKeys().contains(TEST_PROP2)) {
        countDownLatch2().countDown();
    }
}
 
示例11
/**
 * 监听EnvironmentChangeEvent 事件,更改相关环境变量
 * @param event
 */
@Override
@EventListener(EnvironmentChangeEvent.class)
public void onApplicationEvent(EnvironmentChangeEvent event) {
    try {
        LOGGER.info("environment change.");
        Map<String, Object> propertySource = Maps.newHashMap();
        if (!routeMatcher.match()) {
            LOGGER.info("this route rules does not match this instance.");
            return;
        }
        // 多条路由规则已先后顺序进行匹配
        FormulaRouteProperty formulaRouteProperty = routeMatcher.getMatchedFormulaRouteProperty();
        // 获取新的负载均衡策略
        String iRuleName = formulaRouteProperty.getLoadbalance();
        String destServiceName = formulaRouteProperty.getDestServiceName();
        IRule oldRule = springClientFactory.getInstance(destServiceName, IRule.class);
        if (oldRule instanceof WeightedResponseTimeRule) {
            // 关闭线程池
            ((WeightedResponseTimeRule) oldRule).shutdown();
        }
        // 清理ribbon 中 所有的client的负载均衡器配置,更改环境变量值,等待下次重新加载client的负载均衡配置
        springClientFactory.destroy();

        // 按照ribbon的规范,配置IRule
        String configClientRule = destServiceName + "." + CONFIG_NAMESPACE + "." + CONFIG_RULE_CLASS;

        propertySource.put(configClientRule, IRuleInfo.getRulePath(iRuleName));
        // 加入至环境变量中
        this.configurableEnvironment.getPropertySources().addFirst(new RoutePropertySource(ROUTE_PROPERTY_SOURCE,
                propertySource));
    } catch (Exception e) {
        LOGGER.error("refresh route rule exception: {}", e);
    }

}
 
示例12
@Override
public synchronized Set<String> refresh() {
	Map<String, Object> before = extract(context.getEnvironment().getPropertySources());
	addScmConfigToEnvironment();
	Set<String> keys = changes(before, extract(context.getEnvironment().getPropertySources())).keySet();
	context.publishEvent(new EnvironmentChangeEvent(context, keys));
	scope.refreshAll();
	return keys;
}
 
示例13
private void refreshLoggingLevels(Set<String> changedKeys) {
  System.out.println("Refreshing logging levels");

  /**
   * refresh logging levels
   * @see org.springframework.cloud.logging.LoggingRebinder#onApplicationEvent
   */
  this.applicationContext.publishEvent(new EnvironmentChangeEvent(changedKeys));

  System.out.println("Logging levels refreshed");
}
 
示例14
@ApolloConfigChangeListener(interestedKeyPrefixes = PREFIX)
public void onChange(ConfigChangeEvent changeEvent) {
  logger.info("Refreshing Zuul rateLimit Properties");

  this.applicationContext.publishEvent(new EnvironmentChangeEvent(changeEvent.changedKeys()));

  logger.info("Zuul rateLimit Properties refreshed!");
}
 
示例15
@Override
public void onApplicationEvent(EnvironmentChangeEvent event) {
	loadBalancers.stream().forEach(lb -> {
		if (lb instanceof DynamicServerListLoadBalancer) {
			((DynamicServerListLoadBalancer<?>)lb).updateListOfServers();
		}
	});
}
 
示例16
@Override
public void onApplicationEvent(EnvironmentChangeEvent event) {
	log.debug("Event keys: " + event.getKeys());
	if (event.getKeys().contains(KEY_BASIC)) {
		countDownLatch().countDown();
	}
}
 
示例17
@Override
public void onApplicationEvent(EnvironmentChangeEvent event) {
	if (this.environment == null) {
		return;
	}
	LoggingSystem system = LoggingSystem.get(LoggingSystem.class.getClassLoader());
	setLogLevels(system, this.environment);
}
 
示例18
public synchronized Set<String> refreshEnvironment() {
	Map<String, Object> before = extract(
			this.context.getEnvironment().getPropertySources());
	addConfigFilesToEnvironment();
	Set<String> keys = changes(before,
			extract(this.context.getEnvironment().getPropertySources())).keySet();
	this.context.publishEvent(new EnvironmentChangeEvent(this.context, keys));
	return keys;
}
 
示例19
@Override
public void onApplicationEvent(EnvironmentChangeEvent event) {
	if (this.applicationContext.equals(event.getSource())
			// Backwards compatible
			|| event.getKeys().equals(event.getSource())) {
		rebind();
	}
}
 
示例20
private void setLogLevels(ConfigurableApplicationContext applicationContext,
		ConfigurableEnvironment environment) {
	LoggingRebinder rebinder = new LoggingRebinder();
	rebinder.setEnvironment(environment);
	// We can't fire the event in the ApplicationContext here (too early), but we can
	// create our own listener and poke it (it doesn't need the key changes)
	rebinder.onApplicationEvent(new EnvironmentChangeEvent(applicationContext,
			Collections.<String>emptySet()));
}
 
示例21
@Test
public void logLevelsChanged() {
	then(this.logger.isTraceEnabled()).isFalse();
	StandardEnvironment environment = new StandardEnvironment();
	TestPropertyValues.of("logging.level.org.springframework.web=TRACE")
			.applyTo(environment);
	this.rebinder.setEnvironment(environment);
	this.rebinder.onApplicationEvent(new EnvironmentChangeEvent(environment,
			Collections.singleton("logging.level.org.springframework.web")));
	then(this.logger.isTraceEnabled()).isTrue();
}
 
示例22
@Test
public void logLevelsLowerCase() {
	then(this.logger.isTraceEnabled()).isFalse();
	StandardEnvironment environment = new StandardEnvironment();
	TestPropertyValues.of("logging.level.org.springframework.web=trace")
			.applyTo(environment);
	this.rebinder.setEnvironment(environment);
	this.rebinder.onApplicationEvent(new EnvironmentChangeEvent(environment,
			Collections.singleton("logging.level.org.springframework.web")));
	then(this.logger.isTraceEnabled()).isTrue();
}
 
示例23
@Test
public void logLevelFalseResolvedToOff() {
	ch.qos.logback.classic.Logger logger = (ch.qos.logback.classic.Logger) LoggerFactory
			.getLogger("org.springframework.cloud");
	StandardEnvironment environment = new StandardEnvironment();
	TestPropertyValues.of("logging.level.org.springframework.cloud=false")
			.applyTo(environment);
	rebinder.setEnvironment(environment);
	rebinder.onApplicationEvent(new EnvironmentChangeEvent(environment,
			Collections.singleton("logging.level.org.springframework.cloud")));
	then(Level.OFF).isEqualTo((logger.getLevel()));
}
 
示例24
@Test
public void eventsPublishedInOrder() throws Exception {
	this.context = new SpringApplicationBuilder(Empty.class)
			.web(WebApplicationType.NONE).bannerMode(Mode.OFF).run();
	RefreshScope scope = new RefreshScope();
	scope.setApplicationContext(this.context);
	ContextRefresher contextRefresher = new ContextRefresher(this.context, scope);
	RefreshEndpoint endpoint = new RefreshEndpoint(contextRefresher);
	Empty empty = this.context.getBean(Empty.class);
	endpoint.refresh();
	int after = empty.events.size();
	then(2).isEqualTo(after).as("Shutdown hooks not cleaned on refresh");
	then(empty.events.get(0) instanceof EnvironmentChangeEvent).isTrue();
}
 
示例25
@Override
public void onApplicationEvent(ApplicationEvent event) {
	if (event instanceof EnvironmentChangeEvent
			|| event instanceof RefreshScopeRefreshedEvent) {
		this.events.add(event);
	}
}
 
示例26
@Test
public void notUpdatedWhenDnsIsTrue() {
	changeProperty("eureka.client.use-dns-for-fetching-service-urls=true",
			"eureka.client.region=unavailable-region", // to force defaultZone
			"eureka.client.service-url.defaultZone=https://default-host1:8678/eureka/");
	this.context.publishEvent(new EnvironmentChangeEvent(
			new HashSet<>(Arrays.asList(USE_DNS, DEFAULT_ZONE))));

	assertThat(serviceUrlMatches("https://default-host1:8678/eureka/")).as(
			"PeerEurekaNodes' are updated when eureka.client.use-dns-for-fetching-service-urls is true")
			.isFalse();
}
 
示例27
@Test
public void updatedWhenDnsIsFalse() {
	changeProperty("eureka.client.use-dns-for-fetching-service-urls=false",
			"eureka.client.region=unavailable-region", // to force defaultZone
			"eureka.client.service-url.defaultZone=https://default-host2:8678/eureka/");
	this.context.publishEvent(new EnvironmentChangeEvent(
			new HashSet<>(Arrays.asList(USE_DNS, DEFAULT_ZONE))));

	assertThat(serviceUrlMatches("https://default-host2:8678/eureka/")).as(
			"PeerEurekaNodes' are not updated when eureka.client.use-dns-for-fetching-service-urls is false")
			.isTrue();
}
 
示例28
@Test
public void notUpdatedForRelaxedKeys() {
	changeProperty("eureka.client.use-dns-for-fetching-service-urls=false",
			"eureka.client.region=unavailable-region", // to force defaultZone
			"eureka.client.service-url.defaultZone=https://defaul-host6:8678/eureka/");
	this.context.publishEvent(new EnvironmentChangeEvent(
			Collections.singleton("eureka.client.serviceUrl.defaultZone")));
	assertThat(serviceUrlMatches("https://defaul-host6:8678/eureka/"))
			.as("PeerEurekaNodes' are updated for keys with relaxed binding")
			.isFalse();
}
 
示例29
@EventListener
public void handle(EnvironmentChangeEvent event) {
	if (event.getKeys().contains(TEST_PROP)) {
		countDownLatch1().countDown();
	}
	else if (event.getKeys().contains(TEST_PROP3)) {
		countDownLatch2().countDown();
	}
}
 
示例30
@Test
public void givenIntialPropertyValue_whenPropertyChanges_thenArchaiusRetrievesNewValue() {
    String initialValue = testPropertyWithDynamic.get();

    TestPropertyValues.of("baeldung.archaius.test.properties.one=new-value")
        .applyTo(context);
    context.publishEvent(new EnvironmentChangeEvent(Collections.singleton("baeldung.archaius.test.properties.one")));
    String finalValue = testPropertyWithDynamic.get();

    assertThat(initialValue).isEqualTo("test-one");
    assertThat(finalValue).isEqualTo("new-value");
}