You're seeing the release note of an old version. Check out the latest release note.
v0.99.6
May 28, 2020
🌟 New features
-
New
CircuitBreakerRuleandCircuitBreakerRuleWithContentAPI let you define a complex circuit breaking policy conveniently. #2726CircuitBreakerRule myRule =
CircuitBreakerRule.of(
// A failure if an Exception is raised.
CircuitBreakerRule.onException(),
// Neither a success nor a failure because
// the request has not been handled by the server.
CircuitBreakerRule.builder()
.onUnprocessed()
.thenIgnore(),
// A failure if the response is 5xx.
CircuitBreakerRule.onServerErrorStatus(),
// A success if the response is 2xx.
CircuitBreakerRule.builder()
.onStatusClass(HttpStatusClass.SUCCESS)
.thenSuccess(),
// Neither a success nor a failure. Do not take this response into account.
CircuitBreakerRule.builder().thenIgnore()); -
You can now easily bind an MDC property to a
RequestContextand log it using a logging framework. #2634 #2724 #2729MDC.put("transactionId", "1234");
WebClient client = ...;
try (SafeCloseable ignored = Clients.withContextCustomizer(ctx -> {
RequestScopedMdc.copy(ctx, "transactionId");
}) {
assert MDC.get("transactionId").equals("1234");
client.execute(...);
} -
You can now install a custom hook to
RequestContextStoragein runtime, usually at startup time. #2723RequestContextStorage.hook(delegate -> new RequestContextStorageWrapper(delegate) {
@Nullable
@Override
public <T extends RequestContext> T push(RequestContext toPush) {
// Usually, you can just use RequestScopedMdc for this purpose.
MDC.put("foo", toPush.attr(FOO));
return super.push(toPush);
}
@Override
public void pop(RequestContext current, @Nullable RequestContext toRestore) {
MDC.remove("foo");
super.pop(current, toRestore);
}
...
} -
You can now set method parameter descriptions for annotated services in
DocServiceusing Javadoc. #2697 -
You can now easily sanitize headers and content using
RegexBasedSanitizer. #1810 #2721
📈 Improvements
- You can now easily call
ownAttr()fromRequestContext. #2727- You don't have to check if the context is
ClientRequestContextor not anymore. root()andownAttrs()are pulled up as well.
- You don't have to check if the context is
🛠️ Bug fixes
- You can now use Armeria 0.99.6 with Micrometer 1.3.9. (It is recommended to use Micrometer 1.5.1, though.) #2742
- You can now retry even when the current
EndpointGroupis empty. #2736 - You can send a request by setting the authority and scheme header to
RequestHeaders. #2730 #2734 - You no longer see
<zero-length response>inDocServiceanymore. #2732 - A
NullPointerExceptionis not raised anymore due to the dependency order when Armeria is shaded. #2731 #2735
☢️ Breaking changes
RetryStrategyandRetryStrategyWithContentare gone in favor ofRetryRuleandRetryRuleWithContent. #2726CircuitBreakerStrategyandCircuitBreakerStrategyWithContentare gone in favor ofCircuitBreakerRuleandCircuitBreakerRuleWithContent. #2726EndpointSelector.select()(and thus EndpointGroup.select() as well) now returnsnullinstead of throwing anEmptyEndpointGroupException. #2736- The method signature of
ClientFactory.acquireEventLoop()andEventLoopScheduler.acquire()have been changed. #2736
⛓ Dependencies
- Brave 5.11.2 → 5.12.3
- grpc-kotlin-stub 0.1.1 → 0.1.2
- io.dropwizard.metrics 4.1.7 → 4.1.9
- Jetty 9.4.28.v20200408 → 9.4.29.v20200521
- reactor-grpc 1.0.0 → 1.0.1
- Retrofit 2.8.1 → 2.9.0
- Rxjava3 3.0.3 → 3.0.4
- Shaded dependencies
- Caffeine 2.8.2 → 2.8.4
- Example dependencies
- Kotlin 1.3.71 → 1.3.72
- Kotlin Coroutines 1.3.6 → 1.3.7
🙇 Thank you
This release was possible thanks to the following contributors who shared their brilliant ideas and awesome pull requests:












