-
Notifications
You must be signed in to change notification settings - Fork 4.7k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge pull request #1397 from michaelcowan/feature/optionally-raise-h…
…ystrix-runtime-exception Add option to raise HystrixRuntimeException
- Loading branch information
Showing
7 changed files
with
211 additions
and
9 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
8 changes: 8 additions & 0 deletions
8
...anica/src/main/java/com/netflix/hystrix/contrib/javanica/annotation/HystrixException.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,8 @@ | ||
package com.netflix.hystrix.contrib.javanica.annotation; | ||
|
||
/** | ||
* Created by Mike Cowan | ||
*/ | ||
public enum HystrixException { | ||
RUNTIME_EXCEPTION, | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
123 changes: 123 additions & 0 deletions
123
...ix/hystrix/contrib/javanica/test/common/error/BasicDefaultRaiseHystrixExceptionsTest.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,123 @@ | ||
package com.netflix.hystrix.contrib.javanica.test.common.error; | ||
|
||
import org.junit.Before; | ||
import org.junit.Ignore; | ||
import org.junit.Test; | ||
|
||
import com.netflix.hystrix.contrib.javanica.annotation.DefaultProperties; | ||
import com.netflix.hystrix.contrib.javanica.annotation.HystrixCommand; | ||
import com.netflix.hystrix.contrib.javanica.annotation.HystrixException; | ||
import com.netflix.hystrix.exception.HystrixRuntimeException; | ||
|
||
/** | ||
* Created by Mike Cowan | ||
*/ | ||
public abstract class BasicDefaultRaiseHystrixExceptionsTest { | ||
|
||
private Service service; | ||
|
||
@Before | ||
public void setUp() throws Exception { | ||
service = createService(); | ||
} | ||
|
||
protected abstract Service createService(); | ||
|
||
@Test(expected = BadRequestException.class) | ||
public void testDefaultIgnoreException() { | ||
service.commandInheritsDefaultIgnoreExceptions(); | ||
} | ||
|
||
@Test(expected = SpecificException.class) | ||
public void testCommandOverridesDefaultIgnoreExceptions() { | ||
service.commandOverridesDefaultIgnoreExceptions(SpecificException.class); | ||
} | ||
|
||
@Test(expected = HystrixRuntimeException.class) | ||
public void testCommandOverridesDefaultIgnoreExceptions_nonIgnoreExceptionShouldBePropagated() { | ||
// method throws BadRequestException that isn't ignored | ||
service.commandOverridesDefaultIgnoreExceptions(BadRequestException.class); | ||
} | ||
|
||
@Ignore // https://github.com/Netflix/Hystrix/issues/993#issuecomment-229542203 | ||
@Test(expected = BadRequestException.class) | ||
public void testFallbackCommandInheritsDefaultIgnoreException() { | ||
service.commandWithFallbackInheritsDefaultIgnoreExceptions(); | ||
} | ||
|
||
@Ignore // https://github.com/Netflix/Hystrix/issues/993#issuecomment-229542203 | ||
@Test(expected = SpecificException.class) | ||
public void testFallbackCommandOverridesDefaultIgnoreExceptions() { | ||
service.commandWithFallbackOverridesDefaultIgnoreExceptions(SpecificException.class); | ||
} | ||
|
||
@Test(expected = HystrixRuntimeException.class) | ||
public void testFallbackCommandOverridesDefaultIgnoreExceptions_nonIgnoreExceptionShouldBePropagated() { | ||
service.commandWithFallbackOverridesDefaultIgnoreExceptions(BadRequestException.class); | ||
} | ||
|
||
@DefaultProperties(ignoreExceptions = BadRequestException.class, raiseHystrixExceptions = {HystrixException.RUNTIME_EXCEPTION}) | ||
public static class Service { | ||
@HystrixCommand | ||
public Object commandInheritsDefaultIgnoreExceptions() throws BadRequestException { | ||
// this exception will be ignored (wrapped in HystrixBadRequestException) because specified in default ignore exceptions | ||
throw new BadRequestException("from 'commandInheritsIgnoreExceptionsFromDefault'"); | ||
} | ||
|
||
@HystrixCommand(ignoreExceptions = SpecificException.class) | ||
public Object commandOverridesDefaultIgnoreExceptions(Class<? extends Throwable> errorType) throws BadRequestException, SpecificException { | ||
if(errorType.equals(BadRequestException.class)){ | ||
// isn't ignored because command doesn't specify this exception type in 'ignoreExceptions' | ||
throw new BadRequestException("from 'commandOverridesDefaultIgnoreExceptions', cause: " + errorType.getSimpleName()); | ||
} | ||
// something went wrong, this error is ignored because specified in the command's ignoreExceptions | ||
throw new SpecificException("from 'commandOverridesDefaultIgnoreExceptions', cause: " + errorType.getSimpleName()); | ||
} | ||
|
||
@HystrixCommand(fallbackMethod = "fallbackInheritsDefaultIgnoreExceptions") | ||
public Object commandWithFallbackInheritsDefaultIgnoreExceptions() throws SpecificException { | ||
// isn't ignored, need to trigger fallback | ||
throw new SpecificException("from 'commandWithFallbackInheritsDefaultIgnoreExceptions'"); | ||
} | ||
|
||
@HystrixCommand | ||
private Object fallbackInheritsDefaultIgnoreExceptions() throws BadRequestException { | ||
// should be ignored because specified in global ignore exception, fallback command inherits default ignore exceptions | ||
throw new BadRequestException("from 'fallbackInheritsDefaultIgnoreExceptions'"); | ||
} | ||
|
||
@HystrixCommand(fallbackMethod = "fallbackOverridesDefaultIgnoreExceptions") | ||
public Object commandWithFallbackOverridesDefaultIgnoreExceptions(Class<? extends Throwable> errorType) { | ||
// isn't ignored, need to trigger fallback | ||
throw new SpecificException(); | ||
} | ||
|
||
@HystrixCommand(ignoreExceptions = SpecificException.class) | ||
private Object fallbackOverridesDefaultIgnoreExceptions(Class<? extends Throwable> errorType) { | ||
if(errorType.equals(BadRequestException.class)){ | ||
// isn't ignored because fallback doesn't specify this exception type in 'ignoreExceptions' | ||
throw new BadRequestException("from 'fallbackOverridesDefaultIgnoreExceptions', cause: " + errorType.getSimpleName()); | ||
} | ||
// something went wrong, this error is ignored because specified in the fallback's ignoreExceptions | ||
throw new SpecificException("from 'commandOverridesDefaultIgnoreExceptions', cause: " + errorType.getSimpleName()); | ||
} | ||
} | ||
|
||
public static final class BadRequestException extends RuntimeException { | ||
public BadRequestException() { | ||
} | ||
|
||
public BadRequestException(String message) { | ||
super(message); | ||
} | ||
} | ||
|
||
public static final class SpecificException extends RuntimeException { | ||
public SpecificException() { | ||
} | ||
|
||
public SpecificException(String message) { | ||
super(message); | ||
} | ||
} | ||
} |
36 changes: 36 additions & 0 deletions
36
...netflix/hystrix/contrib/javanica/test/spring/error/DefaultRaiseHystrixExceptionsTest.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,36 @@ | ||
package com.netflix.hystrix.contrib.javanica.test.spring.error; | ||
|
||
import org.junit.runner.RunWith; | ||
import org.springframework.beans.factory.annotation.Autowired; | ||
import org.springframework.beans.factory.annotation.Configurable; | ||
import org.springframework.context.annotation.Bean; | ||
import org.springframework.test.context.ContextConfiguration; | ||
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; | ||
|
||
import com.netflix.hystrix.contrib.javanica.test.common.error.BasicDefaultRaiseHystrixExceptionsTest; | ||
import com.netflix.hystrix.contrib.javanica.test.spring.conf.AopCglibConfig; | ||
|
||
/** | ||
* Created by Mike Cowan | ||
*/ | ||
@RunWith(SpringJUnit4ClassRunner.class) | ||
@ContextConfiguration(classes = {AopCglibConfig.class, DefaultRaiseHystrixExceptionsTest.DefaultRaiseHystrixExceptionsTestConfig.class}) | ||
public class DefaultRaiseHystrixExceptionsTest extends BasicDefaultRaiseHystrixExceptionsTest { | ||
|
||
@Autowired | ||
private BasicDefaultRaiseHystrixExceptionsTest.Service service; | ||
|
||
@Override | ||
protected BasicDefaultRaiseHystrixExceptionsTest.Service createService() { | ||
return service; | ||
} | ||
|
||
@Configurable | ||
public static class DefaultRaiseHystrixExceptionsTestConfig { | ||
|
||
@Bean | ||
public BasicDefaultRaiseHystrixExceptionsTest.Service userService() { | ||
return new BasicDefaultRaiseHystrixExceptionsTest.Service(); | ||
} | ||
} | ||
} |