Repository: cxf Updated Branches: refs/heads/3.1.x-fixes 31d9b4548 -> ad577419d
Adding a basic Throttling manager Project: http://git-wip-us.apache.org/repos/asf/cxf/repo Commit: http://git-wip-us.apache.org/repos/asf/cxf/commit/8781a1c0 Tree: http://git-wip-us.apache.org/repos/asf/cxf/tree/8781a1c0 Diff: http://git-wip-us.apache.org/repos/asf/cxf/diff/8781a1c0 Branch: refs/heads/3.1.x-fixes Commit: 8781a1c0cfea708e3915e72b83c50877969774a2 Parents: 31d9b45 Author: Sergey Beryozkin <[email protected]> Authored: Mon Feb 1 15:28:35 2016 +0000 Committer: Sergey Beryozkin <[email protected]> Committed: Mon Feb 1 15:32:26 2016 +0000 ---------------------------------------------------------------------- .../cxf/throttling/SimpleThrottlingManager.java | 63 ++++++++++++++++++++ .../cxf/throttling/ThrottlingCounter.java | 32 ++++++++++ .../ThrottlingResponseInterceptor.java | 4 ++ 3 files changed, 99 insertions(+) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/cxf/blob/8781a1c0/rt/features/throttling/src/main/java/org/apache/cxf/throttling/SimpleThrottlingManager.java ---------------------------------------------------------------------- diff --git a/rt/features/throttling/src/main/java/org/apache/cxf/throttling/SimpleThrottlingManager.java b/rt/features/throttling/src/main/java/org/apache/cxf/throttling/SimpleThrottlingManager.java new file mode 100644 index 0000000..7fefbe9 --- /dev/null +++ b/rt/features/throttling/src/main/java/org/apache/cxf/throttling/SimpleThrottlingManager.java @@ -0,0 +1,63 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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.apache.cxf.throttling; + +import java.util.Collections; +import java.util.List; + +import org.apache.cxf.message.Message; +import org.apache.cxf.phase.Phase; + +/** + * Suspends or aborts the requests if the threshold has been reached + */ +public class SimpleThrottlingManager extends ThrottleResponse implements ThrottlingManager { + private static final String THROTTLED_KEY = "THROTTLED"; + + private int threshold; + private ThrottlingCounter counter = new ThrottlingCounter(); + + @Override + public List<String> getDecisionPhases() { + return Collections.singletonList(Phase.PRE_STREAM); + } + + @Override + public ThrottleResponse getThrottleResponse(String phase, Message m) { + if (m.containsKey(THROTTLED_KEY)) { + return null; + } + m.put(ThrottlingCounter.class, counter); + if (counter.incrementAndGet() >= threshold) { + m.put(THROTTLED_KEY, true); + return this; + } else { + return null; + } + } + + public int getThreshold() { + return threshold; + } + + public void setThreshold(int threshold) { + this.threshold = threshold; + } + +} http://git-wip-us.apache.org/repos/asf/cxf/blob/8781a1c0/rt/features/throttling/src/main/java/org/apache/cxf/throttling/ThrottlingCounter.java ---------------------------------------------------------------------- diff --git a/rt/features/throttling/src/main/java/org/apache/cxf/throttling/ThrottlingCounter.java b/rt/features/throttling/src/main/java/org/apache/cxf/throttling/ThrottlingCounter.java new file mode 100644 index 0000000..1901bc6 --- /dev/null +++ b/rt/features/throttling/src/main/java/org/apache/cxf/throttling/ThrottlingCounter.java @@ -0,0 +1,32 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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.apache.cxf.throttling; + +import java.util.concurrent.atomic.AtomicInteger; + +public class ThrottlingCounter { + private static final AtomicInteger COUNTER = new AtomicInteger(); + public int incrementAndGet() { + return COUNTER.incrementAndGet(); + } + public int decrementAndGet() { + return COUNTER.decrementAndGet(); + } + +} http://git-wip-us.apache.org/repos/asf/cxf/blob/8781a1c0/rt/features/throttling/src/main/java/org/apache/cxf/throttling/ThrottlingResponseInterceptor.java ---------------------------------------------------------------------- diff --git a/rt/features/throttling/src/main/java/org/apache/cxf/throttling/ThrottlingResponseInterceptor.java b/rt/features/throttling/src/main/java/org/apache/cxf/throttling/ThrottlingResponseInterceptor.java index 9992abd..96a862b 100644 --- a/rt/features/throttling/src/main/java/org/apache/cxf/throttling/ThrottlingResponseInterceptor.java +++ b/rt/features/throttling/src/main/java/org/apache/cxf/throttling/ThrottlingResponseInterceptor.java @@ -69,5 +69,9 @@ public class ThrottlingResponseInterceptor extends AbstractPhaseInterceptor<Mess headers.put("Retry-After", Collections.singletonList(retryAfter)); } } + ThrottlingCounter tCounter = message.getExchange().get(ThrottlingCounter.class); + if (tCounter != null) { + tCounter.decrementAndGet(); + } } }
