From c0c59320a59c4a03b5b696917a9df2fb7fed9457 Mon Sep 17 00:00:00 2001 From: Daniel Lavoie Date: Mon, 30 Oct 2017 17:40:08 -0400 Subject: [PATCH] Regression fix for hystrix stream without eureka registration --- .../HystrixStreamAutoConfiguration.java | 11 +++- .../hystrix/stream/HystrixStreamTask.java | 34 ++++++----- ...mAutoConfigurationNoRegistrationTests.java | 61 +++++++++++++++++++ .../HystrixStreamAutoConfigurationTests.java | 53 ++++++++++++++++ 4 files changed, 143 insertions(+), 16 deletions(-) create mode 100644 spring-cloud-netflix-hystrix-stream/src/test/java/org/springframework/cloud/netflix/hystrix/stream/HystrixStreamAutoConfigurationNoRegistrationTests.java create mode 100644 spring-cloud-netflix-hystrix-stream/src/test/java/org/springframework/cloud/netflix/hystrix/stream/HystrixStreamAutoConfigurationTests.java diff --git a/spring-cloud-netflix-hystrix-stream/src/main/java/org/springframework/cloud/netflix/hystrix/stream/HystrixStreamAutoConfiguration.java b/spring-cloud-netflix-hystrix-stream/src/main/java/org/springframework/cloud/netflix/hystrix/stream/HystrixStreamAutoConfiguration.java index 98b17113..f1eaf921 100644 --- a/spring-cloud-netflix-hystrix-stream/src/main/java/org/springframework/cloud/netflix/hystrix/stream/HystrixStreamAutoConfiguration.java +++ b/spring-cloud-netflix-hystrix-stream/src/main/java/org/springframework/cloud/netflix/hystrix/stream/HystrixStreamAutoConfiguration.java @@ -22,7 +22,10 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.boot.context.properties.EnableConfigurationProperties; +import org.springframework.cloud.client.ServiceInstance; import org.springframework.cloud.client.actuator.HasFeatures; +import org.springframework.cloud.client.discovery.DiscoveryClient; +import org.springframework.cloud.client.discovery.simple.SimpleDiscoveryClient; import org.springframework.cloud.client.serviceregistry.Registration; import org.springframework.cloud.stream.annotation.EnableBinding; import org.springframework.cloud.stream.annotation.Output; @@ -97,8 +100,12 @@ public class HystrixStreamAutoConfiguration { } @Bean - public HystrixStreamTask hystrixStreamTask() { - return new HystrixStreamTask(this.outboundChannel, this.registration, + public HystrixStreamTask hystrixStreamTask(SimpleDiscoveryClient simpleDiscoveryClient) { + ServiceInstance serviceInstance = this.registration; + if (serviceInstance == null) { + serviceInstance = simpleDiscoveryClient.getLocalServiceInstance(); + } + return new HystrixStreamTask(this.outboundChannel, serviceInstance, this.properties); } diff --git a/spring-cloud-netflix-hystrix-stream/src/main/java/org/springframework/cloud/netflix/hystrix/stream/HystrixStreamTask.java b/spring-cloud-netflix-hystrix-stream/src/main/java/org/springframework/cloud/netflix/hystrix/stream/HystrixStreamTask.java index bd2e23fa..7a3a9252 100644 --- a/spring-cloud-netflix-hystrix-stream/src/main/java/org/springframework/cloud/netflix/hystrix/stream/HystrixStreamTask.java +++ b/spring-cloud-netflix-hystrix-stream/src/main/java/org/springframework/cloud/netflix/hystrix/stream/HystrixStreamTask.java @@ -22,28 +22,27 @@ import java.util.ArrayList; import java.util.Collection; import java.util.concurrent.LinkedBlockingQueue; -import com.fasterxml.jackson.core.JsonFactory; -import com.fasterxml.jackson.core.JsonGenerator; -import com.netflix.hystrix.HystrixCircuitBreaker; -import com.netflix.hystrix.HystrixCommandKey; -import com.netflix.hystrix.HystrixCommandMetrics; -import com.netflix.hystrix.HystrixCommandProperties; -import com.netflix.hystrix.HystrixThreadPoolKey; -import com.netflix.hystrix.HystrixThreadPoolMetrics; -import com.netflix.hystrix.util.HystrixRollingNumberEvent; - import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; - import org.springframework.beans.BeansException; import org.springframework.cloud.client.ServiceInstance; -import org.springframework.cloud.client.serviceregistry.Registration; import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationContextAware; import org.springframework.messaging.MessageChannel; import org.springframework.messaging.MessageHeaders; import org.springframework.messaging.support.MessageBuilder; import org.springframework.scheduling.annotation.Scheduled; +import org.springframework.util.Assert; + +import com.fasterxml.jackson.core.JsonFactory; +import com.fasterxml.jackson.core.JsonGenerator; +import com.netflix.hystrix.HystrixCircuitBreaker; +import com.netflix.hystrix.HystrixCommandKey; +import com.netflix.hystrix.HystrixCommandMetrics; +import com.netflix.hystrix.HystrixCommandProperties; +import com.netflix.hystrix.HystrixThreadPoolKey; +import com.netflix.hystrix.HystrixThreadPoolMetrics; +import com.netflix.hystrix.util.HystrixRollingNumberEvent; /** * @author Spencer Gibb @@ -57,7 +56,7 @@ public class HystrixStreamTask implements ApplicationContextAware { private MessageChannel outboundChannel; - private Registration registration; + private ServiceInstance registration; private HystrixStreamProperties properties; @@ -69,13 +68,20 @@ public class HystrixStreamTask implements ApplicationContextAware { private final JsonFactory jsonFactory = new JsonFactory(); public HystrixStreamTask(MessageChannel outboundChannel, - Registration registration, HystrixStreamProperties properties) { + ServiceInstance registration, HystrixStreamProperties properties) { + Assert.notNull(outboundChannel, "outboundChannel may not be null"); + Assert.notNull(registration, "registration may not be null"); + Assert.notNull(properties, "properties may not be null"); this.outboundChannel = outboundChannel; this.registration = registration; this.properties = properties; this.jsonMetrics = new LinkedBlockingQueue<>(properties.getSize()); } + /* for testing */ ServiceInstance getRegistration() { + return registration; + } + @Override public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { diff --git a/spring-cloud-netflix-hystrix-stream/src/test/java/org/springframework/cloud/netflix/hystrix/stream/HystrixStreamAutoConfigurationNoRegistrationTests.java b/spring-cloud-netflix-hystrix-stream/src/test/java/org/springframework/cloud/netflix/hystrix/stream/HystrixStreamAutoConfigurationNoRegistrationTests.java new file mode 100644 index 00000000..dc18ccb8 --- /dev/null +++ b/spring-cloud-netflix-hystrix-stream/src/test/java/org/springframework/cloud/netflix/hystrix/stream/HystrixStreamAutoConfigurationNoRegistrationTests.java @@ -0,0 +1,61 @@ +/* + * Copyright 2013-2017 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.springframework.cloud.netflix.hystrix.stream; + +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.SpringBootConfiguration; +import org.springframework.boot.autoconfigure.EnableAutoConfiguration; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.cloud.client.discovery.simple.SimpleDiscoveryClient; +import org.springframework.cloud.client.serviceregistry.Registration; +import org.springframework.test.annotation.DirtiesContext; +import org.springframework.test.context.junit4.SpringRunner; + +import static org.assertj.core.api.Assertions.assertThat; + +/** + * @author Spencer Gibb + */ +@RunWith(SpringRunner.class) +@SpringBootTest("eureka.client.enabled=false") +@DirtiesContext +public class HystrixStreamAutoConfigurationNoRegistrationTests { + + @Autowired + HystrixStreamTask task; + + @Autowired(required = false) + Registration registration; + + @Autowired + SimpleDiscoveryClient simpleDiscoveryClient; + + @Test + public void withoutRegistrationWorks() throws Exception { + assertThat(this.registration).isNull(); + assertThat(this.simpleDiscoveryClient).isNotNull(); + assertThat(task.getRegistration()).isEqualTo(this.simpleDiscoveryClient.getLocalServiceInstance()); + } + + @EnableAutoConfiguration + @SpringBootConfiguration + protected static class Config { + } + +} diff --git a/spring-cloud-netflix-hystrix-stream/src/test/java/org/springframework/cloud/netflix/hystrix/stream/HystrixStreamAutoConfigurationTests.java b/spring-cloud-netflix-hystrix-stream/src/test/java/org/springframework/cloud/netflix/hystrix/stream/HystrixStreamAutoConfigurationTests.java new file mode 100644 index 00000000..8473aae0 --- /dev/null +++ b/spring-cloud-netflix-hystrix-stream/src/test/java/org/springframework/cloud/netflix/hystrix/stream/HystrixStreamAutoConfigurationTests.java @@ -0,0 +1,53 @@ +/* + * Copyright 2013-2017 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.springframework.cloud.netflix.hystrix.stream; + +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.SpringBootConfiguration; +import org.springframework.boot.autoconfigure.EnableAutoConfiguration; +import org.springframework.cloud.client.serviceregistry.Registration; +import org.springframework.test.annotation.DirtiesContext; +import org.springframework.test.context.junit4.SpringRunner; + +import static org.assertj.core.api.Assertions.assertThat; + +/** + * @author Spencer Gibb + */ +@RunWith(SpringRunner.class) +@DirtiesContext +public class HystrixStreamAutoConfigurationTests { + + @Autowired + HystrixStreamTask task; + + @Autowired + Registration registration; + + @Test + public void withRegistrationWorks() throws Exception { + assertThat(task.getRegistration()).isEqualTo(this.registration); + } + + @EnableAutoConfiguration + @SpringBootConfiguration + protected static class Config { + } + +}