From e94d74bd8795da53d9c5438f15399fc7c6471257 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=97=B6=E6=97=A0=E4=B8=A4=E4=B8=B6?= <442367943@qq.com> Date: Tue, 30 Oct 2018 15:15:34 +0800 Subject: [PATCH 01/23] Optimize heartbeat and reconnect task. (#2658) * Optimize heartbeat and reconnect task. 1.Use hashedWheelTimer. 2.Distinguish between reconnect and heartbeat. 3.Increase inspection cycle. * fix ci fail. * fix ci fail. * fix ci fail. --- .../org/apache/dubbo/common/Constants.java | 10 ++ .../dubbo/common/timer/HashedWheelTimer.java | 5 + .../org/apache/dubbo/common/timer/Timer.java | 7 ++ .../support/header/AbstractTimerTask.java | 90 +++++++++++++++++ .../support/header/HeaderExchangeClient.java | 65 ++++++------- .../support/header/HeaderExchangeServer.java | 69 ++++++------- .../support/header/HeartBeatTask.java | 97 ------------------- .../support/header/HeartbeatTimerTask.java | 61 ++++++++++++ .../support/header/ReconnectTimerTask.java | 61 ++++++++++++ .../support/header/HeartBeatTaskTest.java | 29 +++--- .../support/header/HeartbeatHandlerTest.java | 8 +- .../netty/NettyClientToServerTest.java | 11 ++- .../netty4/NettyClientToServerTest.java | 11 ++- 13 files changed, 342 insertions(+), 182 deletions(-) create mode 100644 dubbo-remoting/dubbo-remoting-api/src/main/java/org/apache/dubbo/remoting/exchange/support/header/AbstractTimerTask.java delete mode 100644 dubbo-remoting/dubbo-remoting-api/src/main/java/org/apache/dubbo/remoting/exchange/support/header/HeartBeatTask.java create mode 100644 dubbo-remoting/dubbo-remoting-api/src/main/java/org/apache/dubbo/remoting/exchange/support/header/HeartbeatTimerTask.java create mode 100644 dubbo-remoting/dubbo-remoting-api/src/main/java/org/apache/dubbo/remoting/exchange/support/header/ReconnectTimerTask.java diff --git a/dubbo-common/src/main/java/org/apache/dubbo/common/Constants.java b/dubbo-common/src/main/java/org/apache/dubbo/common/Constants.java index 4d6e7585cf..9ddac89c0f 100644 --- a/dubbo-common/src/main/java/org/apache/dubbo/common/Constants.java +++ b/dubbo-common/src/main/java/org/apache/dubbo/common/Constants.java @@ -19,6 +19,7 @@ package org.apache.dubbo.common; import java.util.concurrent.ExecutorService; import java.util.regex.Pattern; + /** * Constants */ @@ -246,6 +247,15 @@ public class Constants { public static final String HEARTBEAT_KEY = "heartbeat"; + public static final int HEARTBEAT_TICK = 3; + + public static final long LEAST_HEARTBEAT_TICK = 1000; + + /** + * ticks per wheel. Currently only contains two tasks, so 16 locations are enough + */ + public static final int TICKS_PER_WHEEL = 16; + public static final String HEARTBEAT_TIMEOUT_KEY = "heartbeat.timeout"; public static final String CONNECT_TIMEOUT_KEY = "connect.timeout"; diff --git a/dubbo-common/src/main/java/org/apache/dubbo/common/timer/HashedWheelTimer.java b/dubbo-common/src/main/java/org/apache/dubbo/common/timer/HashedWheelTimer.java index a54cc70b9b..7801ce06a4 100644 --- a/dubbo-common/src/main/java/org/apache/dubbo/common/timer/HashedWheelTimer.java +++ b/dubbo-common/src/main/java/org/apache/dubbo/common/timer/HashedWheelTimer.java @@ -367,6 +367,11 @@ public class HashedWheelTimer implements Timer { return worker.unprocessedTimeouts(); } + @Override + public boolean isStop() { + return WORKER_STATE_SHUTDOWN == WORKER_STATE_UPDATER.get(this); + } + @Override public Timeout newTimeout(TimerTask task, long delay, TimeUnit unit) { if (task == null) { diff --git a/dubbo-common/src/main/java/org/apache/dubbo/common/timer/Timer.java b/dubbo-common/src/main/java/org/apache/dubbo/common/timer/Timer.java index 9e87059124..881fab95a5 100644 --- a/dubbo-common/src/main/java/org/apache/dubbo/common/timer/Timer.java +++ b/dubbo-common/src/main/java/org/apache/dubbo/common/timer/Timer.java @@ -45,4 +45,11 @@ public interface Timer { * this method */ Set stop(); + + /** + * the timer is stop + * + * @return true for stop + */ + boolean isStop(); } \ No newline at end of file diff --git a/dubbo-remoting/dubbo-remoting-api/src/main/java/org/apache/dubbo/remoting/exchange/support/header/AbstractTimerTask.java b/dubbo-remoting/dubbo-remoting-api/src/main/java/org/apache/dubbo/remoting/exchange/support/header/AbstractTimerTask.java new file mode 100644 index 0000000000..a2d6a2b8ec --- /dev/null +++ b/dubbo-remoting/dubbo-remoting-api/src/main/java/org/apache/dubbo/remoting/exchange/support/header/AbstractTimerTask.java @@ -0,0 +1,90 @@ +/* + * 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.dubbo.remoting.exchange.support.header; + +import org.apache.dubbo.common.timer.Timeout; +import org.apache.dubbo.common.timer.Timer; +import org.apache.dubbo.common.timer.TimerTask; +import org.apache.dubbo.remoting.Channel; + +import java.util.Collection; +import java.util.concurrent.TimeUnit; + +/** + * AbstractTimerTask + */ +public abstract class AbstractTimerTask implements TimerTask { + + protected final ChannelProvider channelProvider; + + protected final Long tick; + + protected AbstractTimerTask(ChannelProvider channelProvider, Long tick) { + if (channelProvider == null || tick == null) { + throw new IllegalArgumentException(); + } + this.tick = tick; + this.channelProvider = channelProvider; + } + + protected Long lastRead(Channel channel) { + return (Long) channel.getAttribute( + HeaderExchangeHandler.KEY_READ_TIMESTAMP); + } + + protected Long lastWrite(Channel channel) { + return (Long) channel.getAttribute( + HeaderExchangeHandler.KEY_WRITE_TIMESTAMP); + } + + protected Long now() { + return System.currentTimeMillis(); + } + + protected void reput(Timeout timeout, Long tick) { + if (timeout == null || tick == null) { + throw new IllegalArgumentException(); + } + Timer timer = timeout.timer(); + if (timer.isStop()) { + return; + } + if (timeout.isCancelled()) { + return; + } + timer.newTimeout(timeout.task(), tick, TimeUnit.MILLISECONDS); + } + + @Override + public void run(Timeout timeout) throws Exception { + Collection c = channelProvider.getChannels(); + for (Channel channel : c) { + if (channel.isClosed()) { + continue; + } + doTask(channel); + } + reput(timeout, tick); + } + + protected abstract void doTask(Channel channel); + + interface ChannelProvider { + Collection getChannels(); + } +} diff --git a/dubbo-remoting/dubbo-remoting-api/src/main/java/org/apache/dubbo/remoting/exchange/support/header/HeaderExchangeClient.java b/dubbo-remoting/dubbo-remoting-api/src/main/java/org/apache/dubbo/remoting/exchange/support/header/HeaderExchangeClient.java index feac1bff7d..66cf55ceae 100644 --- a/dubbo-remoting/dubbo-remoting-api/src/main/java/org/apache/dubbo/remoting/exchange/support/header/HeaderExchangeClient.java +++ b/dubbo-remoting/dubbo-remoting-api/src/main/java/org/apache/dubbo/remoting/exchange/support/header/HeaderExchangeClient.java @@ -18,10 +18,7 @@ package org.apache.dubbo.remoting.exchange.support.header; import org.apache.dubbo.common.Constants; import org.apache.dubbo.common.URL; -import org.apache.dubbo.common.logger.Logger; -import org.apache.dubbo.common.logger.LoggerFactory; -import org.apache.dubbo.common.utils.NamedThreadFactory; -import org.apache.dubbo.remoting.Channel; +import org.apache.dubbo.common.timer.HashedWheelTimer; import org.apache.dubbo.remoting.ChannelHandler; import org.apache.dubbo.remoting.Client; import org.apache.dubbo.remoting.RemotingException; @@ -31,10 +28,7 @@ import org.apache.dubbo.remoting.exchange.ExchangeHandler; import org.apache.dubbo.remoting.exchange.ResponseFuture; import java.net.InetSocketAddress; -import java.util.Collection; import java.util.Collections; -import java.util.concurrent.ScheduledFuture; -import java.util.concurrent.ScheduledThreadPoolExecutor; import java.util.concurrent.TimeUnit; /** @@ -42,17 +36,14 @@ import java.util.concurrent.TimeUnit; */ public class HeaderExchangeClient implements ExchangeClient { - private static final Logger logger = LoggerFactory.getLogger(HeaderExchangeClient.class); - - private static final ScheduledThreadPoolExecutor scheduled = new ScheduledThreadPoolExecutor(2, new NamedThreadFactory("dubbo-remoting-client-heartbeat", true)); private final Client client; private final ExchangeChannel channel; - // heartbeat timer - private ScheduledFuture heartbeatTimer; // heartbeat(ms), default value is 0 , won't execute a heartbeat. private int heartbeat; private int heartbeatTimeout; + private HashedWheelTimer heartbeatTimer; + public HeaderExchangeClient(Client client, boolean needHeartbeat) { if (client == null) { throw new IllegalArgumentException("client == null"); @@ -65,7 +56,12 @@ public class HeaderExchangeClient implements ExchangeClient { if (heartbeatTimeout < heartbeat * 2) { throw new IllegalStateException("heartbeatTimeout < heartbeatInterval * 2"); } + if (needHeartbeat) { + long heartbeatTick = calcLeastTick(heartbeat); + + // use heartbeatTick as every tick. + heartbeatTimer = new HashedWheelTimer(heartbeatTick, TimeUnit.MILLISECONDS, Constants.TICKS_PER_WHEEL); startHeartbeatTimer(); } } @@ -181,37 +177,40 @@ public class HeaderExchangeClient implements ExchangeClient { } private void startHeartbeatTimer() { - stopHeartbeatTimer(); - if (heartbeat > 0) { - heartbeatTimer = scheduled.scheduleWithFixedDelay( - new HeartBeatTask(new HeartBeatTask.ChannelProvider() { - @Override - public Collection getChannels() { - return Collections.singletonList(HeaderExchangeClient.this); - } - }, heartbeat, heartbeatTimeout), - heartbeat, heartbeat, TimeUnit.MILLISECONDS); - } + AbstractTimerTask.ChannelProvider cp = () -> Collections.singletonList(HeaderExchangeClient.this); + + long heartbeatTick = calcLeastTick(heartbeat); + long heartbeatTimeoutTick = calcLeastTick(heartbeatTimeout); + HeartbeatTimerTask heartBeatTimerTask = new HeartbeatTimerTask(cp, heartbeatTick, heartbeat); + ReconnectTimerTask reconnectTimerTask = new ReconnectTimerTask(cp, heartbeatTimeoutTick, heartbeatTimeout); + + // init task and start timer. + heartbeatTimer.newTimeout(heartBeatTimerTask, heartbeatTick, TimeUnit.MILLISECONDS); + heartbeatTimer.newTimeout(reconnectTimerTask, heartbeatTimeoutTick, TimeUnit.MILLISECONDS); } private void stopHeartbeatTimer() { - if (heartbeatTimer != null && !heartbeatTimer.isCancelled()) { - try { - heartbeatTimer.cancel(true); - scheduled.purge(); - } catch (Throwable e) { - if (logger.isWarnEnabled()) { - logger.warn(e.getMessage(), e); - } - } + if (heartbeatTimer != null) { + heartbeatTimer.stop(); + heartbeatTimer = null; } - heartbeatTimer = null; } private void doClose() { stopHeartbeatTimer(); } + /** + * Each interval cannot be less than 1000ms. + */ + private long calcLeastTick(int time) { + if (time / Constants.HEARTBEAT_TICK <= 0) { + return Constants.LEAST_HEARTBEAT_TICK; + } else { + return time / Constants.HEARTBEAT_TICK; + } + } + @Override public String toString() { return "HeaderExchangeClient [channel=" + channel + "]"; diff --git a/dubbo-remoting/dubbo-remoting-api/src/main/java/org/apache/dubbo/remoting/exchange/support/header/HeaderExchangeServer.java b/dubbo-remoting/dubbo-remoting-api/src/main/java/org/apache/dubbo/remoting/exchange/support/header/HeaderExchangeServer.java index 8eceb182e4..d091b8f45a 100644 --- a/dubbo-remoting/dubbo-remoting-api/src/main/java/org/apache/dubbo/remoting/exchange/support/header/HeaderExchangeServer.java +++ b/dubbo-remoting/dubbo-remoting-api/src/main/java/org/apache/dubbo/remoting/exchange/support/header/HeaderExchangeServer.java @@ -21,7 +21,7 @@ import org.apache.dubbo.common.URL; import org.apache.dubbo.common.Version; import org.apache.dubbo.common.logger.Logger; import org.apache.dubbo.common.logger.LoggerFactory; -import org.apache.dubbo.common.utils.NamedThreadFactory; +import org.apache.dubbo.common.timer.HashedWheelTimer; import org.apache.dubbo.remoting.Channel; import org.apache.dubbo.remoting.ChannelHandler; import org.apache.dubbo.remoting.RemotingException; @@ -34,9 +34,6 @@ import java.net.InetSocketAddress; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; -import java.util.concurrent.Executors; -import java.util.concurrent.ScheduledExecutorService; -import java.util.concurrent.ScheduledFuture; import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicBoolean; @@ -47,18 +44,14 @@ public class HeaderExchangeServer implements ExchangeServer { protected final Logger logger = LoggerFactory.getLogger(getClass()); - private final ScheduledExecutorService scheduled = Executors.newScheduledThreadPool(1, - new NamedThreadFactory( - "dubbo-remoting-server-heartbeat", - true)); private final Server server; - // heartbeat timer - private ScheduledFuture heartbeatTimer; // heartbeat timeout (ms), default value is 0 , won't execute a heartbeat. private int heartbeat; private int heartbeatTimeout; private AtomicBoolean closed = new AtomicBoolean(false); + private HashedWheelTimer heartbeatTimer; + public HeaderExchangeServer(Server server) { if (server == null) { throw new IllegalArgumentException("server == null"); @@ -69,6 +62,10 @@ public class HeaderExchangeServer implements ExchangeServer { if (heartbeatTimeout < heartbeat * 2) { throw new IllegalStateException("heartbeatTimeout < heartbeatInterval * 2"); } + + long heartbeatTick = calcLeastTick(heartbeat); + // use heartbeatTick as every tick. + heartbeatTimer = new HashedWheelTimer(heartbeatTick, TimeUnit.MILLISECONDS, Constants.TICKS_PER_WHEEL); startHeartbeatTimer(); } @@ -153,11 +150,6 @@ public class HeaderExchangeServer implements ExchangeServer { return; } stopHeartbeatTimer(); - try { - scheduled.shutdown(); - } catch (Throwable t) { - logger.warn(t.getMessage(), t); - } } @Override @@ -223,6 +215,12 @@ public class HeaderExchangeServer implements ExchangeServer { if (h != heartbeat || t != heartbeatTimeout) { heartbeat = h; heartbeatTimeout = t; + + stopHeartbeatTimer(); + + long heartbeatTick = calcLeastTick(heartbeat); + // use heartbeatTick as every tick. + heartbeatTimer = new HashedWheelTimer(heartbeatTick, TimeUnit.MILLISECONDS, Constants.TICKS_PER_WHEEL); startHeartbeatTimer(); } } @@ -254,29 +252,32 @@ public class HeaderExchangeServer implements ExchangeServer { } private void startHeartbeatTimer() { - stopHeartbeatTimer(); - if (heartbeat > 0) { - heartbeatTimer = scheduled.scheduleWithFixedDelay( - new HeartBeatTask(new HeartBeatTask.ChannelProvider() { - @Override - public Collection getChannels() { - return Collections.unmodifiableCollection( - HeaderExchangeServer.this.getChannels()); - } - }, heartbeat, heartbeatTimeout), - heartbeat, heartbeat, TimeUnit.MILLISECONDS); + AbstractTimerTask.ChannelProvider cp = () -> Collections.unmodifiableCollection(HeaderExchangeServer.this.getChannels()); + + long heartbeatTick = calcLeastTick(heartbeat); + long heartbeatTimeoutTick = calcLeastTick(heartbeatTimeout); + HeartbeatTimerTask heartBeatTimerTask = new HeartbeatTimerTask(cp, heartbeatTick, heartbeat); + ReconnectTimerTask reconnectTimerTask = new ReconnectTimerTask(cp, heartbeatTimeoutTick, heartbeatTimeout); + + // init task and start timer. + heartbeatTimer.newTimeout(heartBeatTimerTask, heartbeatTick, TimeUnit.MILLISECONDS); + heartbeatTimer.newTimeout(reconnectTimerTask, heartbeatTimeoutTick, TimeUnit.MILLISECONDS); + } + + /** + * Each interval cannot be less than 1000ms. + */ + private long calcLeastTick(int time) { + if (time / Constants.HEARTBEAT_TICK <= 0) { + return Constants.LEAST_HEARTBEAT_TICK; + } else { + return time / Constants.HEARTBEAT_TICK; } } private void stopHeartbeatTimer() { - try { - ScheduledFuture timer = heartbeatTimer; - if (timer != null && !timer.isCancelled()) { - timer.cancel(true); - } - } catch (Throwable t) { - logger.warn(t.getMessage(), t); - } finally { + if (heartbeatTimer != null) { + heartbeatTimer.stop(); heartbeatTimer = null; } } diff --git a/dubbo-remoting/dubbo-remoting-api/src/main/java/org/apache/dubbo/remoting/exchange/support/header/HeartBeatTask.java b/dubbo-remoting/dubbo-remoting-api/src/main/java/org/apache/dubbo/remoting/exchange/support/header/HeartBeatTask.java deleted file mode 100644 index 97bb1811ad..0000000000 --- a/dubbo-remoting/dubbo-remoting-api/src/main/java/org/apache/dubbo/remoting/exchange/support/header/HeartBeatTask.java +++ /dev/null @@ -1,97 +0,0 @@ -/* - * 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.dubbo.remoting.exchange.support.header; - -import org.apache.dubbo.common.Version; -import org.apache.dubbo.common.logger.Logger; -import org.apache.dubbo.common.logger.LoggerFactory; -import org.apache.dubbo.remoting.Channel; -import org.apache.dubbo.remoting.Client; -import org.apache.dubbo.remoting.exchange.Request; - -import java.util.Collection; - -final class HeartBeatTask implements Runnable { - - private static final Logger logger = LoggerFactory.getLogger(HeartBeatTask.class); - - private ChannelProvider channelProvider; - - private int heartbeat; - - private int heartbeatTimeout; - - HeartBeatTask(ChannelProvider provider, int heartbeat, int heartbeatTimeout) { - this.channelProvider = provider; - this.heartbeat = heartbeat; - this.heartbeatTimeout = heartbeatTimeout; - } - - @Override - public void run() { - try { - long now = System.currentTimeMillis(); - for (Channel channel : channelProvider.getChannels()) { - if (channel.isClosed()) { - continue; - } - try { - Long lastRead = (Long) channel.getAttribute( - HeaderExchangeHandler.KEY_READ_TIMESTAMP); - Long lastWrite = (Long) channel.getAttribute( - HeaderExchangeHandler.KEY_WRITE_TIMESTAMP); - if ((lastRead != null && now - lastRead > heartbeat) - || (lastWrite != null && now - lastWrite > heartbeat)) { - Request req = new Request(); - req.setVersion(Version.getProtocolVersion()); - req.setTwoWay(true); - req.setEvent(Request.HEARTBEAT_EVENT); - channel.send(req); - if (logger.isDebugEnabled()) { - logger.debug("Send heartbeat to remote channel " + channel.getRemoteAddress() - + ", cause: The channel has no data-transmission exceeds a heartbeat period: " + heartbeat + "ms"); - } - } - if (lastRead != null && now - lastRead > heartbeatTimeout) { - logger.warn("Close channel " + channel - + ", because heartbeat read idle time out: " + heartbeatTimeout + "ms"); - if (channel instanceof Client) { - try { - ((Client) channel).reconnect(); - } catch (Exception e) { - //do nothing - } - } else { - channel.close(); - } - } - } catch (Throwable t) { - logger.warn("Exception when heartbeat to remote channel " + channel.getRemoteAddress(), t); - } - } - } catch (Throwable t) { - logger.warn("Unhandled exception when heartbeat, cause: " + t.getMessage(), t); - } - } - - interface ChannelProvider { - Collection getChannels(); - } - -} - diff --git a/dubbo-remoting/dubbo-remoting-api/src/main/java/org/apache/dubbo/remoting/exchange/support/header/HeartbeatTimerTask.java b/dubbo-remoting/dubbo-remoting-api/src/main/java/org/apache/dubbo/remoting/exchange/support/header/HeartbeatTimerTask.java new file mode 100644 index 0000000000..a229cca4c0 --- /dev/null +++ b/dubbo-remoting/dubbo-remoting-api/src/main/java/org/apache/dubbo/remoting/exchange/support/header/HeartbeatTimerTask.java @@ -0,0 +1,61 @@ +/* + * 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.dubbo.remoting.exchange.support.header; + +import org.apache.dubbo.common.Version; +import org.apache.dubbo.common.logger.Logger; +import org.apache.dubbo.common.logger.LoggerFactory; +import org.apache.dubbo.remoting.Channel; +import org.apache.dubbo.remoting.exchange.Request; + +/** + * HeartbeatTimerTask + */ +public class HeartbeatTimerTask extends AbstractTimerTask { + + private static final Logger logger = LoggerFactory.getLogger(HeartbeatTimerTask.class); + + private final int heartbeat; + + protected HeartbeatTimerTask(ChannelProvider channelProvider, Long heartbeatTick, int heartbeat) { + super(channelProvider, heartbeatTick); + this.heartbeat = heartbeat; + } + + @Override + protected void doTask(Channel channel) { + try { + Long lastRead = lastRead(channel); + Long lastWrite = lastWrite(channel); + if ((lastRead != null && now() - lastRead > heartbeat) + || (lastWrite != null && now() - lastWrite > heartbeat)) { + Request req = new Request(); + req.setVersion(Version.getProtocolVersion()); + req.setTwoWay(true); + req.setEvent(Request.HEARTBEAT_EVENT); + channel.send(req); + if (logger.isDebugEnabled()) { + logger.debug("Send heartbeat to remote channel " + channel.getRemoteAddress() + + ", cause: The channel has no data-transmission exceeds a heartbeat period: " + heartbeat + "ms"); + } + } + } catch (Throwable t) { + logger.warn("Exception when heartbeat to remote channel " + channel.getRemoteAddress(), t); + } + } +} diff --git a/dubbo-remoting/dubbo-remoting-api/src/main/java/org/apache/dubbo/remoting/exchange/support/header/ReconnectTimerTask.java b/dubbo-remoting/dubbo-remoting-api/src/main/java/org/apache/dubbo/remoting/exchange/support/header/ReconnectTimerTask.java new file mode 100644 index 0000000000..f6ee5c698d --- /dev/null +++ b/dubbo-remoting/dubbo-remoting-api/src/main/java/org/apache/dubbo/remoting/exchange/support/header/ReconnectTimerTask.java @@ -0,0 +1,61 @@ +/* + * 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.dubbo.remoting.exchange.support.header; + +import org.apache.dubbo.common.logger.Logger; +import org.apache.dubbo.common.logger.LoggerFactory; +import org.apache.dubbo.remoting.Channel; +import org.apache.dubbo.remoting.Client; + +/** + * ReconnectTimerTask + */ +public class ReconnectTimerTask extends AbstractTimerTask { + + private static final Logger logger = LoggerFactory.getLogger(ReconnectTimerTask.class); + + private final int heartbeatTimeout; + + protected ReconnectTimerTask(ChannelProvider channelProvider, Long heartbeatTimeoutTick, int heartbeatTimeout1) { + super(channelProvider, heartbeatTimeoutTick); + this.heartbeatTimeout = heartbeatTimeout1; + } + + @Override + protected void doTask(Channel channel) { + try { + Long lastRead = lastRead(channel); + Long now = now(); + if (lastRead != null && now - lastRead > heartbeatTimeout) { + logger.warn("Close channel " + channel + + ", because heartbeat read idle time out: " + heartbeatTimeout + "ms"); + if (channel instanceof Client) { + try { + ((Client) channel).reconnect(); + } catch (Exception e) { + //do nothing + } + } else { + channel.close(); + } + } + } catch (Throwable t) { + logger.warn("Exception when reconnect to remote channel " + channel.getRemoteAddress(), t); + } + } +} diff --git a/dubbo-remoting/dubbo-remoting-api/src/test/java/org/apache/dubbo/remoting/exchange/support/header/HeartBeatTaskTest.java b/dubbo-remoting/dubbo-remoting-api/src/test/java/org/apache/dubbo/remoting/exchange/support/header/HeartBeatTaskTest.java index 5909a58666..b80a569f62 100644 --- a/dubbo-remoting/dubbo-remoting-api/src/test/java/org/apache/dubbo/remoting/exchange/support/header/HeartBeatTaskTest.java +++ b/dubbo-remoting/dubbo-remoting-api/src/test/java/org/apache/dubbo/remoting/exchange/support/header/HeartBeatTaskTest.java @@ -19,32 +19,30 @@ package org.apache.dubbo.remoting.exchange.support.header; import org.apache.dubbo.common.Constants; import org.apache.dubbo.common.URL; +import org.apache.dubbo.common.timer.HashedWheelTimer; import org.apache.dubbo.remoting.Channel; import org.apache.dubbo.remoting.exchange.Request; - import org.junit.Assert; import org.junit.Before; import org.junit.Test; -import java.util.Collection; import java.util.Collections; import java.util.List; +import java.util.concurrent.TimeUnit; public class HeartBeatTaskTest { private URL url = URL.valueOf("dubbo://localhost:20880"); private MockChannel channel; - private HeartBeatTask task; + + private HeartbeatTimerTask heartbeatTimerTask; + private HashedWheelTimer heartbeatTimer; @Before public void setup() throws Exception { - task = new HeartBeatTask(new HeartBeatTask.ChannelProvider() { - - public Collection getChannels() { - return Collections.singletonList(channel); - } - }, 1000, 1000 * 3); + long tickDuration = 1000; + heartbeatTimer = new HashedWheelTimer(tickDuration / Constants.HEARTBEAT_TICK, TimeUnit.MILLISECONDS); channel = new MockChannel() { @@ -53,17 +51,24 @@ public class HeartBeatTaskTest { return url; } }; + + AbstractTimerTask.ChannelProvider cp = () -> Collections.singletonList(channel); + heartbeatTimerTask = new HeartbeatTimerTask(cp, tickDuration / Constants.HEARTBEAT_TICK, (int) tickDuration); } @Test public void testHeartBeat() throws Exception { + long now = System.currentTimeMillis(); + url = url.addParameter(Constants.DUBBO_VERSION_KEY, "2.1.1"); channel.setAttribute( - HeaderExchangeHandler.KEY_READ_TIMESTAMP, System.currentTimeMillis()); + HeaderExchangeHandler.KEY_READ_TIMESTAMP, now); channel.setAttribute( - HeaderExchangeHandler.KEY_WRITE_TIMESTAMP, System.currentTimeMillis()); + HeaderExchangeHandler.KEY_WRITE_TIMESTAMP, now); + + heartbeatTimer.newTimeout(heartbeatTimerTask, 250, TimeUnit.MILLISECONDS); + Thread.sleep(2000L); - task.run(); List objects = channel.getSentObjects(); Assert.assertTrue(objects.size() > 0); Object obj = objects.get(0); diff --git a/dubbo-remoting/dubbo-remoting-netty/src/test/java/org/apache/dubbo/remoting/exchange/support/header/HeartbeatHandlerTest.java b/dubbo-remoting/dubbo-remoting-netty/src/test/java/org/apache/dubbo/remoting/exchange/support/header/HeartbeatHandlerTest.java index 867854a3a1..7db1fb5743 100644 --- a/dubbo-remoting/dubbo-remoting-netty/src/test/java/org/apache/dubbo/remoting/exchange/support/header/HeartbeatHandlerTest.java +++ b/dubbo-remoting/dubbo-remoting-netty/src/test/java/org/apache/dubbo/remoting/exchange/support/header/HeartbeatHandlerTest.java @@ -29,9 +29,8 @@ import org.apache.dubbo.remoting.exchange.ExchangeHandler; import org.apache.dubbo.remoting.exchange.ExchangeServer; import org.apache.dubbo.remoting.exchange.Exchangers; import org.apache.dubbo.remoting.transport.dispatcher.FakeChannelHandlers; - -import org.junit.Assert; import org.junit.After; +import org.junit.Assert; import org.junit.Test; import java.util.concurrent.CompletableFuture; @@ -66,6 +65,11 @@ public class HeartbeatHandlerTest { FakeChannelHandlers.setTestingChannelHandlers(); serverURL = serverURL.removeParameter(Constants.HEARTBEAT_KEY); + + // Let the client not reply to the heartbeat, and turn off automatic reconnect to simulate the client dropped. + serverURL = serverURL.addParameter(Constants.HEARTBEAT_KEY, 600 * 1000); + serverURL = serverURL.addParameter(Constants.RECONNECT_KEY, false); + client = Exchangers.connect(serverURL); Thread.sleep(10000); Assert.assertTrue(handler.disconnectCount > 0); diff --git a/dubbo-remoting/dubbo-remoting-netty/src/test/java/org/apache/dubbo/remoting/transport/netty/NettyClientToServerTest.java b/dubbo-remoting/dubbo-remoting-netty/src/test/java/org/apache/dubbo/remoting/transport/netty/NettyClientToServerTest.java index a2cff1dcc2..3d4e52d022 100644 --- a/dubbo-remoting/dubbo-remoting-netty/src/test/java/org/apache/dubbo/remoting/transport/netty/NettyClientToServerTest.java +++ b/dubbo-remoting/dubbo-remoting-netty/src/test/java/org/apache/dubbo/remoting/transport/netty/NettyClientToServerTest.java @@ -16,6 +16,7 @@ */ package org.apache.dubbo.remoting.transport.netty; +import org.apache.dubbo.common.Constants; import org.apache.dubbo.common.URL; import org.apache.dubbo.remoting.RemotingException; import org.apache.dubbo.remoting.exchange.ExchangeChannel; @@ -29,11 +30,17 @@ import org.apache.dubbo.remoting.exchange.support.Replier; public class NettyClientToServerTest extends ClientToServerTest { protected ExchangeServer newServer(int port, Replier receiver) throws RemotingException { - return Exchangers.bind(URL.valueOf("exchange://localhost:" + port + "?server=netty3"), receiver); + // add heartbeat cycle to avoid unstable ut. + URL url = URL.valueOf("exchange://localhost:" + port + "?server=netty3"); + url = url.addParameter(Constants.HEARTBEAT_KEY, 600 * 1000); + return Exchangers.bind(url, receiver); } protected ExchangeChannel newClient(int port) throws RemotingException { - return Exchangers.connect(URL.valueOf("exchange://localhost:" + port + "?client=netty3&timeout=3000")); + // add heartbeat cycle to avoid unstable ut. + URL url = URL.valueOf("exchange://localhost:" + port + "?client=netty3&timeout=3000"); + url = url.addParameter(Constants.HEARTBEAT_KEY, 600 * 1000); + return Exchangers.connect(url); } } \ No newline at end of file diff --git a/dubbo-remoting/dubbo-remoting-netty4/src/test/java/org/apache/dubbo/remoting/transport/netty4/NettyClientToServerTest.java b/dubbo-remoting/dubbo-remoting-netty4/src/test/java/org/apache/dubbo/remoting/transport/netty4/NettyClientToServerTest.java index af20985e05..1d3d5132d8 100644 --- a/dubbo-remoting/dubbo-remoting-netty4/src/test/java/org/apache/dubbo/remoting/transport/netty4/NettyClientToServerTest.java +++ b/dubbo-remoting/dubbo-remoting-netty4/src/test/java/org/apache/dubbo/remoting/transport/netty4/NettyClientToServerTest.java @@ -16,6 +16,7 @@ */ package org.apache.dubbo.remoting.transport.netty4; +import org.apache.dubbo.common.Constants; import org.apache.dubbo.common.URL; import org.apache.dubbo.remoting.RemotingException; import org.apache.dubbo.remoting.exchange.ExchangeChannel; @@ -29,11 +30,17 @@ import org.apache.dubbo.remoting.exchange.support.Replier; public class NettyClientToServerTest extends ClientToServerTest { protected ExchangeServer newServer(int port, Replier receiver) throws RemotingException { - return Exchangers.bind(URL.valueOf("exchange://localhost:" + port + "?server=netty4"), receiver); + // add heartbeat cycle to avoid unstable ut. + URL url = URL.valueOf("exchange://localhost:" + port + "?server=netty4"); + url = url.addParameter(Constants.HEARTBEAT_KEY, 600 * 1000); + return Exchangers.bind(url, receiver); } protected ExchangeChannel newClient(int port) throws RemotingException { - return Exchangers.connect(URL.valueOf("exchange://localhost:" + port + "?client=netty4&timeout=3000")); + // add heartbeat cycle to avoid unstable ut. + URL url = URL.valueOf("exchange://localhost:" + port + "?client=netty4&timeout=3000"); + url = url.addParameter(Constants.HEARTBEAT_KEY, 600 * 1000); + return Exchangers.connect(url); } } \ No newline at end of file From 195c82dac4ceb54f82d8a83f5cd488fefe0751b7 Mon Sep 17 00:00:00 2001 From: Ian Luo Date: Tue, 30 Oct 2018 17:09:23 +0800 Subject: [PATCH 02/23] polish the code for pull request 2658: Optimize heartbeat and reconnect task (#2709) --- .../org/apache/dubbo/common/Constants.java | 12 ++++- .../support/header/AbstractTimerTask.java | 27 +++++----- .../support/header/HeaderExchangeClient.java | 22 ++++----- .../support/header/HeaderExchangeServer.java | 49 +++++++++---------- .../support/header/HeartbeatTimerTask.java | 5 +- .../support/header/ReconnectTimerTask.java | 6 +-- .../support/header/HeartBeatTaskTest.java | 4 +- 7 files changed, 65 insertions(+), 60 deletions(-) diff --git a/dubbo-common/src/main/java/org/apache/dubbo/common/Constants.java b/dubbo-common/src/main/java/org/apache/dubbo/common/Constants.java index 9ddac89c0f..18ad19f524 100644 --- a/dubbo-common/src/main/java/org/apache/dubbo/common/Constants.java +++ b/dubbo-common/src/main/java/org/apache/dubbo/common/Constants.java @@ -247,9 +247,17 @@ public class Constants { public static final String HEARTBEAT_KEY = "heartbeat"; - public static final int HEARTBEAT_TICK = 3; + /** + * Every heartbeat duration / HEATBEAT_CHECK_TICK, check if a heartbeat should be sent. Every heartbeat timeout + * duration / HEATBEAT_CHECK_TICK, check if a connection should be closed on server side, and if reconnect on + * client side + */ + public static final int HEARTBEAT_CHECK_TICK = 3; - public static final long LEAST_HEARTBEAT_TICK = 1000; + /** + * the least heartbeat during is 1000 ms. + */ + public static final long LEAST_HEARTBEAT_DURATION = 1000; /** * ticks per wheel. Currently only contains two tasks, so 16 locations are enough diff --git a/dubbo-remoting/dubbo-remoting-api/src/main/java/org/apache/dubbo/remoting/exchange/support/header/AbstractTimerTask.java b/dubbo-remoting/dubbo-remoting-api/src/main/java/org/apache/dubbo/remoting/exchange/support/header/AbstractTimerTask.java index a2d6a2b8ec..003af243d8 100644 --- a/dubbo-remoting/dubbo-remoting-api/src/main/java/org/apache/dubbo/remoting/exchange/support/header/AbstractTimerTask.java +++ b/dubbo-remoting/dubbo-remoting-api/src/main/java/org/apache/dubbo/remoting/exchange/support/header/AbstractTimerTask.java @@ -30,11 +30,11 @@ import java.util.concurrent.TimeUnit; */ public abstract class AbstractTimerTask implements TimerTask { - protected final ChannelProvider channelProvider; + private final ChannelProvider channelProvider; - protected final Long tick; + private final Long tick; - protected AbstractTimerTask(ChannelProvider channelProvider, Long tick) { + AbstractTimerTask(ChannelProvider channelProvider, Long tick) { if (channelProvider == null || tick == null) { throw new IllegalArgumentException(); } @@ -42,31 +42,28 @@ public abstract class AbstractTimerTask implements TimerTask { this.channelProvider = channelProvider; } - protected Long lastRead(Channel channel) { - return (Long) channel.getAttribute( - HeaderExchangeHandler.KEY_READ_TIMESTAMP); + static Long lastRead(Channel channel) { + return (Long) channel.getAttribute(HeaderExchangeHandler.KEY_READ_TIMESTAMP); } - protected Long lastWrite(Channel channel) { - return (Long) channel.getAttribute( - HeaderExchangeHandler.KEY_WRITE_TIMESTAMP); + static Long lastWrite(Channel channel) { + return (Long) channel.getAttribute(HeaderExchangeHandler.KEY_WRITE_TIMESTAMP); } - protected Long now() { + static Long now() { return System.currentTimeMillis(); } - protected void reput(Timeout timeout, Long tick) { + private void reput(Timeout timeout, Long tick) { if (timeout == null || tick == null) { throw new IllegalArgumentException(); } + Timer timer = timeout.timer(); - if (timer.isStop()) { - return; - } - if (timeout.isCancelled()) { + if (timer.isStop() || timeout.isCancelled()) { return; } + timer.newTimeout(timeout.task(), tick, TimeUnit.MILLISECONDS); } diff --git a/dubbo-remoting/dubbo-remoting-api/src/main/java/org/apache/dubbo/remoting/exchange/support/header/HeaderExchangeClient.java b/dubbo-remoting/dubbo-remoting-api/src/main/java/org/apache/dubbo/remoting/exchange/support/header/HeaderExchangeClient.java index 66cf55ceae..bfd2ece11c 100644 --- a/dubbo-remoting/dubbo-remoting-api/src/main/java/org/apache/dubbo/remoting/exchange/support/header/HeaderExchangeClient.java +++ b/dubbo-remoting/dubbo-remoting-api/src/main/java/org/apache/dubbo/remoting/exchange/support/header/HeaderExchangeClient.java @@ -51,17 +51,17 @@ public class HeaderExchangeClient implements ExchangeClient { this.client = client; this.channel = new HeaderExchangeChannel(client); String dubbo = client.getUrl().getParameter(Constants.DUBBO_VERSION_KEY); - this.heartbeat = client.getUrl().getParameter(Constants.HEARTBEAT_KEY, dubbo != null && dubbo.startsWith("1.0.") ? Constants.DEFAULT_HEARTBEAT : 0); + + this.heartbeat = client.getUrl().getParameter(Constants.HEARTBEAT_KEY, dubbo != null && + dubbo.startsWith("1.0.") ? Constants.DEFAULT_HEARTBEAT : 0); this.heartbeatTimeout = client.getUrl().getParameter(Constants.HEARTBEAT_TIMEOUT_KEY, heartbeat * 3); if (heartbeatTimeout < heartbeat * 2) { throw new IllegalStateException("heartbeatTimeout < heartbeatInterval * 2"); } if (needHeartbeat) { - long heartbeatTick = calcLeastTick(heartbeat); - - // use heartbeatTick as every tick. - heartbeatTimer = new HashedWheelTimer(heartbeatTick, TimeUnit.MILLISECONDS, Constants.TICKS_PER_WHEEL); + long tickDuration = calculateLeastDuration(heartbeat); + heartbeatTimer = new HashedWheelTimer(tickDuration, TimeUnit.MILLISECONDS, Constants.TICKS_PER_WHEEL); startHeartbeatTimer(); } } @@ -179,8 +179,8 @@ public class HeaderExchangeClient implements ExchangeClient { private void startHeartbeatTimer() { AbstractTimerTask.ChannelProvider cp = () -> Collections.singletonList(HeaderExchangeClient.this); - long heartbeatTick = calcLeastTick(heartbeat); - long heartbeatTimeoutTick = calcLeastTick(heartbeatTimeout); + long heartbeatTick = calculateLeastDuration(heartbeat); + long heartbeatTimeoutTick = calculateLeastDuration(heartbeatTimeout); HeartbeatTimerTask heartBeatTimerTask = new HeartbeatTimerTask(cp, heartbeatTick, heartbeat); ReconnectTimerTask reconnectTimerTask = new ReconnectTimerTask(cp, heartbeatTimeoutTick, heartbeatTimeout); @@ -203,11 +203,11 @@ public class HeaderExchangeClient implements ExchangeClient { /** * Each interval cannot be less than 1000ms. */ - private long calcLeastTick(int time) { - if (time / Constants.HEARTBEAT_TICK <= 0) { - return Constants.LEAST_HEARTBEAT_TICK; + private long calculateLeastDuration(int time) { + if (time / Constants.HEARTBEAT_CHECK_TICK <= 0) { + return Constants.LEAST_HEARTBEAT_DURATION; } else { - return time / Constants.HEARTBEAT_TICK; + return time / Constants.HEARTBEAT_CHECK_TICK; } } diff --git a/dubbo-remoting/dubbo-remoting-api/src/main/java/org/apache/dubbo/remoting/exchange/support/header/HeaderExchangeServer.java b/dubbo-remoting/dubbo-remoting-api/src/main/java/org/apache/dubbo/remoting/exchange/support/header/HeaderExchangeServer.java index d091b8f45a..bc7e3a72d8 100644 --- a/dubbo-remoting/dubbo-remoting-api/src/main/java/org/apache/dubbo/remoting/exchange/support/header/HeaderExchangeServer.java +++ b/dubbo-remoting/dubbo-remoting-api/src/main/java/org/apache/dubbo/remoting/exchange/support/header/HeaderExchangeServer.java @@ -33,10 +33,11 @@ import org.apache.dubbo.remoting.exchange.Request; import java.net.InetSocketAddress; import java.util.ArrayList; import java.util.Collection; -import java.util.Collections; import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicBoolean; +import static java.util.Collections.unmodifiableCollection; + /** * ExchangeServerImpl */ @@ -63,9 +64,6 @@ public class HeaderExchangeServer implements ExchangeServer { throw new IllegalStateException("heartbeatTimeout < heartbeatInterval * 2"); } - long heartbeatTick = calcLeastTick(heartbeat); - // use heartbeatTick as every tick. - heartbeatTimer = new HashedWheelTimer(heartbeatTick, TimeUnit.MILLISECONDS, Constants.TICKS_PER_WHEEL); startHeartbeatTimer(); } @@ -217,10 +215,6 @@ public class HeaderExchangeServer implements ExchangeServer { heartbeatTimeout = t; stopHeartbeatTimer(); - - long heartbeatTick = calcLeastTick(heartbeat); - // use heartbeatTick as every tick. - heartbeatTimer = new HashedWheelTimer(heartbeatTick, TimeUnit.MILLISECONDS, Constants.TICKS_PER_WHEEL); startHeartbeatTimer(); } } @@ -238,7 +232,8 @@ public class HeaderExchangeServer implements ExchangeServer { @Override public void send(Object message) throws RemotingException { if (closed.get()) { - throw new RemotingException(this.getLocalAddress(), null, "Failed to send message " + message + ", cause: The server " + getLocalAddress() + " is closed!"); + throw new RemotingException(this.getLocalAddress(), null, "Failed to send message " + message + + ", cause: The server " + getLocalAddress() + " is closed!"); } server.send(message); } @@ -246,16 +241,31 @@ public class HeaderExchangeServer implements ExchangeServer { @Override public void send(Object message, boolean sent) throws RemotingException { if (closed.get()) { - throw new RemotingException(this.getLocalAddress(), null, "Failed to send message " + message + ", cause: The server " + getLocalAddress() + " is closed!"); + throw new RemotingException(this.getLocalAddress(), null, "Failed to send message " + message + + ", cause: The server " + getLocalAddress() + " is closed!"); } server.send(message, sent); } - private void startHeartbeatTimer() { - AbstractTimerTask.ChannelProvider cp = () -> Collections.unmodifiableCollection(HeaderExchangeServer.this.getChannels()); + /** + * Each interval cannot be less than 1000ms. + */ + private long calculateLeastDuration(int time) { + if (time / Constants.HEARTBEAT_CHECK_TICK <= 0) { + return Constants.LEAST_HEARTBEAT_DURATION; + } else { + return time / Constants.HEARTBEAT_CHECK_TICK; + } + } - long heartbeatTick = calcLeastTick(heartbeat); - long heartbeatTimeoutTick = calcLeastTick(heartbeatTimeout); + private void startHeartbeatTimer() { + long tickDuration = calculateLeastDuration(heartbeat); + heartbeatTimer = new HashedWheelTimer(tickDuration, TimeUnit.MILLISECONDS, Constants.TICKS_PER_WHEEL); + + AbstractTimerTask.ChannelProvider cp = () -> unmodifiableCollection(HeaderExchangeServer.this.getChannels()); + + long heartbeatTick = calculateLeastDuration(heartbeat); + long heartbeatTimeoutTick = calculateLeastDuration(heartbeatTimeout); HeartbeatTimerTask heartBeatTimerTask = new HeartbeatTimerTask(cp, heartbeatTick, heartbeat); ReconnectTimerTask reconnectTimerTask = new ReconnectTimerTask(cp, heartbeatTimeoutTick, heartbeatTimeout); @@ -264,17 +274,6 @@ public class HeaderExchangeServer implements ExchangeServer { heartbeatTimer.newTimeout(reconnectTimerTask, heartbeatTimeoutTick, TimeUnit.MILLISECONDS); } - /** - * Each interval cannot be less than 1000ms. - */ - private long calcLeastTick(int time) { - if (time / Constants.HEARTBEAT_TICK <= 0) { - return Constants.LEAST_HEARTBEAT_TICK; - } else { - return time / Constants.HEARTBEAT_TICK; - } - } - private void stopHeartbeatTimer() { if (heartbeatTimer != null) { heartbeatTimer.stop(); diff --git a/dubbo-remoting/dubbo-remoting-api/src/main/java/org/apache/dubbo/remoting/exchange/support/header/HeartbeatTimerTask.java b/dubbo-remoting/dubbo-remoting-api/src/main/java/org/apache/dubbo/remoting/exchange/support/header/HeartbeatTimerTask.java index a229cca4c0..cbe01f8506 100644 --- a/dubbo-remoting/dubbo-remoting-api/src/main/java/org/apache/dubbo/remoting/exchange/support/header/HeartbeatTimerTask.java +++ b/dubbo-remoting/dubbo-remoting-api/src/main/java/org/apache/dubbo/remoting/exchange/support/header/HeartbeatTimerTask.java @@ -32,7 +32,7 @@ public class HeartbeatTimerTask extends AbstractTimerTask { private final int heartbeat; - protected HeartbeatTimerTask(ChannelProvider channelProvider, Long heartbeatTick, int heartbeat) { + HeartbeatTimerTask(ChannelProvider channelProvider, Long heartbeatTick, int heartbeat) { super(channelProvider, heartbeatTick); this.heartbeat = heartbeat; } @@ -51,7 +51,8 @@ public class HeartbeatTimerTask extends AbstractTimerTask { channel.send(req); if (logger.isDebugEnabled()) { logger.debug("Send heartbeat to remote channel " + channel.getRemoteAddress() - + ", cause: The channel has no data-transmission exceeds a heartbeat period: " + heartbeat + "ms"); + + ", cause: The channel has no data-transmission exceeds a heartbeat period: " + + heartbeat + "ms"); } } } catch (Throwable t) { diff --git a/dubbo-remoting/dubbo-remoting-api/src/main/java/org/apache/dubbo/remoting/exchange/support/header/ReconnectTimerTask.java b/dubbo-remoting/dubbo-remoting-api/src/main/java/org/apache/dubbo/remoting/exchange/support/header/ReconnectTimerTask.java index f6ee5c698d..dccbe5332c 100644 --- a/dubbo-remoting/dubbo-remoting-api/src/main/java/org/apache/dubbo/remoting/exchange/support/header/ReconnectTimerTask.java +++ b/dubbo-remoting/dubbo-remoting-api/src/main/java/org/apache/dubbo/remoting/exchange/support/header/ReconnectTimerTask.java @@ -31,7 +31,7 @@ public class ReconnectTimerTask extends AbstractTimerTask { private final int heartbeatTimeout; - protected ReconnectTimerTask(ChannelProvider channelProvider, Long heartbeatTimeoutTick, int heartbeatTimeout1) { + ReconnectTimerTask(ChannelProvider channelProvider, Long heartbeatTimeoutTick, int heartbeatTimeout1) { super(channelProvider, heartbeatTimeoutTick); this.heartbeatTimeout = heartbeatTimeout1; } @@ -42,8 +42,8 @@ public class ReconnectTimerTask extends AbstractTimerTask { Long lastRead = lastRead(channel); Long now = now(); if (lastRead != null && now - lastRead > heartbeatTimeout) { - logger.warn("Close channel " + channel - + ", because heartbeat read idle time out: " + heartbeatTimeout + "ms"); + logger.warn("Close channel " + channel + ", because heartbeat read idle time out: " + + heartbeatTimeout + "ms"); if (channel instanceof Client) { try { ((Client) channel).reconnect(); diff --git a/dubbo-remoting/dubbo-remoting-api/src/test/java/org/apache/dubbo/remoting/exchange/support/header/HeartBeatTaskTest.java b/dubbo-remoting/dubbo-remoting-api/src/test/java/org/apache/dubbo/remoting/exchange/support/header/HeartBeatTaskTest.java index b80a569f62..b302b555f5 100644 --- a/dubbo-remoting/dubbo-remoting-api/src/test/java/org/apache/dubbo/remoting/exchange/support/header/HeartBeatTaskTest.java +++ b/dubbo-remoting/dubbo-remoting-api/src/test/java/org/apache/dubbo/remoting/exchange/support/header/HeartBeatTaskTest.java @@ -42,7 +42,7 @@ public class HeartBeatTaskTest { @Before public void setup() throws Exception { long tickDuration = 1000; - heartbeatTimer = new HashedWheelTimer(tickDuration / Constants.HEARTBEAT_TICK, TimeUnit.MILLISECONDS); + heartbeatTimer = new HashedWheelTimer(tickDuration / Constants.HEARTBEAT_CHECK_TICK, TimeUnit.MILLISECONDS); channel = new MockChannel() { @@ -53,7 +53,7 @@ public class HeartBeatTaskTest { }; AbstractTimerTask.ChannelProvider cp = () -> Collections.singletonList(channel); - heartbeatTimerTask = new HeartbeatTimerTask(cp, tickDuration / Constants.HEARTBEAT_TICK, (int) tickDuration); + heartbeatTimerTask = new HeartbeatTimerTask(cp, tickDuration / Constants.HEARTBEAT_CHECK_TICK, (int) tickDuration); } @Test From 4d0a36c435ca59bfcf909c0e76fa2ab024fb7408 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=94=B0=E5=B0=8F=E6=B3=A2?= Date: Tue, 30 Oct 2018 17:12:38 +0800 Subject: [PATCH 03/23] =?UTF-8?q?=E9=87=8D=E6=9E=84=20ServiceBean=20?= =?UTF-8?q?=E7=9A=84=20isDelay=20=E6=96=B9=E6=B3=95=EF=BC=8C=E4=BD=BF?= =?UTF-8?q?=E5=85=B6=E6=9B=B4=E7=AC=A6=E5=90=88=E8=AF=AD=E4=B9=89=20(#2686?= =?UTF-8?q?)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Refactor method isDelay of ServiceBean to fix the wrong meaning of the method * Remove unnecessary method isDelay of ServiceBean --- .../org/apache/dubbo/config/spring/ServiceBean.java | 13 ++----------- 1 file changed, 2 insertions(+), 11 deletions(-) diff --git a/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/ServiceBean.java b/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/ServiceBean.java index 1d5ff8e8d3..6d7bc9b647 100644 --- a/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/ServiceBean.java +++ b/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/ServiceBean.java @@ -107,7 +107,7 @@ public class ServiceBean extends ServiceConfig implements InitializingBean @Override public void onApplicationEvent(ContextRefreshedEvent event) { - if (isDelay() && !isExported() && !isUnexported()) { + if (!isExported() && !isUnexported()) { if (logger.isInfoEnabled()) { logger.info("The service ready on spring started. service: " + getInterface()); } @@ -115,15 +115,6 @@ public class ServiceBean extends ServiceConfig implements InitializingBean } } - private boolean isDelay() { - Integer delay = getDelay(); - ProviderConfig provider = getProvider(); - if (delay == null && provider != null) { - delay = provider.getDelay(); - } - return supportedApplicationListener && (delay == null || delay == -1); - } - @Override @SuppressWarnings({"unchecked", "deprecation"}) public void afterPropertiesSet() throws Exception { @@ -251,7 +242,7 @@ public class ServiceBean extends ServiceConfig implements InitializingBean setPath(beanName); } } - if (!isDelay()) { + if (!supportedApplicationListener) { export(); } } From 0a116aa957a81478234076997426cfb6296c2040 Mon Sep 17 00:00:00 2001 From: tswstarplanet Date: Tue, 30 Oct 2018 17:22:10 +0800 Subject: [PATCH 04/23] =?UTF-8?q?=E3=80=90Unit=20Test=E3=80=91FailbackRegi?= =?UTF-8?q?stry=20Test:=20recover=20method=20(#2591)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * FailbackRegistry Test: recover method * fix the type error, and use CountDownLatch await method to fix the unstable problom * trigger the travis ci test retry * trigger the code static check again --- .../support/FailbackRegistryTest.java | 23 +++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/dubbo-registry/dubbo-registry-api/src/test/java/org/apache/dubbo/registry/support/FailbackRegistryTest.java b/dubbo-registry/dubbo-registry-api/src/test/java/org/apache/dubbo/registry/support/FailbackRegistryTest.java index 5e50c31147..7f3ac3a6be 100644 --- a/dubbo-registry/dubbo-registry-api/src/test/java/org/apache/dubbo/registry/support/FailbackRegistryTest.java +++ b/dubbo-registry/dubbo-registry-api/src/test/java/org/apache/dubbo/registry/support/FailbackRegistryTest.java @@ -21,6 +21,7 @@ import org.apache.dubbo.common.URL; import org.apache.dubbo.common.utils.CollectionUtils; import org.apache.dubbo.registry.NotifyListener; +import org.junit.Assert; import org.junit.Before; import org.junit.Test; @@ -180,6 +181,28 @@ public class FailbackRegistryTest { assertEquals(2, count.get()); } + @Test + public void testRecover() throws Exception { + CountDownLatch countDownLatch = new CountDownLatch(4); + final AtomicReference notified = new AtomicReference(false); + NotifyListener listener = new NotifyListener() { + @Override + public void notify(List urls) { + notified.set(Boolean.TRUE); + } + }; + + MockRegistry mockRegistry = new MockRegistry(registryUrl, countDownLatch); + mockRegistry.register(serviceUrl); + mockRegistry.subscribe(serviceUrl, listener); + Assert.assertEquals(1, mockRegistry.getRegistered().size()); + Assert.assertEquals(1, mockRegistry.getSubscribed().size()); + mockRegistry.recover(); + countDownLatch.await(); + Assert.assertEquals(0, mockRegistry.getFailedRegistered().size()); + Assert.assertEquals(null, mockRegistry.getFailedSubscribed().get(registryUrl)); + Assert.assertEquals(countDownLatch.getCount(), 0); + } private static class MockRegistry extends FailbackRegistry { CountDownLatch latch; From c21cc05ec9ff4f96f34af9027714bb525cd0edf5 Mon Sep 17 00:00:00 2001 From: vkeeper Date: Wed, 31 Oct 2018 11:29:54 +0800 Subject: [PATCH 05/23] replace ServiceAnnotationBeanPostProcessor log.isInfoEnabled->log.isWarnEnabled (#2712) simplify ExtensionLoader code segment --- .../dubbo/common/extension/ExtensionLoader.java | 15 ++------------- .../ServiceAnnotationBeanPostProcessor.java | 2 +- 2 files changed, 3 insertions(+), 14 deletions(-) diff --git a/dubbo-common/src/main/java/org/apache/dubbo/common/extension/ExtensionLoader.java b/dubbo-common/src/main/java/org/apache/dubbo/common/extension/ExtensionLoader.java index 75b7562398..1d071a1551 100644 --- a/dubbo-common/src/main/java/org/apache/dubbo/common/extension/ExtensionLoader.java +++ b/dubbo-common/src/main/java/org/apache/dubbo/common/extension/ExtensionLoader.java @@ -860,19 +860,8 @@ public class ExtensionLoader { String[] value = adaptiveAnnotation.value(); // value is not set, use the value generated from class name as the key if (value.length == 0) { - char[] charArray = type.getSimpleName().toCharArray(); - StringBuilder sb = new StringBuilder(128); - for (int i = 0; i < charArray.length; i++) { - if (Character.isUpperCase(charArray[i])) { - if (i != 0) { - sb.append("."); - } - sb.append(Character.toLowerCase(charArray[i])); - } else { - sb.append(charArray[i]); - } - } - value = new String[]{sb.toString()}; + String splitName = StringUtils.camelToSplitName(type.getSimpleName(), "."); + value = new String[]{splitName}; } boolean hasInvocation = false; diff --git a/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/beans/factory/annotation/ServiceAnnotationBeanPostProcessor.java b/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/beans/factory/annotation/ServiceAnnotationBeanPostProcessor.java index 389ef21736..0558528f61 100644 --- a/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/beans/factory/annotation/ServiceAnnotationBeanPostProcessor.java +++ b/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/beans/factory/annotation/ServiceAnnotationBeanPostProcessor.java @@ -261,7 +261,7 @@ public class ServiceAnnotationBeanPostProcessor implements BeanDefinitionRegistr if (scanner.checkCandidate(beanName, serviceBeanDefinition)) { // check duplicated candidate bean registry.registerBeanDefinition(beanName, serviceBeanDefinition); - if (logger.isInfoEnabled()) { + if (logger.isWarnEnabled()) { logger.warn("The BeanDefinition[" + serviceBeanDefinition + "] of ServiceBean has been registered with name : " + beanName); } From 3cf801bb9d45524ae1e4692e04aeda2bcb5050dd Mon Sep 17 00:00:00 2001 From: "ken.lj" Date: Thu, 1 Nov 2018 22:52:15 +0800 Subject: [PATCH 06/23] [Dubbo-2678][For Master] Add ability to turn off SPI auto injection, special support for Object type. (#2682) * Add ability to turn off SPI auto injection, special support for generic Object type injection. * Change Inject to AutoInject since it's main purpose is to turn off auto-injection. * disable is redundant in DisableInject annotation --- .../dubbo/common/extension/DisableInject.java | 29 +++++++++ .../common/extension/ExtensionLoader.java | 6 ++ .../common/extension/ExtensionLoaderTest.java | 13 +++- .../common/extension/injection/InjectExt.java | 27 +++++++++ .../injection/impl/InjectExtImpl.java | 60 +++++++++++++++++++ ...dubbo.common.extension.injection.InjectExt | 1 + .../extension/SpringExtensionFactory.java | 13 ++-- 7 files changed, 144 insertions(+), 5 deletions(-) create mode 100644 dubbo-common/src/main/java/org/apache/dubbo/common/extension/DisableInject.java create mode 100644 dubbo-common/src/test/java/org/apache/dubbo/common/extension/injection/InjectExt.java create mode 100644 dubbo-common/src/test/java/org/apache/dubbo/common/extension/injection/impl/InjectExtImpl.java create mode 100644 dubbo-common/src/test/resources/META-INF/dubbo/internal/org.apache.dubbo.common.extension.injection.InjectExt diff --git a/dubbo-common/src/main/java/org/apache/dubbo/common/extension/DisableInject.java b/dubbo-common/src/main/java/org/apache/dubbo/common/extension/DisableInject.java new file mode 100644 index 0000000000..577a28df6b --- /dev/null +++ b/dubbo-common/src/main/java/org/apache/dubbo/common/extension/DisableInject.java @@ -0,0 +1,29 @@ +/* + * 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.dubbo.common.extension; + +import java.lang.annotation.Documented; +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +@Documented +@Retention(RetentionPolicy.RUNTIME) +@Target({ElementType.TYPE, ElementType.METHOD}) +public @interface DisableInject { +} diff --git a/dubbo-common/src/main/java/org/apache/dubbo/common/extension/ExtensionLoader.java b/dubbo-common/src/main/java/org/apache/dubbo/common/extension/ExtensionLoader.java index 1d071a1551..31f72e669e 100644 --- a/dubbo-common/src/main/java/org/apache/dubbo/common/extension/ExtensionLoader.java +++ b/dubbo-common/src/main/java/org/apache/dubbo/common/extension/ExtensionLoader.java @@ -532,6 +532,12 @@ public class ExtensionLoader { if (method.getName().startsWith("set") && method.getParameterTypes().length == 1 && Modifier.isPublic(method.getModifiers())) { + /** + * Check {@link DisableInject} to see if we need auto injection for this property + */ + if (method.getAnnotation(DisableInject.class) != null) { + continue; + } Class pt = method.getParameterTypes()[0]; try { String property = method.getName().length() > 3 ? method.getName().substring(3, 4).toLowerCase() + method.getName().substring(4) : ""; diff --git a/dubbo-common/src/test/java/org/apache/dubbo/common/extension/ExtensionLoaderTest.java b/dubbo-common/src/test/java/org/apache/dubbo/common/extension/ExtensionLoaderTest.java index b141707501..185296fa16 100644 --- a/dubbo-common/src/test/java/org/apache/dubbo/common/extension/ExtensionLoaderTest.java +++ b/dubbo-common/src/test/java/org/apache/dubbo/common/extension/ExtensionLoaderTest.java @@ -47,7 +47,8 @@ import org.apache.dubbo.common.extension.ext8_add.impl.AddExt3_ManualAdaptive; import org.apache.dubbo.common.extension.ext8_add.impl.AddExt4_ManualAdaptive; import org.apache.dubbo.common.extension.ext9_empty.Ext9Empty; import org.apache.dubbo.common.extension.ext9_empty.impl.Ext9EmptyImpl; - +import org.apache.dubbo.common.extension.injection.InjectExt; +import org.apache.dubbo.common.extension.injection.impl.InjectExtImpl; import org.junit.Assert; import org.junit.Test; @@ -425,4 +426,14 @@ public class ExtensionLoaderTest { Assert.assertTrue(list.get(1).getClass() == OrderActivateExtImpl1.class); } + @Test + public void testInjectExtension() { + // test default + InjectExt injectExt = ExtensionLoader.getExtensionLoader(InjectExt.class).getExtension("injection"); + InjectExtImpl injectExtImpl = (InjectExtImpl) injectExt; + Assert.assertNotNull(injectExtImpl.getSimpleExt()); + Assert.assertNull(injectExtImpl.getSimpleExt1()); + Assert.assertNull(injectExtImpl.getGenericType()); + } + } \ No newline at end of file diff --git a/dubbo-common/src/test/java/org/apache/dubbo/common/extension/injection/InjectExt.java b/dubbo-common/src/test/java/org/apache/dubbo/common/extension/injection/InjectExt.java new file mode 100644 index 0000000000..f2ffe41c69 --- /dev/null +++ b/dubbo-common/src/test/java/org/apache/dubbo/common/extension/injection/InjectExt.java @@ -0,0 +1,27 @@ +/* + * 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.dubbo.common.extension.injection; + +import org.apache.dubbo.common.extension.SPI; + +/** + * + */ +@SPI("injection") +public interface InjectExt { + String echo(String msg); +} diff --git a/dubbo-common/src/test/java/org/apache/dubbo/common/extension/injection/impl/InjectExtImpl.java b/dubbo-common/src/test/java/org/apache/dubbo/common/extension/injection/impl/InjectExtImpl.java new file mode 100644 index 0000000000..ccff9547f5 --- /dev/null +++ b/dubbo-common/src/test/java/org/apache/dubbo/common/extension/injection/impl/InjectExtImpl.java @@ -0,0 +1,60 @@ +/* + * 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.dubbo.common.extension.injection.impl; + +import org.apache.dubbo.common.extension.DisableInject; +import org.apache.dubbo.common.extension.ext1.SimpleExt; +import org.apache.dubbo.common.extension.injection.InjectExt; + +public class InjectExtImpl implements InjectExt { + + private SimpleExt simpleExt; + + private SimpleExt simpleExt1; + + private Object genericType; + + public void setSimpleExt(SimpleExt simpleExt) { + this.simpleExt = simpleExt; + } + + @DisableInject + public void setSimpleExt1(SimpleExt simpleExt1) { + this.simpleExt1 = simpleExt1; + } + + public void setGenericType(Object genericType) { + this.genericType = genericType; + } + + @Override + public String echo(String msg) { + return null; + } + + public SimpleExt getSimpleExt() { + return simpleExt; + } + + public SimpleExt getSimpleExt1() { + return simpleExt1; + } + + public Object getGenericType() { + return genericType; + } +} diff --git a/dubbo-common/src/test/resources/META-INF/dubbo/internal/org.apache.dubbo.common.extension.injection.InjectExt b/dubbo-common/src/test/resources/META-INF/dubbo/internal/org.apache.dubbo.common.extension.injection.InjectExt new file mode 100644 index 0000000000..b3d82a05b1 --- /dev/null +++ b/dubbo-common/src/test/resources/META-INF/dubbo/internal/org.apache.dubbo.common.extension.injection.InjectExt @@ -0,0 +1 @@ +injection=org.apache.dubbo.common.extension.injection.impl.InjectExtImpl \ No newline at end of file diff --git a/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/extension/SpringExtensionFactory.java b/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/extension/SpringExtensionFactory.java index 56862f33b4..ea63a35d1f 100644 --- a/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/extension/SpringExtensionFactory.java +++ b/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/extension/SpringExtensionFactory.java @@ -16,7 +16,6 @@ */ package org.apache.dubbo.config.spring.extension; -import java.util.Set; import org.apache.dubbo.common.extension.ExtensionFactory; import org.apache.dubbo.common.extension.SPI; import org.apache.dubbo.common.logger.Logger; @@ -26,6 +25,8 @@ import org.springframework.beans.factory.NoSuchBeanDefinitionException; import org.springframework.beans.factory.NoUniqueBeanDefinitionException; import org.springframework.context.ApplicationContext; +import java.util.Set; + /** * SpringExtensionFactory */ @@ -69,13 +70,17 @@ public class SpringExtensionFactory implements ExtensionFactory { } } - logger.warn("No spring extension(bean) named:" + name + ", try to find an extension(bean) of type " + type.getName()); + logger.warn("No spring extension (bean) named:" + name + ", try to find an extension (bean) of type " + type.getName()); + + if (Object.class == type) { + return null; + } for (ApplicationContext context : contexts) { try { return context.getBean(type); } catch (NoUniqueBeanDefinitionException multiBeanExe) { - throw multiBeanExe; + logger.warn("Find more than 1 spring extensions (beans) of type " + type.getName() + ", will stop auto injection. Please make sure you have specified the concrete parameter type and there's only one extension of that type."); } catch (NoSuchBeanDefinitionException noBeanExe) { if (logger.isDebugEnabled()) { logger.debug("Error when get spring extension(bean) for type:" + type.getName(), noBeanExe); @@ -83,7 +88,7 @@ public class SpringExtensionFactory implements ExtensionFactory { } } - logger.warn("No spring extension(bean) named:" + name + ", type:" + type.getName() + " found, stop get bean."); + logger.warn("No spring extension (bean) named:" + name + ", type:" + type.getName() + " found, stop get bean."); return null; } From 0d51bc4751583cc31e7b65c5a79e335fa76aae89 Mon Sep 17 00:00:00 2001 From: Ian Luo Date: Mon, 5 Nov 2018 10:49:10 +0800 Subject: [PATCH 07/23] Merge pull request #2725, problems of graceful shutdown in 2.6.3 and some recommendation. --- dubbo-all/pom.xml | 8 -- dubbo-bom/pom.xml | 5 - dubbo-bootstrap/pom.xml | 47 -------- .../dubbo/bootstrap/DubboBootstrap.java | 111 ------------------ .../apache/dubbo/config/ProtocolConfig.java | 11 +- dubbo-config/dubbo-config-spring/pom.xml | 7 +- .../dubbo/config/spring/AnnotationBean.java | 23 ++-- .../dubbo/config/spring/ServiceBean.java | 26 +--- .../extension/SpringExtensionFactory.java | 19 +++ .../DubboApplicationContextInitializer.java | 39 ------ .../initializer/DubboApplicationListener.java | 49 -------- .../initializer/DubboContextListener.java | 72 ------------ .../config/spring/util/BeanFactoryUtils.java | 27 +++++ .../main/resources/META-INF/web-fragment.xml | 22 ---- ...ubboApplicationContextInitializerTest.java | 88 -------------- .../DubboApplicationListenerTest.java | 59 ---------- .../dubbo-container-spring/pom.xml | 7 +- .../container/spring/SpringContainer.java | 6 +- dubbo-distribution/pom.xml | 5 - pom.xml | 1 - 20 files changed, 65 insertions(+), 567 deletions(-) delete mode 100644 dubbo-bootstrap/pom.xml delete mode 100644 dubbo-bootstrap/src/main/java/org/apache/dubbo/bootstrap/DubboBootstrap.java delete mode 100644 dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/initializer/DubboApplicationContextInitializer.java delete mode 100644 dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/initializer/DubboApplicationListener.java delete mode 100644 dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/initializer/DubboContextListener.java delete mode 100644 dubbo-config/dubbo-config-spring/src/main/resources/META-INF/web-fragment.xml delete mode 100644 dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/initializer/DubboApplicationContextInitializerTest.java delete mode 100644 dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/initializer/DubboApplicationListenerTest.java diff --git a/dubbo-all/pom.xml b/dubbo-all/pom.xml index 8e8fa661fb..12d9ec9efd 100644 --- a/dubbo-all/pom.xml +++ b/dubbo-all/pom.xml @@ -325,13 +325,6 @@ compile true - - org.apache.dubbo - dubbo-bootstrap - ${project.version} - compile - true - org.apache.dubbo dubbo-compatible @@ -439,7 +432,6 @@ org.apache.dubbo:dubbo-serialization-kryo org.apache.dubbo:dubbo-serialization-jdk org.apache.dubbo:dubbo-serialization-protostuff - org.apache.dubbo:dubbo-bootstrap diff --git a/dubbo-bom/pom.xml b/dubbo-bom/pom.xml index 15c8ae84b5..dac2456d83 100644 --- a/dubbo-bom/pom.xml +++ b/dubbo-bom/pom.xml @@ -283,11 +283,6 @@ dubbo-serialization-protostuff ${project.version} - - org.apache.dubbo - dubbo-bootstrap - ${project.version} - org.apache.dubbo dubbo-compatible diff --git a/dubbo-bootstrap/pom.xml b/dubbo-bootstrap/pom.xml deleted file mode 100644 index a082550b36..0000000000 --- a/dubbo-bootstrap/pom.xml +++ /dev/null @@ -1,47 +0,0 @@ - - - - dubbo-parent - org.apache.dubbo - 2.7.0-SNAPSHOT - - 4.0.0 - - dubbo-bootstrap - - - - - org.apache.dubbo - dubbo-config-api - ${project.parent.version} - - - org.apache.dubbo - dubbo-common - ${project.parent.version} - - - org.apache.dubbo - dubbo-registry-api - ${project.parent.version} - - - \ No newline at end of file diff --git a/dubbo-bootstrap/src/main/java/org/apache/dubbo/bootstrap/DubboBootstrap.java b/dubbo-bootstrap/src/main/java/org/apache/dubbo/bootstrap/DubboBootstrap.java deleted file mode 100644 index b896c0ee84..0000000000 --- a/dubbo-bootstrap/src/main/java/org/apache/dubbo/bootstrap/DubboBootstrap.java +++ /dev/null @@ -1,111 +0,0 @@ -/* - * 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.dubbo.bootstrap; - -import org.apache.dubbo.config.DubboShutdownHook; -import org.apache.dubbo.config.ServiceConfig; - -import java.util.ArrayList; -import java.util.List; - -/** - * A bootstrap class to easily start and stop Dubbo via programmatic API. - * The bootstrap class will be responsible to cleanup the resources during stop. - */ -public class DubboBootstrap { - - /** - * The list of ServiceConfig - */ - private List serviceConfigList; - - /** - * Whether register the shutdown hook during start? - */ - private final boolean registerShutdownHookOnStart; - - /** - * The shutdown hook used when Dubbo is running under embedded environment - */ - private DubboShutdownHook shutdownHook; - - public DubboBootstrap() { - this(true, DubboShutdownHook.getDubboShutdownHook()); - } - - public DubboBootstrap(boolean registerShutdownHookOnStart) { - this(registerShutdownHookOnStart, DubboShutdownHook.getDubboShutdownHook()); - } - - public DubboBootstrap(boolean registerShutdownHookOnStart, DubboShutdownHook shutdownHook) { - this.serviceConfigList = new ArrayList(); - this.shutdownHook = shutdownHook; - this.registerShutdownHookOnStart = registerShutdownHookOnStart; - } - - /** - * Register service config to bootstrap, which will be called during {@link DubboBootstrap#stop()} - * @param serviceConfig the service - * @return the bootstrap instance - */ - public DubboBootstrap registerServiceConfig(ServiceConfig serviceConfig) { - serviceConfigList.add(serviceConfig); - return this; - } - - public void start() { - if (registerShutdownHookOnStart) { - registerShutdownHook(); - } else { - // DubboShutdown hook has been registered in AbstractConfig, - // we need to remove it explicitly - removeShutdownHook(); - } - for (ServiceConfig serviceConfig: serviceConfigList) { - serviceConfig.export(); - } - } - - public void stop() { - for (ServiceConfig serviceConfig: serviceConfigList) { - serviceConfig.unexport(); - } - shutdownHook.destroyAll(); - if (registerShutdownHookOnStart) { - removeShutdownHook(); - } - } - - /** - * Register the shutdown hook - */ - public void registerShutdownHook() { - Runtime.getRuntime().addShutdownHook(shutdownHook); - } - - /** - * Remove this shutdown hook - */ - public void removeShutdownHook() { - try { - Runtime.getRuntime().removeShutdownHook(shutdownHook); - } - catch (IllegalStateException ex) { - // ignore - VM is already shutting down - } - } -} diff --git a/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/ProtocolConfig.java b/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/ProtocolConfig.java index 3ae33291ad..75821690a1 100644 --- a/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/ProtocolConfig.java +++ b/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/ProtocolConfig.java @@ -470,13 +470,4 @@ public class ProtocolConfig extends AbstractConfig { ExtensionLoader.getExtensionLoader(Protocol.class).getExtension(name).destroy(); } } - - /** - * Just for compatibility. - * It should be deleted in the next major version, say 2.7.x. - */ - @Deprecated - public static void destroyAll() { - DubboShutdownHook.getDubboShutdownHook().destroyAll(); - } -} \ No newline at end of file +} diff --git a/dubbo-config/dubbo-config-spring/pom.xml b/dubbo-config/dubbo-config-spring/pom.xml index 995209db45..626556cc32 100644 --- a/dubbo-config/dubbo-config-spring/pom.xml +++ b/dubbo-config/dubbo-config-spring/pom.xml @@ -34,11 +34,6 @@ dubbo-config-api ${project.parent.version} - - org.apache.dubbo - dubbo-bootstrap - ${project.parent.version} - org.springframework spring-beans @@ -157,4 +152,4 @@ --> - \ No newline at end of file + diff --git a/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/AnnotationBean.java b/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/AnnotationBean.java index 7612c3302a..6b54a395db 100644 --- a/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/AnnotationBean.java +++ b/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/AnnotationBean.java @@ -28,7 +28,6 @@ import org.apache.dubbo.config.ModuleConfig; import org.apache.dubbo.config.MonitorConfig; import org.apache.dubbo.config.ProtocolConfig; import org.apache.dubbo.config.ProviderConfig; -import org.apache.dubbo.config.ReferenceConfig; import org.apache.dubbo.config.RegistryConfig; import org.apache.dubbo.config.ServiceConfig; import org.apache.dubbo.config.annotation.Reference; @@ -111,17 +110,16 @@ public class AnnotationBean extends AbstractConfig implements DisposableBean, Be @Override public void destroy() { - - // This will only be called for singleton scope bean, and expected to be called by spring shutdown hook when BeanFactory/ApplicationContext destroys. - // We will guarantee dubbo related resources being released with dubbo shutdown hook. - - // for (ServiceConfig serviceConfig : serviceConfigs) { - // try { - // serviceConfig.unexport(); - // } catch (Throwable e) { - // logger.error(e.getMessage(), e); - // } - // } + // no need to destroy here + // see org.apache.dubbo.config.spring.extension.SpringExtensionFactory.ShutdownHookListener + /* + for (ServiceConfig serviceConfig : serviceConfigs) { + try { + serviceConfig.unexport(); + } catch (Throwable e) { + logger.error(e.getMessage(), e); + } + } for (ReferenceConfig referenceConfig : referenceConfigs.values()) { try { @@ -130,6 +128,7 @@ public class AnnotationBean extends AbstractConfig implements DisposableBean, Be logger.error(e.getMessage(), e); } } + */ } @Override diff --git a/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/ServiceBean.java b/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/ServiceBean.java index 6d7bc9b647..19dcef17a4 100644 --- a/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/ServiceBean.java +++ b/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/ServiceBean.java @@ -34,13 +34,13 @@ import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationContextAware; import org.springframework.context.ApplicationListener; import org.springframework.context.event.ContextRefreshedEvent; -import org.springframework.context.support.AbstractApplicationContext; -import java.lang.reflect.Method; import java.util.ArrayList; import java.util.List; import java.util.Map; +import static org.apache.dubbo.config.spring.util.BeanFactoryUtils.addApplicationListener; + /** * ServiceFactoryBean * @@ -72,23 +72,7 @@ public class ServiceBean extends ServiceConfig implements InitializingBean public void setApplicationContext(ApplicationContext applicationContext) { this.applicationContext = applicationContext; SpringExtensionFactory.addApplicationContext(applicationContext); - try { - Method method = applicationContext.getClass().getMethod("addApplicationListener", ApplicationListener.class); // backward compatibility to spring 2.0.1 - method.invoke(applicationContext, this); - supportedApplicationListener = true; - } catch (Throwable t) { - if (applicationContext instanceof AbstractApplicationContext) { - try { - Method method = AbstractApplicationContext.class.getDeclaredMethod("addListener", ApplicationListener.class); // backward compatibility to spring 2.0.1 - if (!method.isAccessible()) { - method.setAccessible(true); - } - method.invoke(applicationContext, this); - supportedApplicationListener = true; - } catch (Throwable t2) { - } - } - } + supportedApplicationListener = addApplicationListener(applicationContext, this); } @Override @@ -249,9 +233,7 @@ public class ServiceBean extends ServiceConfig implements InitializingBean @Override public void destroy() throws Exception { - // This will only be called for singleton scope bean, and expected to be called by spring shutdown hook when BeanFactory/ApplicationContext destroys. - // We will guarantee dubbo related resources being released with dubbo shutdown hook. - //unexport(); + // no need to export here, see org.apache.dubbo.config.spring.extension.SpringExtensionFactory.ShutdownHookListener } // merged from dubbox diff --git a/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/extension/SpringExtensionFactory.java b/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/extension/SpringExtensionFactory.java index ea63a35d1f..988bcecbd1 100644 --- a/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/extension/SpringExtensionFactory.java +++ b/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/extension/SpringExtensionFactory.java @@ -21,9 +21,14 @@ import org.apache.dubbo.common.extension.SPI; import org.apache.dubbo.common.logger.Logger; import org.apache.dubbo.common.logger.LoggerFactory; import org.apache.dubbo.common.utils.ConcurrentHashSet; +import org.apache.dubbo.config.DubboShutdownHook; +import org.apache.dubbo.config.spring.util.BeanFactoryUtils; import org.springframework.beans.factory.NoSuchBeanDefinitionException; import org.springframework.beans.factory.NoUniqueBeanDefinitionException; import org.springframework.context.ApplicationContext; +import org.springframework.context.ApplicationEvent; +import org.springframework.context.ApplicationListener; +import org.springframework.context.event.ContextClosedEvent; import java.util.Set; @@ -34,9 +39,11 @@ public class SpringExtensionFactory implements ExtensionFactory { private static final Logger logger = LoggerFactory.getLogger(SpringExtensionFactory.class); private static final Set contexts = new ConcurrentHashSet(); + private static final ApplicationListener shutdownHookListener = new ShutdownHookListener(); public static void addApplicationContext(ApplicationContext context) { contexts.add(context); + BeanFactoryUtils.addApplicationListener(context, shutdownHookListener); } public static void removeApplicationContext(ApplicationContext context) { @@ -93,4 +100,16 @@ public class SpringExtensionFactory implements ExtensionFactory { return null; } + private static class ShutdownHookListener implements ApplicationListener { + @Override + public void onApplicationEvent(ApplicationEvent event) { + if (event instanceof ContextClosedEvent) { + // we call it anyway since dubbo shutdown hook make sure its destroyAll() is re-entrant. + // pls. note we should not remove dubbo shutdown hook when spring framework is present, this is because + // its shutdown hook may not be installed. + DubboShutdownHook shutdownHook = DubboShutdownHook.getDubboShutdownHook(); + shutdownHook.destroyAll(); + } + } + } } diff --git a/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/initializer/DubboApplicationContextInitializer.java b/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/initializer/DubboApplicationContextInitializer.java deleted file mode 100644 index 36727e669f..0000000000 --- a/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/initializer/DubboApplicationContextInitializer.java +++ /dev/null @@ -1,39 +0,0 @@ -/* - * 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.dubbo.config.spring.initializer; - -import org.springframework.context.ApplicationContextInitializer; -import org.springframework.context.ConfigurableApplicationContext; - -/** - * Automatically register {@link DubboApplicationListener} to Spring context - * A {@link org.springframework.web.context.ContextLoaderListener} class is defined in - * src/main/resources/META-INF/web-fragment.xml - * In the web-fragment.xml, {@link DubboApplicationContextInitializer} is defined in context params. - * This file will be discovered if running under a servlet 3.0+ container. - * Even if user specifies {@link org.springframework.web.context.ContextLoaderListener} in web.xml, - * it will be merged to web.xml. - * If user specifies in web.xml, this will no take effect, - * unless user configures {@link DubboApplicationContextInitializer} explicitly in web.xml. - */ -public class DubboApplicationContextInitializer implements ApplicationContextInitializer { - - @Override - public void initialize(ConfigurableApplicationContext applicationContext) { - applicationContext.addApplicationListener(new DubboApplicationListener()); - } -} diff --git a/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/initializer/DubboApplicationListener.java b/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/initializer/DubboApplicationListener.java deleted file mode 100644 index 8b6409bd65..0000000000 --- a/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/initializer/DubboApplicationListener.java +++ /dev/null @@ -1,49 +0,0 @@ -/* - * 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.dubbo.config.spring.initializer; - -import org.apache.dubbo.bootstrap.DubboBootstrap; -import org.springframework.context.ApplicationEvent; -import org.springframework.context.ApplicationListener; -import org.springframework.context.event.ContextClosedEvent; -import org.springframework.context.event.ContextRefreshedEvent; - -/** - * An application listener that listens the ContextClosedEvent. - * Upon the event, this listener will do the necessary clean up to avoid memory leak. - */ -public class DubboApplicationListener implements ApplicationListener { - - private DubboBootstrap dubboBootstrap; - - public DubboApplicationListener() { - dubboBootstrap = new DubboBootstrap(false); - } - - public DubboApplicationListener(DubboBootstrap dubboBootstrap) { - this.dubboBootstrap = dubboBootstrap; - } - - @Override - public void onApplicationEvent(ApplicationEvent applicationEvent) { - if (applicationEvent instanceof ContextRefreshedEvent) { - dubboBootstrap.start(); - } else if (applicationEvent instanceof ContextClosedEvent) { - dubboBootstrap.stop(); - } - } -} diff --git a/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/initializer/DubboContextListener.java b/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/initializer/DubboContextListener.java deleted file mode 100644 index 35b2b70c2c..0000000000 --- a/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/initializer/DubboContextListener.java +++ /dev/null @@ -1,72 +0,0 @@ -/* - * 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.dubbo.config.spring.initializer; - -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; - -import javax.servlet.ServletContext; -import javax.servlet.ServletContextEvent; -import javax.servlet.ServletContextListener; - -/** - * A Dubbo context listener is a delegation to org.springframework.web.context.ContextLoaderListener. This is necessary, - * because Dubbo is packaged into all-in-one jar, therefore it contains a web-fragment.xml from this sub module which's - * used for helping to assemble spring context listener automatically when it's not configured explicitly by user in - * web.xml. It works fine with spring, but it will lead to ClassNotFound exception and fail tomcat's bootup when user - * doesn't depend on spring framework. - */ -public class DubboContextListener implements ServletContextListener { - private static final Log logger = LogFactory.getLog(DubboContextListener.class); - - private static final String SPRING_CONTEXT_LISTENER = "org.springframework.web.context.ContextLoaderListener"; - private static final String SPRING_CONTEXT_ROOT = "org.springframework.web.context.WebApplicationContext.ROOT"; - - private ServletContextListener springContextListener; - private boolean executed = false; - - public DubboContextListener() { - try { - Class c = Class.forName(SPRING_CONTEXT_LISTENER); - springContextListener = (ServletContextListener) c.newInstance(); - } catch (ClassNotFoundException | IllegalAccessException | InstantiationException e) { - logger.warn("Servlet container detects dubbo's web fragment configuration, and tries to load " + - "org.springframework.web.context.ContextLoaderListener but fails to find the class. " + - "If the application don't rely on Spring framework, pls. simply ignore"); - } - } - - @Override - public void contextInitialized(ServletContextEvent servletContextEvent) { - if (springContextListener != null) { - // if spring context listener has already been registered, then do nothing - ServletContext context = servletContextEvent.getServletContext(); - if (context.getAttribute(SPRING_CONTEXT_ROOT) == null) { - executed = true; - springContextListener.contextInitialized(servletContextEvent); - } - } - } - - @Override - public void contextDestroyed(ServletContextEvent servletContextEvent) { - if (springContextListener != null && executed) { - springContextListener.contextDestroyed(servletContextEvent); - } - } -} diff --git a/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/util/BeanFactoryUtils.java b/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/util/BeanFactoryUtils.java index e78739917d..e9b170885c 100644 --- a/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/util/BeanFactoryUtils.java +++ b/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/util/BeanFactoryUtils.java @@ -20,7 +20,11 @@ import org.apache.dubbo.common.utils.StringUtils; import org.springframework.beans.factory.BeanFactory; import org.springframework.beans.factory.ListableBeanFactory; import org.springframework.beans.factory.config.ConfigurableBeanFactory; +import org.springframework.context.ApplicationContext; +import org.springframework.context.ApplicationListener; +import org.springframework.context.support.AbstractApplicationContext; +import java.lang.reflect.Method; import java.util.ArrayList; import java.util.Collections; import java.util.List; @@ -89,4 +93,27 @@ public class BeanFactoryUtils { } + public static boolean addApplicationListener(ApplicationContext applicationContext, ApplicationListener listener) { + try { + // backward compatibility to spring 2.0.1 + Method method = applicationContext.getClass().getMethod("addApplicationListener", ApplicationListener.class); + method.invoke(applicationContext, listener); + return true; + } catch (Throwable t) { + if (applicationContext instanceof AbstractApplicationContext) { + try { + // backward compatibility to spring 2.0.1 + Method method = AbstractApplicationContext.class.getDeclaredMethod("addListener", ApplicationListener.class); + if (!method.isAccessible()) { + method.setAccessible(true); + } + method.invoke(applicationContext, listener); + return true; + } catch (Throwable t2) { + // ignore + } + } + } + return false; + } } diff --git a/dubbo-config/dubbo-config-spring/src/main/resources/META-INF/web-fragment.xml b/dubbo-config/dubbo-config-spring/src/main/resources/META-INF/web-fragment.xml deleted file mode 100644 index e1eef6ba0d..0000000000 --- a/dubbo-config/dubbo-config-spring/src/main/resources/META-INF/web-fragment.xml +++ /dev/null @@ -1,22 +0,0 @@ - - - dubbo_fragment - - - - - - - - - contextInitializerClasses - org.apache.dubbo.config.spring.initializer.DubboApplicationContextInitializer - - - - org.apache.dubbo.config.spring.initializer.DubboContextListener - - - diff --git a/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/initializer/DubboApplicationContextInitializerTest.java b/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/initializer/DubboApplicationContextInitializerTest.java deleted file mode 100644 index 02dda03a7a..0000000000 --- a/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/initializer/DubboApplicationContextInitializerTest.java +++ /dev/null @@ -1,88 +0,0 @@ -/* - * 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.dubbo.config.spring.initializer; - -import org.apache.catalina.core.StandardContext; -import org.apache.catalina.startup.ContextConfig; -import org.apache.catalina.startup.Tomcat; -import org.junit.Assert; -import org.junit.Test; -import org.springframework.web.context.ContextLoaderListener; - - -public class DubboApplicationContextInitializerTest { - - @Test - public void testSpringContextLoaderListenerInWebXml() throws Exception { - Tomcat tomcat = new Tomcat(); - tomcat.setBaseDir("target/test-classes"); - tomcat.setPort(12345); - StandardContext context = new StandardContext(); - context.setName("test"); - context.setDocBase("test"); - context.setPath("/test"); - context.addLifecycleListener(new ContextConfig()); - tomcat.getHost().addChild(context); - tomcat.start(); - // there should be 2 application listeners, one is spring context listener, - // the other is its wrapper dubbo introduces. - Assert.assertEquals(2, context.getApplicationLifecycleListeners().length); - // the first one should be Spring's built in ContextLoaderListener. - Assert.assertTrue(context.getApplicationLifecycleListeners()[0] instanceof ContextLoaderListener); - tomcat.stop(); - tomcat.destroy(); - } - - @Test - public void testNoListenerInWebXml() throws Exception { - Tomcat tomcat = new Tomcat(); - tomcat.setBaseDir("target/test-classes"); - tomcat.setPort(12345); - StandardContext context = new StandardContext(); - context.setName("test2"); - context.setDocBase("test2"); - context.setPath("/test2"); - context.addLifecycleListener(new ContextConfig()); - tomcat.getHost().addChild(context); - tomcat.start(); - // there should be 1 application listener, which is spring context listener's wrapper introduced by dubbo - Assert.assertEquals(1, context.getApplicationLifecycleListeners().length); - // the first one should be Spring's built in ContextLoaderListener. - Assert.assertTrue(context.getApplicationLifecycleListeners()[0] instanceof DubboContextListener); - tomcat.stop(); - tomcat.destroy(); - } - - @Test - public void testMetadataComplete() throws Exception { - Tomcat tomcat = new Tomcat(); - tomcat.setBaseDir("target/test-classes"); - tomcat.setPort(12345); - StandardContext context = new StandardContext(); - context.setName("test3"); - context.setDocBase("test3"); - context.setPath("/test3"); - context.addLifecycleListener(new ContextConfig()); - tomcat.getHost().addChild(context); - tomcat.start(); - // there should be no application listeners - Assert.assertEquals(0, context.getApplicationLifecycleListeners().length); - tomcat.stop(); - tomcat.destroy(); - } - -} diff --git a/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/initializer/DubboApplicationListenerTest.java b/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/initializer/DubboApplicationListenerTest.java deleted file mode 100644 index 9b953d5ba7..0000000000 --- a/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/initializer/DubboApplicationListenerTest.java +++ /dev/null @@ -1,59 +0,0 @@ -/* - * 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.dubbo.config.spring.initializer; - -import org.apache.dubbo.config.DubboShutdownHook; -import org.apache.dubbo.bootstrap.DubboBootstrap; -import org.junit.Test; -import org.mockito.Mockito; -import org.springframework.context.support.ClassPathXmlApplicationContext; - -public class DubboApplicationListenerTest { - - @Test - public void testTwoShutdownHook() { - DubboShutdownHook spyHook = Mockito.spy(DubboShutdownHook.getDubboShutdownHook()); - ClassPathXmlApplicationContext applicationContext = getApplicationContext(spyHook, true); - applicationContext.refresh(); - applicationContext.close(); - // shutdown hook can't be verified, because it will executed after main thread has finished. - // so we can only verify it by manually run it. - try { - spyHook.start(); - spyHook.join(); - } catch (InterruptedException e) { - e.printStackTrace(); - } - Mockito.verify(spyHook, Mockito.times(2)).destroyAll(); - } - - @Test - public void testOneShutdownHook() { - DubboShutdownHook spyHook = Mockito.spy(DubboShutdownHook.getDubboShutdownHook()); - ClassPathXmlApplicationContext applicationContext = getApplicationContext(spyHook, false); - applicationContext.refresh(); - applicationContext.close(); - Mockito.verify(spyHook, Mockito.times(1)).destroyAll(); - } - - private ClassPathXmlApplicationContext getApplicationContext(DubboShutdownHook hook, boolean registerHook) { - DubboBootstrap bootstrap = new DubboBootstrap(registerHook, hook); - ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext(); - applicationContext.addApplicationListener(new DubboApplicationListener(bootstrap)); - return applicationContext; - } -} diff --git a/dubbo-container/dubbo-container-spring/pom.xml b/dubbo-container/dubbo-container-spring/pom.xml index cbcc43e511..987b2c9d2e 100644 --- a/dubbo-container/dubbo-container-spring/pom.xml +++ b/dubbo-container/dubbo-container-spring/pom.xml @@ -38,10 +38,5 @@ org.springframework spring-context - - org.apache.dubbo - dubbo-config-spring - ${project.parent.version} - - \ No newline at end of file + diff --git a/dubbo-container/dubbo-container-spring/src/main/java/org/apache/dubbo/container/spring/SpringContainer.java b/dubbo-container/dubbo-container-spring/src/main/java/org/apache/dubbo/container/spring/SpringContainer.java index 9aa9ca5c83..c6ec474673 100644 --- a/dubbo-container/dubbo-container-spring/src/main/java/org/apache/dubbo/container/spring/SpringContainer.java +++ b/dubbo-container/dubbo-container-spring/src/main/java/org/apache/dubbo/container/spring/SpringContainer.java @@ -19,7 +19,6 @@ package org.apache.dubbo.container.spring; import org.apache.dubbo.common.logger.Logger; import org.apache.dubbo.common.logger.LoggerFactory; import org.apache.dubbo.common.utils.ConfigUtils; -import org.apache.dubbo.config.spring.initializer.DubboApplicationListener; import org.apache.dubbo.container.Container; import org.springframework.context.support.ClassPathXmlApplicationContext; @@ -44,10 +43,7 @@ public class SpringContainer implements Container { if (configPath == null || configPath.length() == 0) { configPath = DEFAULT_SPRING_CONFIG; } - context = new ClassPathXmlApplicationContext(configPath.split("[,\\s]+"), false); - context.addApplicationListener(new DubboApplicationListener()); - context.registerShutdownHook(); - context.refresh(); + context = new ClassPathXmlApplicationContext(configPath.split("[,\\s]+")); context.start(); } diff --git a/dubbo-distribution/pom.xml b/dubbo-distribution/pom.xml index 4611320fab..c5c6f0a2af 100644 --- a/dubbo-distribution/pom.xml +++ b/dubbo-distribution/pom.xml @@ -250,11 +250,6 @@ dubbo-compatible ${project.version} - - org.apache.dubbo - dubbo-bootstrap - ${project.version} - com.alibaba hessian-lite diff --git a/pom.xml b/pom.xml index 58825574b3..8f3c0e5a76 100644 --- a/pom.xml +++ b/pom.xml @@ -139,7 +139,6 @@ dubbo-demo dubbo-plugin dubbo-serialization - dubbo-bootstrap dubbo-compatible dubbo-dependencies-bom dubbo-bom From 505d15576cc90de4ed4b9b767c86663ad12697a3 Mon Sep 17 00:00:00 2001 From: Ian Luo Date: Mon, 5 Nov 2018 13:47:23 +0800 Subject: [PATCH 08/23] enhance comments (#2735) --- .../main/java/org/apache/dubbo/config/spring/ServiceBean.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/ServiceBean.java b/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/ServiceBean.java index 19dcef17a4..07031f2257 100644 --- a/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/ServiceBean.java +++ b/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/ServiceBean.java @@ -233,7 +233,8 @@ public class ServiceBean extends ServiceConfig implements InitializingBean @Override public void destroy() throws Exception { - // no need to export here, see org.apache.dubbo.config.spring.extension.SpringExtensionFactory.ShutdownHookListener + // no need to call unexport() here, see + // org.apache.dubbo.config.spring.extension.SpringExtensionFactory.ShutdownHookListener } // merged from dubbox From 2284ede0f14fae6212fac54a2e04a12534446da7 Mon Sep 17 00:00:00 2001 From: Wang jie <260072856@qq.com> Date: Mon, 5 Nov 2018 13:53:45 +0800 Subject: [PATCH 09/23] code format (#2730) * NullPointerException * code rule * code rule --- .../java/com/alibaba/dubbo/common/URL.java | 103 +++++++++++++++++- .../dubbo/common/status/StatusChecker.java | 1 + .../com/alibaba/dubbo/monitor/Monitor.java | 1 + .../com/alibaba/dubbo/registry/Registry.java | 1 + .../com/alibaba/dubbo/remoting/Channel.java | 2 + .../java/com/alibaba/dubbo/rpc/Exporter.java | 1 + .../java/com/alibaba/dubbo/rpc/Filter.java | 1 + .../com/alibaba/dubbo/rpc/Invocation.java | 2 + .../java/com/alibaba/dubbo/rpc/Invoker.java | 2 + .../alibaba/dubbo/rpc/cluster/Directory.java | 5 +- .../com/alibaba/dubbo/rpc/cluster/Router.java | 1 + .../ReferenceAnnotationBeanPostProcessor.java | 9 +- .../dubbo/rpc/service/GenericService.java | 1 + .../org/apache/dubbo/rpc/AbstractResult.java | 1 + .../apache/dubbo/rpc/AsyncContextImpl.java | 1 + .../org/apache/dubbo/rpc/AsyncRpcResult.java | 1 + 16 files changed, 127 insertions(+), 6 deletions(-) diff --git a/dubbo-compatible/src/main/java/com/alibaba/dubbo/common/URL.java b/dubbo-compatible/src/main/java/com/alibaba/dubbo/common/URL.java index 3a6796a786..76b09f43db 100644 --- a/dubbo-compatible/src/main/java/com/alibaba/dubbo/common/URL.java +++ b/dubbo-compatible/src/main/java/com/alibaba/dubbo/common/URL.java @@ -79,71 +79,88 @@ public class URL extends org.apache.dubbo.common.URL { return org.apache.dubbo.common.URL.decode(value); } + @Override public String getProtocol() { return super.getProtocol(); } + @Override public URL setProtocol(String protocol) { return new URL(protocol, super.getUsername(), super.getPassword(), super.getHost(), super.getPort(), super.getPath(), super.getParameters()); } + @Override public String getUsername() { return super.getUsername(); } + @Override public URL setUsername(String username) { return new URL(super.getProtocol(), username, super.getPassword(), super.getHost(), super.getPort(), super.getPath(), super.getParameters()); } + @Override public String getPassword() { return super.getPassword(); } + @Override public URL setPassword(String password) { return new URL(super.getProtocol(), super.getUsername(), password, super.getHost(), super.getPort(), super.getPath(), super.getParameters()); } + @Override public String getAuthority() { return super.getAuthority(); } + @Override public String getHost() { return super.getHost(); } + @Override public URL setHost(String host) { return new URL(super.getProtocol(), super.getUsername(), super.getPassword(), host, super.getPort(), super.getPath(), super.getParameters()); } + @Override public String getIp() { return super.getIp(); } + @Override public int getPort() { return super.getPort(); } + @Override public URL setPort(int port) { return new URL(super.getProtocol(), super.getUsername(), super.getPassword(), super.getHost(), port, super.getPath(), super.getParameters()); } + @Override public int getPort(int defaultPort) { return super.getPort(); } + @Override public String getAddress() { return super.getAddress(); } + @Override public URL setAddress(String address) { org.apache.dubbo.common.URL result = super.setAddress(address); return new URL(result); } + @Override public String getBackupAddress() { return super.getBackupAddress(); } + @Override public String getBackupAddress(int defaultPort) { return super.getBackupAddress(defaultPort); } @@ -153,191 +170,238 @@ public class URL extends org.apache.dubbo.common.URL { // return res.stream().map(url -> new URL(url)).collect(Collectors.toList()); // } + @Override public String getPath() { return super.getPath(); } + @Override public URL setPath(String path) { return new URL(super.getProtocol(), super.getUsername(), super.getPassword(), super.getHost(), super.getPort(), path, super.getParameters()); } + @Override public String getAbsolutePath() { return super.getAbsolutePath(); } + @Override public Map getParameters() { return super.getParameters(); } + @Override public String getParameterAndDecoded(String key) { return super.getParameterAndDecoded(key); } + @Override public String getParameterAndDecoded(String key, String defaultValue) { - return super.decode(getParameter(key, defaultValue)); + return org.apache.dubbo.common.URL.decode(getParameter(key, defaultValue)); } + @Override public String getParameter(String key) { return super.getParameter(key); } + @Override public String getParameter(String key, String defaultValue) { return super.getParameter(key, defaultValue); } + @Override public String[] getParameter(String key, String[] defaultValue) { return super.getParameter(key, defaultValue); } + @Override public URL getUrlParameter(String key) { org.apache.dubbo.common.URL result = super.getUrlParameter(key); return new URL(result); } + @Override public double getParameter(String key, double defaultValue) { return super.getParameter(key, defaultValue); } + @Override public float getParameter(String key, float defaultValue) { return super.getParameter(key, defaultValue); } + @Override public long getParameter(String key, long defaultValue) { return super.getParameter(key, defaultValue); } + @Override public int getParameter(String key, int defaultValue) { return super.getParameter(key, defaultValue); } + @Override public short getParameter(String key, short defaultValue) { return super.getParameter(key, defaultValue); } + @Override public byte getParameter(String key, byte defaultValue) { return super.getParameter(key, defaultValue); } + @Override public float getPositiveParameter(String key, float defaultValue) { return super.getPositiveParameter(key, defaultValue); } + @Override public double getPositiveParameter(String key, double defaultValue) { return super.getPositiveParameter(key, defaultValue); } + @Override public long getPositiveParameter(String key, long defaultValue) { return super.getPositiveParameter(key, defaultValue); } + @Override public int getPositiveParameter(String key, int defaultValue) { return super.getPositiveParameter(key, defaultValue); } + @Override public short getPositiveParameter(String key, short defaultValue) { return super.getPositiveParameter(key, defaultValue); } + @Override public byte getPositiveParameter(String key, byte defaultValue) { return super.getPositiveParameter(key, defaultValue); } + @Override public char getParameter(String key, char defaultValue) { return super.getParameter(key, defaultValue); } + @Override public boolean getParameter(String key, boolean defaultValue) { return super.getParameter(key, defaultValue); } + @Override public boolean hasParameter(String key) { return super.hasParameter(key); } + @Override public String getMethodParameterAndDecoded(String method, String key) { return super.getMethodParameterAndDecoded(method, key); } + @Override public String getMethodParameterAndDecoded(String method, String key, String defaultValue) { return super.getMethodParameterAndDecoded(method, key, defaultValue); } + @Override public String getMethodParameter(String method, String key) { return super.getMethodParameter(method, key); } + @Override public String getMethodParameter(String method, String key, String defaultValue) { return super.getMethodParameter(method, key, defaultValue); } + @Override public double getMethodParameter(String method, String key, double defaultValue) { return super.getMethodParameter(method, key, defaultValue); } + @Override public float getMethodParameter(String method, String key, float defaultValue) { return super.getMethodParameter(method, key, defaultValue); } + @Override public long getMethodParameter(String method, String key, long defaultValue) { return super.getMethodParameter(method, key, defaultValue); } + @Override public int getMethodParameter(String method, String key, int defaultValue) { return super.getMethodParameter(method, key, defaultValue); } + @Override public short getMethodParameter(String method, String key, short defaultValue) { return super.getMethodParameter(method, key, defaultValue); } + @Override public byte getMethodParameter(String method, String key, byte defaultValue) { return super.getMethodParameter(method, key, defaultValue); } + @Override public double getMethodPositiveParameter(String method, String key, double defaultValue) { return super.getMethodPositiveParameter(method, key, defaultValue); } + @Override public float getMethodPositiveParameter(String method, String key, float defaultValue) { return super.getMethodPositiveParameter(method, key, defaultValue); } + @Override public long getMethodPositiveParameter(String method, String key, long defaultValue) { return super.getMethodPositiveParameter(method, key, defaultValue); } + @Override public int getMethodPositiveParameter(String method, String key, int defaultValue) { return super.getMethodPositiveParameter(method, key, defaultValue); } + @Override public short getMethodPositiveParameter(String method, String key, short defaultValue) { return super.getMethodPositiveParameter(method, key, defaultValue); } + @Override public byte getMethodPositiveParameter(String method, String key, byte defaultValue) { return super.getMethodPositiveParameter(method, key, defaultValue); } + @Override public char getMethodParameter(String method, String key, char defaultValue) { return super.getMethodParameter(method, key, defaultValue); } + @Override public boolean getMethodParameter(String method, String key, boolean defaultValue) { return super.getMethodParameter(method, key, defaultValue); } + @Override public boolean hasMethodParameter(String method, String key) { return super.hasMethodParameter(method, key); } + @Override public boolean isLocalHost() { return super.isLocalHost(); } + @Override public boolean isAnyHost() { return super.isAnyHost(); } + @Override public URL addParameterAndEncoded(String key, String value) { if (value == null || value.length() == 0) { return this; @@ -345,38 +409,47 @@ public class URL extends org.apache.dubbo.common.URL { return addParameter(key, encode(value)); } + @Override public URL addParameter(String key, boolean value) { return addParameter(key, String.valueOf(value)); } + @Override public URL addParameter(String key, char value) { return addParameter(key, String.valueOf(value)); } + @Override public URL addParameter(String key, byte value) { return addParameter(key, String.valueOf(value)); } + @Override public URL addParameter(String key, short value) { return addParameter(key, String.valueOf(value)); } + @Override public URL addParameter(String key, int value) { return addParameter(key, String.valueOf(value)); } + @Override public URL addParameter(String key, long value) { return addParameter(key, String.valueOf(value)); } + @Override public URL addParameter(String key, float value) { return addParameter(key, String.valueOf(value)); } + @Override public URL addParameter(String key, double value) { return addParameter(key, String.valueOf(value)); } + @Override public URL addParameter(String key, Enum value) { if (value == null) { return this; @@ -384,6 +457,7 @@ public class URL extends org.apache.dubbo.common.URL { return addParameter(key, String.valueOf(value)); } + @Override public URL addParameter(String key, Number value) { if (value == null) { return this; @@ -391,6 +465,7 @@ public class URL extends org.apache.dubbo.common.URL { return addParameter(key, String.valueOf(value)); } + @Override public URL addParameter(String key, CharSequence value) { if (value == null || value.length() == 0) { return this; @@ -398,60 +473,72 @@ public class URL extends org.apache.dubbo.common.URL { return addParameter(key, String.valueOf(value)); } + @Override public URL addParameter(String key, String value) { org.apache.dubbo.common.URL result = super.addParameter(key, value); return new URL(result); } + @Override public URL addParameterIfAbsent(String key, String value) { org.apache.dubbo.common.URL result = super.addParameterIfAbsent(key, value); return new URL(result); } + @Override public URL addParameters(Map parameters) { org.apache.dubbo.common.URL result = super.addParameters(parameters); return new URL(result); } + @Override public URL addParametersIfAbsent(Map parameters) { org.apache.dubbo.common.URL result = super.addParametersIfAbsent(parameters); return new URL(result); } + @Override public URL addParameters(String... pairs) { org.apache.dubbo.common.URL result = super.addParameters(pairs); return new URL(result); } + @Override public URL addParameterString(String query) { org.apache.dubbo.common.URL result = super.addParameterString(query); return new URL(result); } + @Override public URL removeParameter(String key) { org.apache.dubbo.common.URL result = super.removeParameter(key); return new URL(result); } + @Override public URL removeParameters(Collection keys) { org.apache.dubbo.common.URL result = super.removeParameters(keys); return new URL(result); } + @Override public URL removeParameters(String... keys) { org.apache.dubbo.common.URL result = super.removeParameters(keys); return new URL(result); } + @Override public URL clearParameters() { org.apache.dubbo.common.URL result = super.clearParameters(); return new URL(result); } + @Override public String getRawParameter(String key) { return super.getRawParameter(key); } + @Override public Map toMap() { return super.toMap(); } @@ -461,58 +548,72 @@ public class URL extends org.apache.dubbo.common.URL { return super.toString(); } + @Override public String toString(String... parameters) { return super.toString(parameters); } + @Override public String toIdentityString() { return super.toIdentityString(); } + @Override public String toIdentityString(String... parameters) { return super.toIdentityString(parameters); } + @Override public String toFullString() { return super.toFullString(); } + @Override public String toFullString(String... parameters) { return super.toFullString(parameters); } + @Override public String toParameterString() { return super.toParameterString(); } + @Override public String toParameterString(String... parameters) { return super.toParameterString(parameters); } + @Override public java.net.URL toJavaURL() { return super.toJavaURL(); } + @Override public InetSocketAddress toInetSocketAddress() { return super.toInetSocketAddress(); } + @Override public String getServiceKey() { return super.getServiceKey(); } + @Override public String toServiceStringWithoutResolving() { return super.toServiceStringWithoutResolving(); } + @Override public String toServiceString() { return super.toServiceString(); } + @Override public String getServiceInterface() { return super.getServiceInterface(); } + @Override public URL setServiceInterface(String service) { org.apache.dubbo.common.URL result = super.setServiceInterface(service); return new URL(result); diff --git a/dubbo-compatible/src/main/java/com/alibaba/dubbo/common/status/StatusChecker.java b/dubbo-compatible/src/main/java/com/alibaba/dubbo/common/status/StatusChecker.java index a140547545..3f74c133ff 100644 --- a/dubbo-compatible/src/main/java/com/alibaba/dubbo/common/status/StatusChecker.java +++ b/dubbo-compatible/src/main/java/com/alibaba/dubbo/common/status/StatusChecker.java @@ -20,5 +20,6 @@ package com.alibaba.dubbo.common.status; @Deprecated public interface StatusChecker extends org.apache.dubbo.common.status.StatusChecker { + @Override Status check(); } diff --git a/dubbo-compatible/src/main/java/com/alibaba/dubbo/monitor/Monitor.java b/dubbo-compatible/src/main/java/com/alibaba/dubbo/monitor/Monitor.java index 7444d86573..3d4abb3cd6 100644 --- a/dubbo-compatible/src/main/java/com/alibaba/dubbo/monitor/Monitor.java +++ b/dubbo-compatible/src/main/java/com/alibaba/dubbo/monitor/Monitor.java @@ -25,6 +25,7 @@ import java.util.stream.Collectors; @Deprecated public interface Monitor extends org.apache.dubbo.monitor.Monitor { + @Override com.alibaba.dubbo.common.URL getUrl(); void collect(com.alibaba.dubbo.common.URL statistics); diff --git a/dubbo-compatible/src/main/java/com/alibaba/dubbo/registry/Registry.java b/dubbo-compatible/src/main/java/com/alibaba/dubbo/registry/Registry.java index c5a84231a4..cc9ceb14ee 100644 --- a/dubbo-compatible/src/main/java/com/alibaba/dubbo/registry/Registry.java +++ b/dubbo-compatible/src/main/java/com/alibaba/dubbo/registry/Registry.java @@ -26,6 +26,7 @@ import java.util.stream.Collectors; @Deprecated public interface Registry extends org.apache.dubbo.registry.Registry { + @Override com.alibaba.dubbo.common.URL getUrl(); void register(com.alibaba.dubbo.common.URL url); diff --git a/dubbo-compatible/src/main/java/com/alibaba/dubbo/remoting/Channel.java b/dubbo-compatible/src/main/java/com/alibaba/dubbo/remoting/Channel.java index c1606e7fac..a900047fb9 100644 --- a/dubbo-compatible/src/main/java/com/alibaba/dubbo/remoting/Channel.java +++ b/dubbo-compatible/src/main/java/com/alibaba/dubbo/remoting/Channel.java @@ -20,7 +20,9 @@ package com.alibaba.dubbo.remoting; @Deprecated public interface Channel extends org.apache.dubbo.remoting.Channel { + @Override com.alibaba.dubbo.common.URL getUrl(); + @Override com.alibaba.dubbo.remoting.ChannelHandler getChannelHandler(); } diff --git a/dubbo-compatible/src/main/java/com/alibaba/dubbo/rpc/Exporter.java b/dubbo-compatible/src/main/java/com/alibaba/dubbo/rpc/Exporter.java index 84ef9fe06f..c1fadeb9d8 100644 --- a/dubbo-compatible/src/main/java/com/alibaba/dubbo/rpc/Exporter.java +++ b/dubbo-compatible/src/main/java/com/alibaba/dubbo/rpc/Exporter.java @@ -20,6 +20,7 @@ package com.alibaba.dubbo.rpc; @Deprecated public interface Exporter extends org.apache.dubbo.rpc.Exporter { + @Override Invoker getInvoker(); class CompatibleExporter implements Exporter { diff --git a/dubbo-compatible/src/main/java/com/alibaba/dubbo/rpc/Filter.java b/dubbo-compatible/src/main/java/com/alibaba/dubbo/rpc/Filter.java index 8da7202763..4ccde294e3 100644 --- a/dubbo-compatible/src/main/java/com/alibaba/dubbo/rpc/Filter.java +++ b/dubbo-compatible/src/main/java/com/alibaba/dubbo/rpc/Filter.java @@ -22,6 +22,7 @@ public interface Filter extends org.apache.dubbo.rpc.Filter { Result invoke(Invoker invoker, Invocation invocation) throws RpcException; + @Override default org.apache.dubbo.rpc.Result invoke(org.apache.dubbo.rpc.Invoker invoker, org.apache.dubbo.rpc.Invocation invocation) throws org.apache.dubbo.rpc.RpcException { diff --git a/dubbo-compatible/src/main/java/com/alibaba/dubbo/rpc/Invocation.java b/dubbo-compatible/src/main/java/com/alibaba/dubbo/rpc/Invocation.java index 2306e3ecb5..b96d14d1ee 100644 --- a/dubbo-compatible/src/main/java/com/alibaba/dubbo/rpc/Invocation.java +++ b/dubbo-compatible/src/main/java/com/alibaba/dubbo/rpc/Invocation.java @@ -22,6 +22,7 @@ import java.util.Map; @Deprecated public interface Invocation extends org.apache.dubbo.rpc.Invocation { + @Override Invoker getInvoker(); default org.apache.dubbo.rpc.Invocation getOriginal() { @@ -71,6 +72,7 @@ public interface Invocation extends org.apache.dubbo.rpc.Invocation { return new Invoker.CompatibleInvoker(delegate.getInvoker()); } + @Override public org.apache.dubbo.rpc.Invocation getOriginal() { return delegate; } diff --git a/dubbo-compatible/src/main/java/com/alibaba/dubbo/rpc/Invoker.java b/dubbo-compatible/src/main/java/com/alibaba/dubbo/rpc/Invoker.java index 3e79676540..55a948083f 100644 --- a/dubbo-compatible/src/main/java/com/alibaba/dubbo/rpc/Invoker.java +++ b/dubbo-compatible/src/main/java/com/alibaba/dubbo/rpc/Invoker.java @@ -22,6 +22,7 @@ import org.apache.dubbo.common.URL; @Deprecated public interface Invoker extends org.apache.dubbo.rpc.Invoker { + @Override Result invoke(org.apache.dubbo.rpc.Invocation invocation) throws RpcException; default org.apache.dubbo.rpc.Invoker getOriginal() { @@ -61,6 +62,7 @@ public interface Invoker extends org.apache.dubbo.rpc.Invoker { invoker.destroy(); } + @Override public org.apache.dubbo.rpc.Invoker getOriginal() { return invoker; } diff --git a/dubbo-compatible/src/main/java/com/alibaba/dubbo/rpc/cluster/Directory.java b/dubbo-compatible/src/main/java/com/alibaba/dubbo/rpc/cluster/Directory.java index d883f84abc..6e87c61351 100644 --- a/dubbo-compatible/src/main/java/com/alibaba/dubbo/rpc/cluster/Directory.java +++ b/dubbo-compatible/src/main/java/com/alibaba/dubbo/rpc/cluster/Directory.java @@ -17,18 +17,19 @@ package com.alibaba.dubbo.rpc.cluster; -import com.alibaba.dubbo.common.URL; - import org.apache.dubbo.rpc.Invocation; import org.apache.dubbo.rpc.Invoker; import org.apache.dubbo.rpc.RpcException; +import com.alibaba.dubbo.common.URL; + import java.util.List; import java.util.stream.Collectors; @Deprecated public interface Directory extends org.apache.dubbo.rpc.cluster.Directory { + @Override URL getUrl(); List> list(com.alibaba.dubbo.rpc.Invocation invocation) throws com.alibaba.dubbo.rpc.RpcException; diff --git a/dubbo-compatible/src/main/java/com/alibaba/dubbo/rpc/cluster/Router.java b/dubbo-compatible/src/main/java/com/alibaba/dubbo/rpc/cluster/Router.java index f3d5ddca59..8a27503868 100644 --- a/dubbo-compatible/src/main/java/com/alibaba/dubbo/rpc/cluster/Router.java +++ b/dubbo-compatible/src/main/java/com/alibaba/dubbo/rpc/cluster/Router.java @@ -28,6 +28,7 @@ import java.util.stream.Collectors; @Deprecated public interface Router extends org.apache.dubbo.rpc.cluster.Router { + @Override com.alibaba.dubbo.common.URL getUrl(); List> route(List> invokers, diff --git a/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/beans/factory/annotation/ReferenceAnnotationBeanPostProcessor.java b/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/beans/factory/annotation/ReferenceAnnotationBeanPostProcessor.java index ed0fb5c420..e82239588c 100644 --- a/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/beans/factory/annotation/ReferenceAnnotationBeanPostProcessor.java +++ b/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/beans/factory/annotation/ReferenceAnnotationBeanPostProcessor.java @@ -16,12 +16,13 @@ */ package org.apache.dubbo.config.spring.beans.factory.annotation; -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; import org.apache.dubbo.common.Constants; import org.apache.dubbo.common.utils.StringUtils; import org.apache.dubbo.config.annotation.Reference; import org.apache.dubbo.config.spring.ReferenceBean; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; import org.springframework.beans.BeanUtils; import org.springframework.beans.BeansException; import org.springframework.beans.PropertyValues; @@ -581,7 +582,9 @@ public class ReferenceAnnotationBeanPostProcessor extends InstantiationAwareBean } private String toPlainString(String[] array) { - if (array == null || array.length == 0) return ""; + if (array == null || array.length == 0) { + return ""; + } StringBuilder buffer = new StringBuilder(); for (int i = 0; i < array.length; i++) { if (i > 0) { diff --git a/dubbo-rpc/dubbo-rpc-api/src/main/java/com/alibaba/dubbo/rpc/service/GenericService.java b/dubbo-rpc/dubbo-rpc-api/src/main/java/com/alibaba/dubbo/rpc/service/GenericService.java index e6b3168d62..b63b60bd3e 100644 --- a/dubbo-rpc/dubbo-rpc-api/src/main/java/com/alibaba/dubbo/rpc/service/GenericService.java +++ b/dubbo-rpc/dubbo-rpc-api/src/main/java/com/alibaba/dubbo/rpc/service/GenericService.java @@ -20,6 +20,7 @@ package com.alibaba.dubbo.rpc.service; @Deprecated public interface GenericService extends org.apache.dubbo.rpc.service.GenericService { + @Override Object $invoke(String method, String[] parameterTypes, Object[] args) throws com.alibaba.dubbo.rpc.service.GenericException; } diff --git a/dubbo-rpc/dubbo-rpc-api/src/main/java/org/apache/dubbo/rpc/AbstractResult.java b/dubbo-rpc/dubbo-rpc-api/src/main/java/org/apache/dubbo/rpc/AbstractResult.java index 064fd9fd90..760a9c1a11 100644 --- a/dubbo-rpc/dubbo-rpc-api/src/main/java/org/apache/dubbo/rpc/AbstractResult.java +++ b/dubbo-rpc/dubbo-rpc-api/src/main/java/org/apache/dubbo/rpc/AbstractResult.java @@ -64,6 +64,7 @@ public abstract class AbstractResult implements Result { return result; } + @Override public void setAttachment(String key, String value) { attachments.put(key, value); } diff --git a/dubbo-rpc/dubbo-rpc-api/src/main/java/org/apache/dubbo/rpc/AsyncContextImpl.java b/dubbo-rpc/dubbo-rpc-api/src/main/java/org/apache/dubbo/rpc/AsyncContextImpl.java index 9e4ddaf9ee..0142f73915 100644 --- a/dubbo-rpc/dubbo-rpc-api/src/main/java/org/apache/dubbo/rpc/AsyncContextImpl.java +++ b/dubbo-rpc/dubbo-rpc-api/src/main/java/org/apache/dubbo/rpc/AsyncContextImpl.java @@ -71,6 +71,7 @@ public class AsyncContextImpl implements AsyncContext { this.started.set(true); } + @Override public void signalContextSwitch() { RpcContext.restoreContext(storedContext); RpcContext.restoreServerContext(storedServerContext); diff --git a/dubbo-rpc/dubbo-rpc-api/src/main/java/org/apache/dubbo/rpc/AsyncRpcResult.java b/dubbo-rpc/dubbo-rpc-api/src/main/java/org/apache/dubbo/rpc/AsyncRpcResult.java index e9ed9156c0..81a8c75737 100644 --- a/dubbo-rpc/dubbo-rpc-api/src/main/java/org/apache/dubbo/rpc/AsyncRpcResult.java +++ b/dubbo-rpc/dubbo-rpc-api/src/main/java/org/apache/dubbo/rpc/AsyncRpcResult.java @@ -162,6 +162,7 @@ public class AsyncRpcResult extends AbstractResult { return getRpcResult().getAttachment(key, defaultValue); } + @Override public void setAttachment(String key, String value) { getRpcResult().setAttachment(key, value); } From 16f7a1efe95abed080081fbdbcf18bc9ec472b1b Mon Sep 17 00:00:00 2001 From: OrDTesters <44483852+OrDTesters@users.noreply.github.com> Date: Tue, 6 Nov 2018 03:06:10 -0600 Subject: [PATCH 10/23] Close all servers/ports after tests finish (#2741) --- .../dubbo/rpc/protocol/dubbo/DubboProtocolTest.java | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/dubbo-rpc/dubbo-rpc-dubbo/src/test/java/org/apache/dubbo/rpc/protocol/dubbo/DubboProtocolTest.java b/dubbo-rpc/dubbo-rpc-dubbo/src/test/java/org/apache/dubbo/rpc/protocol/dubbo/DubboProtocolTest.java index 7366ed1dd2..b67112c40d 100644 --- a/dubbo-rpc/dubbo-rpc-dubbo/src/test/java/org/apache/dubbo/rpc/protocol/dubbo/DubboProtocolTest.java +++ b/dubbo-rpc/dubbo-rpc-dubbo/src/test/java/org/apache/dubbo/rpc/protocol/dubbo/DubboProtocolTest.java @@ -26,11 +26,13 @@ import org.apache.dubbo.rpc.RpcException; import org.apache.dubbo.rpc.protocol.dubbo.support.DemoService; import org.apache.dubbo.rpc.protocol.dubbo.support.DemoServiceImpl; import org.apache.dubbo.rpc.protocol.dubbo.support.NonSerialized; +import org.apache.dubbo.rpc.protocol.dubbo.support.ProtocolUtils; import org.apache.dubbo.rpc.protocol.dubbo.support.RemoteService; import org.apache.dubbo.rpc.protocol.dubbo.support.RemoteServiceImpl; import org.apache.dubbo.rpc.protocol.dubbo.support.Type; import org.apache.dubbo.rpc.service.EchoService; +import org.junit.AfterClass; import org.junit.Assert; import org.junit.Test; @@ -48,6 +50,11 @@ public class DubboProtocolTest { private Protocol protocol = ExtensionLoader.getExtensionLoader(Protocol.class).getAdaptiveExtension(); private ProxyFactory proxy = ExtensionLoader.getExtensionLoader(ProxyFactory.class).getAdaptiveExtension(); + @AfterClass + public static void after() { + ProtocolUtils.closeAll(); + } + @Test public void testDemoProtocol() throws Exception { DemoService service = new DemoServiceImpl(); @@ -181,4 +188,4 @@ public class DubboProtocolTest { Assert.assertTrue(e.getMessage().contains("org.apache.dubbo.rpc.protocol.dubbo.support.NonSerialized must implement java.io.Serializable")); } } -} \ No newline at end of file +} From aed0102f0a5a1d5d795bbe4589562d4346f41e70 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=94=B0=E5=B0=8F=E6=B3=A2?= Date: Tue, 6 Nov 2018 17:09:00 +0800 Subject: [PATCH 11/23] Simplify the code of StringUtils to make it more graceful. (#2740) * Simplify the code of StringUtils to make it more graceful. * Add Apache license --- .../apache/dubbo/common/utils/ArrayUtils.java | 47 +++++++ .../dubbo/common/utils/StringUtils.java | 118 +++++++++++------- .../dubbo/common/utils/ArrayUtilsTest.java | 41 ++++++ .../dubbo/common/utils/StringUtilsTest.java | 30 ++++- 4 files changed, 191 insertions(+), 45 deletions(-) create mode 100644 dubbo-common/src/main/java/org/apache/dubbo/common/utils/ArrayUtils.java create mode 100644 dubbo-common/src/test/java/org/apache/dubbo/common/utils/ArrayUtilsTest.java diff --git a/dubbo-common/src/main/java/org/apache/dubbo/common/utils/ArrayUtils.java b/dubbo-common/src/main/java/org/apache/dubbo/common/utils/ArrayUtils.java new file mode 100644 index 0000000000..a0b62bd402 --- /dev/null +++ b/dubbo-common/src/main/java/org/apache/dubbo/common/utils/ArrayUtils.java @@ -0,0 +1,47 @@ +/* + * 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.dubbo.common.utils; + +/** + * Contains some methods to check array. + */ +public final class ArrayUtils { + + private ArrayUtils() { + } + + /** + *

Checks if the array is null or empty.

+ * + * @param array th array to check + * @return {@code true} if the array is null or empty. + */ + public static boolean isEmpty(final Object[] array) { + return array == null || array.length == 0; + } + + /** + *

Checks if the array is not null or empty.

+ * + * @param array th array to check + * @return {@code true} if the array is not null or empty. + */ + public static boolean isNotEmpty(final Object[] array) { + return !isEmpty(array); + } +} diff --git a/dubbo-common/src/main/java/org/apache/dubbo/common/utils/StringUtils.java b/dubbo-common/src/main/java/org/apache/dubbo/common/utils/StringUtils.java index c2c708f0a6..f599218f41 100644 --- a/dubbo-common/src/main/java/org/apache/dubbo/common/utils/StringUtils.java +++ b/dubbo-common/src/main/java/org/apache/dubbo/common/utils/StringUtils.java @@ -174,7 +174,7 @@ public final class StringUtils { * {@code null} if null String input */ public static String removeEnd(final String str, final String remove) { - if (isEmpty(str) || isEmpty(remove)) { + if (isAnyEmpty(str, remove)) { return str; } if (str.endsWith(remove)) { @@ -314,7 +314,7 @@ public final class StringUtils { * {@code null} if null String input */ public static String replace(final String text, final String searchString, final String replacement, int max) { - if (isEmpty(text) || isEmpty(searchString) || replacement == null || max == 0) { + if (isAnyEmpty(text, searchString) || replacement == null || max == 0) { return text; } int start = 0; @@ -340,10 +340,7 @@ public final class StringUtils { } public static boolean isBlank(String str) { - if (str == null || str.length() == 0) { - return true; - } - return false; + return isEmpty(str); } /** @@ -353,10 +350,57 @@ public final class StringUtils { * @return is empty. */ public static boolean isEmpty(String str) { - if (str == null || str.length() == 0) { - return true; + return str == null || str.isEmpty(); + } + + /** + *

Checks if the strings contain empty or null elements.

+ * + *

+     * StringUtils.isNoneEmpty(null)            = false
+     * StringUtils.isNoneEmpty("")              = false
+     * StringUtils.isNoneEmpty(" ")             = true
+     * StringUtils.isNoneEmpty("abc")           = true
+     * StringUtils.isNoneEmpty("abc", "def")    = true
+     * StringUtils.isNoneEmpty("abc", null)     = false
+     * StringUtils.isNoneEmpty("abc", "")       = false
+     * StringUtils.isNoneEmpty("abc", " ")      = true
+     * 
+ * + * @param ss the strings to check + * @return {@code true} if all strings are not empty or null + */ + public static boolean isNoneEmpty(final String... ss) { + if (ArrayUtils.isEmpty(ss)) { + return false; } - return false; + for (final String s : ss){ + if (isEmpty(s)) { + return false; + } + } + return true; + } + + /** + *

Checks if the strings contain at least on empty or null element.

+ * + *

+     * StringUtils.isAnyEmpty(null)            = true
+     * StringUtils.isAnyEmpty("")              = true
+     * StringUtils.isAnyEmpty(" ")             = false
+     * StringUtils.isAnyEmpty("abc")           = false
+     * StringUtils.isAnyEmpty("abc", "def")    = false
+     * StringUtils.isAnyEmpty("abc", null)     = true
+     * StringUtils.isAnyEmpty("abc", "")       = true
+     * StringUtils.isAnyEmpty("abc", " ")      = false
+     * 
+ * + * @param ss the strings to check + * @return {@code true} if at least one in the strings is empty or null + */ + public static boolean isAnyEmpty(final String... ss) { + return !isNoneEmpty(ss); } /** @@ -366,7 +410,7 @@ public final class StringUtils { * @return is not empty. */ public static boolean isNotEmpty(String str) { - return str != null && str.length() > 0; + return !isEmpty(str); } /** @@ -391,17 +435,11 @@ public final class StringUtils { * @return is integer */ public static boolean isInteger(String str) { - if (str == null || str.length() == 0) { - return false; - } - return INT_PATTERN.matcher(str).matches(); + return isNotEmpty(str) && INT_PATTERN.matcher(str).matches(); } public static int parseInteger(String str) { - if (!isInteger(str)) { - return 0; - } - return Integer.parseInt(str); + return isInteger(str) ? Integer.parseInt(str) : 0; } /** @@ -409,7 +447,7 @@ public final class StringUtils { * more info. */ public static boolean isJavaIdentifier(String s) { - if (s.length() == 0 || !Character.isJavaIdentifierStart(s.charAt(0))) { + if (isEmpty(s) || !Character.isJavaIdentifierStart(s.charAt(0))) { return false; } for (int i = 1; i < s.length(); i++) { @@ -421,10 +459,7 @@ public final class StringUtils { } public static boolean isContains(String values, String value) { - if (values == null || values.length() == 0) { - return false; - } - return isContains(Constants.COMMA_SPLIT_PATTERN.split(values), value); + return isNotEmpty(values) && isContains(Constants.COMMA_SPLIT_PATTERN.split(values), value); } /** @@ -433,7 +468,7 @@ public final class StringUtils { * @return contains */ public static boolean isContains(String[] values, String value) { - if (value != null && value.length() > 0 && values != null && values.length > 0) { + if (isNotEmpty(value) && ArrayUtils.isNotEmpty(values)) { for (String v : values) { if (value.equals(v)) { return true; @@ -449,7 +484,7 @@ public final class StringUtils { } int sz = str.length(); for (int i = 0; i < sz; i++) { - if (Character.isDigit(str.charAt(i)) == false) { + if (!Character.isDigit(str.charAt(i))) { return false; } } @@ -494,14 +529,14 @@ public final class StringUtils { } /** - * translat. + * translate. * * @param src source string. * @param from src char table. * @param to target char table. * @return String. */ - public static String translat(String src, String from, String to) { + public static String translate(String src, String from, String to) { if (isEmpty(src)) { return src; } @@ -561,8 +596,8 @@ public final class StringUtils { * @return String. */ public static String join(String[] array) { - if (array.length == 0) { - return ""; + if (ArrayUtils.isEmpty(array)) { + return EMPTY; } StringBuilder sb = new StringBuilder(); for (String s : array) { @@ -579,8 +614,8 @@ public final class StringUtils { * @return String. */ public static String join(String[] array, char split) { - if (array.length == 0) { - return ""; + if (ArrayUtils.isEmpty(array)) { + return EMPTY; } StringBuilder sb = new StringBuilder(); for (int i = 0; i < array.length; i++) { @@ -600,8 +635,8 @@ public final class StringUtils { * @return String. */ public static String join(String[] array, String split) { - if (array.length == 0) { - return ""; + if (ArrayUtils.isEmpty(array)) { + return EMPTY; } StringBuilder sb = new StringBuilder(); for (int i = 0; i < array.length; i++) { @@ -614,8 +649,8 @@ public final class StringUtils { } public static String join(Collection coll, String split) { - if (coll.isEmpty()) { - return ""; + if (CollectionUtils.isEmpty(coll)) { + return EMPTY; } StringBuilder sb = new StringBuilder(); @@ -643,7 +678,7 @@ public final class StringUtils { Map map = new HashMap(tmp.length); for (int i = 0; i < tmp.length; i++) { Matcher matcher = KVP_PATTERN.matcher(tmp[i]); - if (matcher.matches() == false) { + if (!matcher.matches()) { continue; } map.put(matcher.group(1), matcher.group(2)); @@ -663,7 +698,7 @@ public final class StringUtils { * @return Parameters instance. */ public static Map parseQueryString(String qs) { - if (qs == null || qs.length() == 0) { + if (isEmpty(qs)) { return new HashMap(); } return parseKeyValuePair(qs, "\\&"); @@ -672,12 +707,12 @@ public final class StringUtils { public static String getServiceKey(Map ps) { StringBuilder buf = new StringBuilder(); String group = ps.get(Constants.GROUP_KEY); - if (group != null && group.length() > 0) { + if (isNotEmpty(group)) { buf.append(group).append("/"); } buf.append(ps.get(Constants.INTERFACE_KEY)); String version = ps.get(Constants.VERSION_KEY); - if (version != null && version.length() > 0) { + if (isNotEmpty(group)) { buf.append(":").append(version); } return buf.toString(); @@ -689,8 +724,7 @@ public final class StringUtils { for (Map.Entry entry : new TreeMap(ps).entrySet()) { String key = entry.getKey(); String value = entry.getValue(); - if (key != null && key.length() > 0 - && value != null && value.length() > 0) { + if (isNoneEmpty(key, value)) { if (buf.length() > 0) { buf.append("&"); } @@ -704,7 +738,7 @@ public final class StringUtils { } public static String camelToSplitName(String camelName, String split) { - if (camelName == null || camelName.length() == 0) { + if (isEmpty(camelName)) { return camelName; } StringBuilder buf = null; diff --git a/dubbo-common/src/test/java/org/apache/dubbo/common/utils/ArrayUtilsTest.java b/dubbo-common/src/test/java/org/apache/dubbo/common/utils/ArrayUtilsTest.java new file mode 100644 index 0000000000..76fb7884bd --- /dev/null +++ b/dubbo-common/src/test/java/org/apache/dubbo/common/utils/ArrayUtilsTest.java @@ -0,0 +1,41 @@ +/* + * 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.dubbo.common.utils; + +import static junit.framework.TestCase.assertFalse; +import static junit.framework.TestCase.assertTrue; + +import org.junit.Test; + +public class ArrayUtilsTest { + + @Test + public void isEmpty() throws Exception { + assertTrue(ArrayUtils.isEmpty(null)); + assertTrue(ArrayUtils.isEmpty(new Object[0])); + assertFalse(ArrayUtils.isEmpty(new Object[]{"abc"})); + } + + @Test + public void isNotEmpty() throws Exception { + assertFalse(ArrayUtils.isNotEmpty(null)); + assertFalse(ArrayUtils.isNotEmpty(new Object[0])); + assertTrue(ArrayUtils.isNotEmpty(new Object[]{"abc"})); + } + +} \ No newline at end of file diff --git a/dubbo-common/src/test/java/org/apache/dubbo/common/utils/StringUtilsTest.java b/dubbo-common/src/test/java/org/apache/dubbo/common/utils/StringUtilsTest.java index fa95bfb834..111544155b 100644 --- a/dubbo-common/src/test/java/org/apache/dubbo/common/utils/StringUtilsTest.java +++ b/dubbo-common/src/test/java/org/apache/dubbo/common/utils/StringUtilsTest.java @@ -111,6 +111,30 @@ public class StringUtilsTest { assertFalse(StringUtils.isEmpty("abc")); } + @Test + public void testIsNoneEmpty() throws Exception { + assertFalse(StringUtils.isNoneEmpty(null)); + assertFalse(StringUtils.isNoneEmpty("")); + assertTrue(StringUtils.isNoneEmpty(" ")); + assertTrue(StringUtils.isNoneEmpty("abc")); + assertTrue(StringUtils.isNoneEmpty("abc", "def")); + assertFalse(StringUtils.isNoneEmpty("abc", null)); + assertFalse(StringUtils.isNoneEmpty("abc", "")); + assertTrue(StringUtils.isNoneEmpty("abc", " ")); + } + + @Test + public void testIsAnyEmpty() throws Exception { + assertTrue(StringUtils.isAnyEmpty(null)); + assertTrue(StringUtils.isAnyEmpty("")); + assertFalse(StringUtils.isAnyEmpty(" ")); + assertFalse(StringUtils.isAnyEmpty("abc")); + assertFalse(StringUtils.isAnyEmpty("abc", "def")); + assertTrue(StringUtils.isAnyEmpty("abc", null)); + assertTrue(StringUtils.isAnyEmpty("abc", "")); + assertFalse(StringUtils.isAnyEmpty("abc", " ")); + } + @Test public void testIsNotEmpty() throws Exception { assertFalse(StringUtils.isNotEmpty(null)); @@ -200,10 +224,10 @@ public class StringUtilsTest { } @Test - public void testTranslat() throws Exception { + public void testTranslate() throws Exception { String s = "16314"; - assertEquals(StringUtils.translat(s, "123456", "abcdef"), "afcad"); - assertEquals(StringUtils.translat(s, "123456", "abcd"), "acad"); + assertEquals(StringUtils.translate(s, "123456", "abcdef"), "afcad"); + assertEquals(StringUtils.translate(s, "123456", "abcd"), "acad"); } @Test From 56b219316205a12b4ce95a82b10b527798df9e34 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=97=B6=E6=97=A0=E4=B8=A4=E4=B8=B6?= <442367943@qq.com> Date: Tue, 6 Nov 2018 17:16:21 +0800 Subject: [PATCH 12/23] Add 'forks' config into xml config (#2568) * Add forks into xml config. * Add forks into xml config. * Add forks into xml config. --- .../apache/dubbo/config/AbstractMethodConfig.java | 13 +++++++++++++ .../dubbo/config/AbstractMethodConfigTest.java | 7 +++++++ .../src/main/resources/META-INF/compat/dubbo.xsd | 10 ++++++++++ .../src/main/resources/META-INF/dubbo.xsd | 10 ++++++++++ .../org/apache/dubbo/config/spring/ConfigTest.java | 14 ++++++++++++++ 5 files changed, 54 insertions(+) diff --git a/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/AbstractMethodConfig.java b/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/AbstractMethodConfig.java index a4acce86c9..a2c3de6531 100644 --- a/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/AbstractMethodConfig.java +++ b/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/AbstractMethodConfig.java @@ -64,6 +64,19 @@ public abstract class AbstractMethodConfig extends AbstractConfig { // customized parameters protected Map parameters; + /** + * forks for forking cluster + */ + protected Integer forks; + + public Integer getForks() { + return forks; + } + + public void setForks(Integer forks) { + this.forks = forks; + } + public Integer getTimeout() { return timeout; } diff --git a/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/AbstractMethodConfigTest.java b/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/AbstractMethodConfigTest.java index 41549e3ef9..063a2e3408 100644 --- a/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/AbstractMethodConfigTest.java +++ b/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/AbstractMethodConfigTest.java @@ -35,6 +35,13 @@ public class AbstractMethodConfigTest { assertThat(methodConfig.getTimeout(), equalTo(10)); } + @Test + public void testForks() throws Exception { + MethodConfig methodConfig = new MethodConfig(); + methodConfig.setForks(10); + assertThat(methodConfig.getForks(), equalTo(10)); + } + @Test public void testRetries() throws Exception { MethodConfig methodConfig = new MethodConfig(); diff --git a/dubbo-config/dubbo-config-spring/src/main/resources/META-INF/compat/dubbo.xsd b/dubbo-config/dubbo-config-spring/src/main/resources/META-INF/compat/dubbo.xsd index 92d7bd2705..902bae8fb1 100644 --- a/dubbo-config/dubbo-config-spring/src/main/resources/META-INF/compat/dubbo.xsd +++ b/dubbo-config/dubbo-config-spring/src/main/resources/META-INF/compat/dubbo.xsd @@ -101,6 +101,11 @@ + + + + + @@ -492,6 +497,11 @@ + + + + + diff --git a/dubbo-config/dubbo-config-spring/src/main/resources/META-INF/dubbo.xsd b/dubbo-config/dubbo-config-spring/src/main/resources/META-INF/dubbo.xsd index 88fe25fccb..9b21ba247d 100644 --- a/dubbo-config/dubbo-config-spring/src/main/resources/META-INF/dubbo.xsd +++ b/dubbo-config/dubbo-config-spring/src/main/resources/META-INF/dubbo.xsd @@ -101,6 +101,11 @@ + + + + + @@ -486,6 +491,11 @@ + + + + + diff --git a/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/ConfigTest.java b/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/ConfigTest.java index ca9cc94b6c..d36fedc583 100644 --- a/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/ConfigTest.java +++ b/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/ConfigTest.java @@ -147,6 +147,20 @@ public class ConfigTest { assertTrue(str.endsWith(" />")); } + @Test + public void testForks() { + ReferenceConfig reference = new ReferenceConfig(); + reference.setApplication(new ApplicationConfig("consumer")); + reference.setRegistry(new RegistryConfig(RegistryConfig.NO_AVAILABLE)); + reference.setInterface(DemoService.class); + reference.setUrl("dubbo://127.0.0.1:20881"); + + int forks = 10; + reference.setForks(forks); + String str = reference.toString(); + assertTrue(str.contains("forks=\"" + forks + "\"")); + } + @Test public void testMultiProtocol() { ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext(ConfigTest.class.getPackage().getName().replace('.', '/') + "/multi-protocol.xml"); From 1a88c22574cbb621bae5edadb2f2abd1cd9784d6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?y=C3=AC=20j=C3=AD?= Date: Wed, 7 Nov 2018 14:16:55 +0800 Subject: [PATCH 13/23] fix typo (#2747) --- .../dubbo/remoting/transport/netty4/NettyServerHandler.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dubbo-remoting/dubbo-remoting-netty4/src/main/java/org/apache/dubbo/remoting/transport/netty4/NettyServerHandler.java b/dubbo-remoting/dubbo-remoting-netty4/src/main/java/org/apache/dubbo/remoting/transport/netty4/NettyServerHandler.java index ba300623e8..56d4ff69c9 100644 --- a/dubbo-remoting/dubbo-remoting-netty4/src/main/java/org/apache/dubbo/remoting/transport/netty4/NettyServerHandler.java +++ b/dubbo-remoting/dubbo-remoting-netty4/src/main/java/org/apache/dubbo/remoting/transport/netty4/NettyServerHandler.java @@ -30,7 +30,7 @@ import java.util.Map; import java.util.concurrent.ConcurrentHashMap; /** - * NettyClientHandler + * NettyServerHandler */ @io.netty.channel.ChannelHandler.Sharable public class NettyServerHandler extends ChannelDuplexHandler { From e3bd69375da34e97b8801c96e654ee507fa15dce Mon Sep 17 00:00:00 2001 From: Ian Luo Date: Wed, 7 Nov 2018 14:21:42 +0800 Subject: [PATCH 14/23] =?UTF-8?q?[DUBBO-2489]=20MockClusterInvoker=20provi?= =?UTF-8?q?des=20local=20forced=20mock=EF=BC=8CI=20tested=20it=20locally,?= =?UTF-8?q?=20but=20it=20doesn't=20work=20(#2742)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../apache/dubbo/config/AbstractConfig.java | 2 +- .../dubbo/config/AbstractInterfaceConfig.java | 53 ++++--- .../dubbo/config/AbstractMethodConfig.java | 10 +- .../apache/dubbo/config/ReferenceConfig.java | 3 +- .../apache/dubbo/config/ServiceConfig.java | 3 +- .../dubbo/config/AbstractConfigTest.java | 3 +- .../config/AbstractInterfaceConfigTest.java | 27 ++-- .../apache/dubbo/rpc/support/MockInvoker.java | 144 +++++++++++------- 8 files changed, 151 insertions(+), 94 deletions(-) diff --git a/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/AbstractConfig.java b/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/AbstractConfig.java index fdaa3b16a1..b1aeeedc40 100644 --- a/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/AbstractConfig.java +++ b/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/AbstractConfig.java @@ -57,7 +57,7 @@ public abstract class AbstractConfig implements Serializable { private static final Pattern PATTERN_PATH = Pattern.compile("[/\\-$._0-9a-zA-Z]+"); - private static final Pattern PATTERN_NAME_HAS_SYMBOL = Pattern.compile("[:*,/\\-._0-9a-zA-Z]+"); + private static final Pattern PATTERN_NAME_HAS_SYMBOL = Pattern.compile("[:*,\\s/\\-._0-9a-zA-Z]+"); private static final Pattern PATTERN_KEY = Pattern.compile("[*,\\-._0-9a-zA-Z]+"); private static final Map legacyProperties = new HashMap(); diff --git a/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/AbstractInterfaceConfig.java b/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/AbstractInterfaceConfig.java index 70ab62e449..3ff1cebb9e 100644 --- a/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/AbstractInterfaceConfig.java +++ b/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/AbstractInterfaceConfig.java @@ -286,7 +286,36 @@ public abstract class AbstractInterfaceConfig extends AbstractMethodConfig { } } - protected void checkStubAndMock(Class interfaceClass) { + void checkMock(Class interfaceClass) { + if (ConfigUtils.isEmpty(mock)) { + return; + } + + String normalizedMock = MockInvoker.normalizeMock(mock); + if (normalizedMock.startsWith(Constants.RETURN_PREFIX)) { + normalizedMock = normalizedMock.substring(Constants.RETURN_PREFIX.length()).trim(); + try { + MockInvoker.parseMockValue(normalizedMock); + } catch (Exception e) { + throw new IllegalStateException("Illegal mock return in "); + } + } else if (normalizedMock.startsWith(Constants.THROW_PREFIX)) { + normalizedMock = normalizedMock.substring(Constants.THROW_PREFIX.length()).trim(); + if (ConfigUtils.isNotEmpty(normalizedMock)) { + try { + MockInvoker.getThrowable(normalizedMock); + } catch (Exception e) { + throw new IllegalStateException("Illegal mock throw in "); + } + } + } else { + MockInvoker.getMockObject(normalizedMock, interfaceClass); + } + } + + void checkStub(Class interfaceClass) { if (ConfigUtils.isNotEmpty(local)) { Class localClass = ConfigUtils.isDefault(local) ? ReflectUtils.forName(interfaceClass.getName() + "Local") : ReflectUtils.forName(local); if (!interfaceClass.isAssignableFrom(localClass)) { @@ -309,26 +338,6 @@ public abstract class AbstractInterfaceConfig extends AbstractMethodConfig { throw new IllegalStateException("No such constructor \"public " + localClass.getSimpleName() + "(" + interfaceClass.getName() + ")\" in local implementation class " + localClass.getName()); } } - if (ConfigUtils.isNotEmpty(mock)) { - if (mock.startsWith(Constants.RETURN_PREFIX)) { - String value = mock.substring(Constants.RETURN_PREFIX.length()); - try { - MockInvoker.parseMockValue(value); - } catch (Exception e) { - throw new IllegalStateException("Illegal mock json value in "); - } - } else { - Class mockClass = ConfigUtils.isDefault(mock) ? ReflectUtils.forName(interfaceClass.getName() + "Mock") : ReflectUtils.forName(mock); - if (!interfaceClass.isAssignableFrom(mockClass)) { - throw new IllegalStateException("The mock implementation class " + mockClass.getName() + " not implement interface " + interfaceClass.getName()); - } - try { - mockClass.getConstructor(new Class[0]); - } catch (NoSuchMethodException e) { - throw new IllegalStateException("No such empty constructor \"public " + mockClass.getSimpleName() + "()\" in mock implementation class " + mockClass.getName()); - } - } - } } /** @@ -522,4 +531,4 @@ public abstract class AbstractInterfaceConfig extends AbstractMethodConfig { public void setScope(String scope) { this.scope = scope; } -} \ No newline at end of file +} diff --git a/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/AbstractMethodConfig.java b/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/AbstractMethodConfig.java index a2c3de6531..a2263b8221 100644 --- a/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/AbstractMethodConfig.java +++ b/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/AbstractMethodConfig.java @@ -140,8 +140,14 @@ public abstract class AbstractMethodConfig extends AbstractConfig { } public void setMock(String mock) { - if (mock != null && mock.startsWith(Constants.RETURN_PREFIX)) { + if (mock == null) { + return; + } + + if (mock.startsWith(Constants.RETURN_PREFIX) || mock.startsWith(Constants.THROW_PREFIX + " ")) { checkLength("mock", mock); + } else if (mock.startsWith(Constants.FAIL_PREFIX) || mock.startsWith(Constants.FORCE_PREFIX)) { + checkNameHasSymbol("mock", mock); } else { checkName("mock", mock); } @@ -181,4 +187,4 @@ public abstract class AbstractMethodConfig extends AbstractConfig { this.parameters = parameters; } -} \ No newline at end of file +} diff --git a/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/ReferenceConfig.java b/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/ReferenceConfig.java index 61ed531e14..c39f3b67a5 100644 --- a/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/ReferenceConfig.java +++ b/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/ReferenceConfig.java @@ -244,7 +244,8 @@ public class ReferenceConfig extends AbstractReferenceConfig { } } checkApplication(); - checkStubAndMock(interfaceClass); + checkStub(interfaceClass); + checkMock(interfaceClass); Map map = new HashMap(); resolveAsyncInterface(interfaceClass, map); diff --git a/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/ServiceConfig.java b/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/ServiceConfig.java index e2d3969e08..42abc009e8 100644 --- a/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/ServiceConfig.java +++ b/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/ServiceConfig.java @@ -309,7 +309,8 @@ public class ServiceConfig extends AbstractServiceConfig { checkRegistry(); checkProtocol(); appendProperties(this); - checkStubAndMock(interfaceClass); + checkStub(interfaceClass); + checkMock(interfaceClass); if (path == null || path.length() == 0) { path = interfaceName; } diff --git a/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/AbstractConfigTest.java b/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/AbstractConfigTest.java index ef7354dfd2..792bed6974 100644 --- a/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/AbstractConfigTest.java +++ b/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/AbstractConfigTest.java @@ -198,7 +198,8 @@ public class AbstractConfigTest { @Test public void checkNameHasSymbol() throws Exception { try { - AbstractConfig.checkNameHasSymbol("hello", ":*,/-0123abcdABCD"); + AbstractConfig.checkNameHasSymbol("hello", ":*,/ -0123\tabcdABCD"); + AbstractConfig.checkNameHasSymbol("mock", "force:return world"); } catch (Exception e) { TestCase.fail("the value should be legal."); } diff --git a/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/AbstractInterfaceConfigTest.java b/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/AbstractInterfaceConfigTest.java index 2ea6fb4a0e..3199eb969a 100644 --- a/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/AbstractInterfaceConfigTest.java +++ b/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/AbstractInterfaceConfigTest.java @@ -185,63 +185,72 @@ public class AbstractInterfaceConfigTest { public void checkStubAndMock1() throws Exception { InterfaceConfig interfaceConfig = new InterfaceConfig(); interfaceConfig.setLocal(GreetingLocal1.class.getName()); - interfaceConfig.checkStubAndMock(Greeting.class); + interfaceConfig.checkStub(Greeting.class); + interfaceConfig.checkMock(Greeting.class); } @Test(expected = IllegalStateException.class) public void checkStubAndMock2() throws Exception { InterfaceConfig interfaceConfig = new InterfaceConfig(); interfaceConfig.setLocal(GreetingLocal2.class.getName()); - interfaceConfig.checkStubAndMock(Greeting.class); + interfaceConfig.checkStub(Greeting.class); + interfaceConfig.checkMock(Greeting.class); } @Test public void checkStubAndMock3() throws Exception { InterfaceConfig interfaceConfig = new InterfaceConfig(); interfaceConfig.setLocal(GreetingLocal3.class.getName()); - interfaceConfig.checkStubAndMock(Greeting.class); + interfaceConfig.checkStub(Greeting.class); + interfaceConfig.checkMock(Greeting.class); } @Test(expected = IllegalStateException.class) public void checkStubAndMock4() throws Exception { InterfaceConfig interfaceConfig = new InterfaceConfig(); interfaceConfig.setStub(GreetingLocal1.class.getName()); - interfaceConfig.checkStubAndMock(Greeting.class); + interfaceConfig.checkStub(Greeting.class); + interfaceConfig.checkMock(Greeting.class); } @Test(expected = IllegalStateException.class) public void checkStubAndMock5() throws Exception { InterfaceConfig interfaceConfig = new InterfaceConfig(); interfaceConfig.setStub(GreetingLocal2.class.getName()); - interfaceConfig.checkStubAndMock(Greeting.class); + interfaceConfig.checkStub(Greeting.class); + interfaceConfig.checkMock(Greeting.class); } @Test public void checkStubAndMock6() throws Exception { InterfaceConfig interfaceConfig = new InterfaceConfig(); interfaceConfig.setStub(GreetingLocal3.class.getName()); - interfaceConfig.checkStubAndMock(Greeting.class); + interfaceConfig.checkStub(Greeting.class); + interfaceConfig.checkMock(Greeting.class); } @Test(expected = IllegalStateException.class) public void checkStubAndMock7() throws Exception { InterfaceConfig interfaceConfig = new InterfaceConfig(); interfaceConfig.setMock("return {a, b}"); - interfaceConfig.checkStubAndMock(Greeting.class); + interfaceConfig.checkStub(Greeting.class); + interfaceConfig.checkMock(Greeting.class); } @Test(expected = IllegalStateException.class) public void checkStubAndMock8() throws Exception { InterfaceConfig interfaceConfig = new InterfaceConfig(); interfaceConfig.setMock(GreetingMock1.class.getName()); - interfaceConfig.checkStubAndMock(Greeting.class); + interfaceConfig.checkStub(Greeting.class); + interfaceConfig.checkMock(Greeting.class); } @Test(expected = IllegalStateException.class) public void checkStubAndMock9() throws Exception { InterfaceConfig interfaceConfig = new InterfaceConfig(); interfaceConfig.setMock(GreetingMock2.class.getName()); - interfaceConfig.checkStubAndMock(Greeting.class); + interfaceConfig.checkStub(Greeting.class); + interfaceConfig.checkMock(Greeting.class); } @Test diff --git a/dubbo-rpc/dubbo-rpc-api/src/main/java/org/apache/dubbo/rpc/support/MockInvoker.java b/dubbo-rpc/dubbo-rpc-api/src/main/java/org/apache/dubbo/rpc/support/MockInvoker.java index 9f71c41f5a..5d4d2fc259 100644 --- a/dubbo-rpc/dubbo-rpc-api/src/main/java/org/apache/dubbo/rpc/support/MockInvoker.java +++ b/dubbo-rpc/dubbo-rpc-api/src/main/java/org/apache/dubbo/rpc/support/MockInvoker.java @@ -96,26 +96,21 @@ final public class MockInvoker implements Invoker { if (StringUtils.isBlank(mock)) { throw new RpcException(new IllegalAccessException("mock can not be null. url :" + url)); } - mock = normallizeMock(URL.decode(mock)); - if (Constants.RETURN_PREFIX.trim().equalsIgnoreCase(mock.trim())) { - RpcResult result = new RpcResult(); - result.setValue(null); - return result; - } else if (mock.startsWith(Constants.RETURN_PREFIX)) { + mock = normalizeMock(URL.decode(mock)); + if (mock.startsWith(Constants.RETURN_PREFIX)) { mock = mock.substring(Constants.RETURN_PREFIX.length()).trim(); - mock = mock.replace('`', '"'); try { Type[] returnTypes = RpcUtils.getReturnTypes(invocation); Object value = parseMockValue(mock, returnTypes); return new RpcResult(value); } catch (Exception ew) { - throw new RpcException("mock return invoke error. method :" + invocation.getMethodName() + ", mock:" + mock + ", url: " + url, ew); + throw new RpcException("mock return invoke error. method :" + invocation.getMethodName() + + ", mock:" + mock + ", url: " + url, ew); } } else if (mock.startsWith(Constants.THROW_PREFIX)) { mock = mock.substring(Constants.THROW_PREFIX.length()).trim(); - mock = mock.replace('`', '"'); if (StringUtils.isBlank(mock)) { - throw new RpcException(" mocked exception for Service degradation. "); + throw new RpcException("mocked exception for service degradation."); } else { // user customized class Throwable t = getThrowable(mock); throw new RpcException(RpcException.BIZ_EXCEPTION, t); @@ -125,29 +120,29 @@ final public class MockInvoker implements Invoker { Invoker invoker = getInvoker(mock); return invoker.invoke(invocation); } catch (Throwable t) { - throw new RpcException("Failed to create mock implemention class " + mock, t); + throw new RpcException("Failed to create mock implementation class " + mock, t); } } } - private Throwable getThrowable(String throwstr) { - Throwable throwable = (Throwable) throwables.get(throwstr); + public static Throwable getThrowable(String throwstr) { + Throwable throwable = throwables.get(throwstr); if (throwable != null) { return throwable; - } else { - Throwable t = null; - try { - Class bizException = ReflectUtils.forName(throwstr); - Constructor constructor; - constructor = ReflectUtils.findConstructor(bizException, String.class); - t = (Throwable) constructor.newInstance(new Object[]{" mocked exception for Service degradation. "}); - if (throwables.size() < 1000) { - throwables.put(throwstr, t); - } - } catch (Exception e) { - throw new RpcException("mock throw error :" + throwstr + " argument error.", e); + } + + try { + Throwable t; + Class bizException = ReflectUtils.forName(throwstr); + Constructor constructor; + constructor = ReflectUtils.findConstructor(bizException, String.class); + t = (Throwable) constructor.newInstance(new Object[]{"mocked exception for service degradation."}); + if (throwables.size() < 1000) { + throwables.put(throwstr, t); } return t; + } catch (Exception e) { + throw new RpcException("mock throw error :" + throwstr + " argument error.", e); } } @@ -156,49 +151,84 @@ final public class MockInvoker implements Invoker { Invoker invoker = (Invoker) mocks.get(mockService); if (invoker != null) { return invoker; - } else { - Class serviceType = (Class) ReflectUtils.forName(url.getServiceInterface()); - if (ConfigUtils.isDefault(mockService)) { - mockService = serviceType.getName() + "Mock"; - } + } - Class mockClass = ReflectUtils.forName(mockService); - if (!serviceType.isAssignableFrom(mockClass)) { - throw new IllegalArgumentException("The mock implemention class " + mockClass.getName() + " not implement interface " + serviceType.getName()); - } + Class serviceType = (Class) ReflectUtils.forName(url.getServiceInterface()); + T mockObject = (T) getMockObject(mockService, serviceType); + invoker = proxyFactory.getInvoker(mockObject, serviceType, url); + if (mocks.size() < 10000) { + mocks.put(mockService, invoker); + } + return invoker; + } - if (!serviceType.isAssignableFrom(mockClass)) { - throw new IllegalArgumentException("The mock implemention class " + mockClass.getName() + " not implement interface " + serviceType.getName()); - } - try { - T mockObject = (T) mockClass.newInstance(); - invoker = proxyFactory.getInvoker(mockObject, (Class) serviceType, url); - if (mocks.size() < 10000) { - mocks.put(mockService, invoker); - } - return invoker; - } catch (InstantiationException e) { - throw new IllegalStateException("No such empty constructor \"public " + mockClass.getSimpleName() + "()\" in mock implemention class " + mockClass.getName(), e); - } catch (IllegalAccessException e) { - throw new IllegalStateException(e); - } + @SuppressWarnings("unchecked") + public static Object getMockObject(String mockService, Class serviceType) { + if (ConfigUtils.isDefault(mockService)) { + mockService = serviceType.getName() + "Mock"; + } + + Class mockClass = ReflectUtils.forName(mockService); + if (!serviceType.isAssignableFrom(mockClass)) { + throw new IllegalStateException("The mock class " + mockClass.getName() + + " not implement interface " + serviceType.getName()); + } + + try { + return mockClass.newInstance(); + } catch (InstantiationException e) { + throw new IllegalStateException("No default constructor from mock class " + mockClass.getName(), e); + } catch (IllegalAccessException e) { + throw new IllegalStateException(e); } } - //mock=fail:throw - //mock=fail:return - //mock=xx.Service - private String normallizeMock(String mock) { - if (mock == null || mock.trim().length() == 0) { + + /** + * Normalize mock string: + * + *
    + *
  1. return => return null
  2. + *
  3. fail => default
  4. + *
  5. force => default
  6. + *
  7. fail:throw/return foo => throw/return foo
  8. + *
  9. force:throw/return foo => throw/return foo
  10. + *
+ * + * @param mock mock string + * @return normalized mock string + */ + public static String normalizeMock(String mock) { + if (mock == null) { return mock; - } else if (ConfigUtils.isDefault(mock) || "fail".equalsIgnoreCase(mock.trim()) || "force".equalsIgnoreCase(mock.trim())) { - mock = url.getServiceInterface() + "Mock"; } + + mock = mock.trim(); + + if (mock.length() == 0) { + return mock; + } + + if (Constants.RETURN_KEY.equalsIgnoreCase(mock)) { + return Constants.RETURN_PREFIX + "null"; + } + + if (ConfigUtils.isDefault(mock) || "fail".equalsIgnoreCase(mock) || "force".equalsIgnoreCase(mock)) { + return "default"; + } + if (mock.startsWith(Constants.FAIL_PREFIX)) { mock = mock.substring(Constants.FAIL_PREFIX.length()).trim(); - } else if (mock.startsWith(Constants.FORCE_PREFIX)) { + } + + if (mock.startsWith(Constants.FORCE_PREFIX)) { mock = mock.substring(Constants.FORCE_PREFIX.length()).trim(); } + + if (mock.startsWith(Constants.RETURN_PREFIX) || mock.startsWith(Constants.THROW_PREFIX)) { + mock = mock.replace('`', '"'); + } + return mock; } From b0107e767651d066d68c3beaaca9736aed2292b8 Mon Sep 17 00:00:00 2001 From: Ian Luo Date: Wed, 7 Nov 2018 17:43:55 +0800 Subject: [PATCH 15/23] #2748: Provider should disable mock configuration (#2749) --- .../java/org/apache/dubbo/config/ServiceConfig.java | 10 ++++++++++ .../org/apache/dubbo/config/ServiceConfigTest.java | 12 ++++++++++++ 2 files changed, 22 insertions(+) diff --git a/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/ServiceConfig.java b/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/ServiceConfig.java index 42abc009e8..66e8d7fc42 100644 --- a/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/ServiceConfig.java +++ b/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/ServiceConfig.java @@ -818,6 +818,16 @@ public class ServiceConfig extends AbstractServiceConfig { } } + @Override + public void setMock(Boolean mock) { + throw new IllegalArgumentException("mock doesn't support on provider side"); + } + + @Override + public void setMock(String mock) { + throw new IllegalArgumentException("mock doesn't support on provider side"); + } + public List getExportedUrls() { return urls; } diff --git a/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/ServiceConfigTest.java b/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/ServiceConfigTest.java index 5da2b46354..74c1c92b78 100644 --- a/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/ServiceConfigTest.java +++ b/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/ServiceConfigTest.java @@ -194,6 +194,18 @@ public class ServiceConfigTest { service.setGeneric("illegal"); } + @Test(expected = IllegalArgumentException.class) + public void testMock() throws Exception { + ServiceConfig service = new ServiceConfig(); + service.setMock("true"); + } + + @Test(expected = IllegalArgumentException.class) + public void testMock2() throws Exception { + ServiceConfig service = new ServiceConfig(); + service.setMock(true); + } + @Test public void testUniqueServiceName() throws Exception { ServiceConfig service = new ServiceConfig(); From aa9f16e9eee8181b1619fd77c621d5fd57b27e82 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=94=B0=E5=B0=8F=E6=B3=A2?= Date: Thu, 8 Nov 2018 11:27:07 +0800 Subject: [PATCH 16/23] Fix the bug that ReferenceBean refers service more than once when debugging. (#2754) note: please visit http://t.cn/EAhta27 for more detail. --- .../src/main/java/org/apache/dubbo/config/AbstractConfig.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/AbstractConfig.java b/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/AbstractConfig.java index b1aeeedc40..fada00eb90 100644 --- a/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/AbstractConfig.java +++ b/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/AbstractConfig.java @@ -504,7 +504,8 @@ public abstract class AbstractConfig implements Serializable { try { String name = method.getName(); if ((name.startsWith("get") || name.startsWith("is")) - && !"getClass".equals(name) && !"get".equals(name) && !"is".equals(name) + && !"get".equals(name) && !"is".equals(name) + && !"getClass".equals(name) && !"getObject".equals(name) && Modifier.isPublic(method.getModifiers()) && method.getParameterTypes().length == 0 && isPrimitive(method.getReturnType())) { From 20a5efb5d11ca822b978a495b2e396b2dab313a5 Mon Sep 17 00:00:00 2001 From: OrDTesters <44483852+OrDTesters@users.noreply.github.com> Date: Wed, 7 Nov 2018 21:44:05 -0600 Subject: [PATCH 17/23] Close all servers/ports after tests finish (#2755) --- .../protocol/dubbo/ReferenceCountExchangeClientTest.java | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/dubbo-rpc/dubbo-rpc-dubbo/src/test/java/org/apache/dubbo/rpc/protocol/dubbo/ReferenceCountExchangeClientTest.java b/dubbo-rpc/dubbo-rpc-dubbo/src/test/java/org/apache/dubbo/rpc/protocol/dubbo/ReferenceCountExchangeClientTest.java index ea7743ad52..fb338769b6 100644 --- a/dubbo-rpc/dubbo-rpc-dubbo/src/test/java/org/apache/dubbo/rpc/protocol/dubbo/ReferenceCountExchangeClientTest.java +++ b/dubbo-rpc/dubbo-rpc-dubbo/src/test/java/org/apache/dubbo/rpc/protocol/dubbo/ReferenceCountExchangeClientTest.java @@ -26,7 +26,9 @@ import org.apache.dubbo.remoting.exchange.ExchangeClient; import org.apache.dubbo.rpc.Exporter; import org.apache.dubbo.rpc.Invoker; import org.apache.dubbo.rpc.ProxyFactory; +import org.apache.dubbo.rpc.protocol.dubbo.support.ProtocolUtils; +import org.junit.AfterClass; import org.junit.Assert; import org.junit.Before; import org.junit.BeforeClass; @@ -52,6 +54,11 @@ public class ReferenceCountExchangeClientTest { public static void setUpBeforeClass() throws Exception { } + @AfterClass + public static void tearDownAfterClass() { + ProtocolUtils.closeAll(); + } + public static Invoker referInvoker(Class type, URL url) { return (Invoker) protocol.refer(type, url); } From a7cf7373863498b2b01a560a3fe0cca78ad53f0a Mon Sep 17 00:00:00 2001 From: Huang YunKun Date: Thu, 8 Nov 2018 11:44:46 +0800 Subject: [PATCH 18/23] add checkstyle rule to check import order (#2745) --- codestyle/checkstyle.xml | 6 ++++++ codestyle/dubbo_codestyle_for_idea.xml | 2 -- .../apache/dubbo/rpc/cluster/router/tag/TagRouter.java | 1 - .../dubbo/rpc/cluster/router/tag/TagRouterFactory.java | 1 - .../java/org/apache/dubbo/common/compiler/Compiler.java | 1 - .../dubbo/common/compiler/support/AdaptiveCompiler.java | 1 - .../org/apache/dubbo/common/logger/jcl/JclLogger.java | 1 + .../apache/dubbo/common/logger/jcl/JclLoggerAdapter.java | 1 + .../support/eager/EagerThreadPoolExecutor.java | 2 +- .../org/apache/dubbo/common/timer/HashedWheelTimer.java | 8 ++++---- .../config/spring/context/annotation/EnableDubbo.java | 1 + .../CompatibleReferenceAnnotationBeanPostProcessor.java | 4 ++-- .../annotation/CompatibleReferenceBeanBuilder.java | 4 ++-- .../CompatibleServiceAnnotationBeanPostProcessor.java | 4 ++-- .../CompatibleDubboComponentScanRegistrar.java | 1 + .../schema/CompatibleAnnotationBeanDefinitionParser.java | 3 +-- .../org/apache/dubbo/config/spring/AnnotationBean.java | 1 + .../org/apache/dubbo/config/spring/ReferenceBean.java | 1 + .../java/org/apache/dubbo/config/spring/ServiceBean.java | 1 + .../annotation/AbstractAnnotationConfigBeanBuilder.java | 1 + .../annotation/DubboConfigBindingBeanPostProcessor.java | 1 + .../beans/factory/annotation/ReferenceBeanBuilder.java | 1 + .../annotation/ServiceAnnotationBeanPostProcessor.java | 1 + .../spring/context/annotation/DubboComponentScan.java | 1 + .../context/annotation/DubboComponentScanRegistrar.java | 1 + .../context/annotation/DubboConfigBindingRegistrar.java | 1 + .../context/annotation/DubboConfigBindingsRegistrar.java | 1 + .../context/annotation/DubboConfigConfiguration.java | 1 + .../annotation/DubboConfigConfigurationSelector.java | 1 + .../config/spring/context/annotation/EnableDubbo.java | 1 + .../spring/context/annotation/EnableDubboConfig.java | 1 + .../context/annotation/EnableDubboConfigBinding.java | 1 + .../context/properties/DefaultDubboConfigBinder.java | 1 + .../spring/context/properties/DubboConfigBinder.java | 1 + .../convert/converter/StringArrayToMapConverter.java | 1 + .../config/spring/extension/SpringExtensionFactory.java | 1 + .../spring/schema/AnnotationBeanDefinitionParser.java | 1 + .../config/spring/schema/DubboNamespaceHandler.java | 1 + .../config/spring/status/DataSourceStatusChecker.java | 1 + .../dubbo/config/spring/status/SpringStatusChecker.java | 1 + .../dubbo/config/spring/util/BeanFactoryUtils.java | 1 + .../java/org/apache/dubbo/demo/consumer/Consumer.java | 1 + .../java/org/apache/dubbo/cache/filter/CacheFilter.java | 4 ++-- .../apache/dubbo/cache/support/expiring/ExpiringMap.java | 2 +- .../java/org/apache/dubbo/metrics/MetricRegistry.java | 1 - .../main/java/org/apache/dubbo/qos/server/Server.java | 1 + .../dubbo/qos/server/handler/HttpProcessHandler.java | 1 + .../dubbo/qos/server/handler/LocalHostPermitHandler.java | 1 - .../dubbo/qos/server/handler/TelnetProcessHandler.java | 1 - .../main/java/org/apache/dubbo/qos/textui/TTable.java | 6 +++--- .../src/main/java/org/apache/dubbo/qos/textui/TTree.java | 2 +- .../telnet/support/command/LogTelnetHandler.java | 1 - .../remoting/transport/dispatcher/ChannelHandlers.java | 1 - .../transport/netty4/NettyBackedChannelBuffer.java | 1 + .../remoting/transport/netty4/NettyClientHandler.java | 4 ++-- .../transport/netty4/logging/MessageFormatter.java | 1 - .../remoting/zookeeper/zkclient/ZkClientWrapper.java | 7 ++++--- .../org/apache/dubbo/rpc/filter/AccessLogFilter.java | 3 ++- .../org/apache/dubbo/rpc/proxy/AbstractProxyFactory.java | 4 ++-- .../java/org/apache/dubbo/rpc/support/MockInvoker.java | 1 + .../dubbo/rpc/protocol/dubbo/filter/TraceFilter.java | 1 + .../rpc/protocol/dubbo/telnet/InvokeTelnetHandler.java | 1 + .../rpc/protocol/dubbo/telnet/LogTelnetHandler.java | 1 - .../hessian/DubboHessianURLConnectionFactory.java | 1 + .../dubbo/rpc/protocol/hessian/HessianProtocol.java | 2 +- .../org/apache/dubbo/rpc/protocol/http/HttpProtocol.java | 1 + .../dubbo/rpc/protocol/http/HttpRemoteInvocation.java | 1 + .../apache/dubbo/rpc/protocol/rest/RpcContextFilter.java | 1 + .../swagger/DubboSwaggerApiListingResource.java | 9 +++++---- .../rest/integration/swagger/DubboSwaggerService.java | 2 +- .../dubbo/rpc/protocol/rmi/RmiRemoteInvocation.java | 1 + .../apache/dubbo/rpc/protocol/thrift/ThriftCodec.java | 1 - .../common/serialize/fastjson/FastJsonObjectOutput.java | 1 + .../apache/dubbo/common/serialize/fst/FstFactory.java | 1 + .../common/serialize/hessian2/Hessian2ObjectInput.java | 3 ++- .../common/serialize/hessian2/Hessian2ObjectOutput.java | 3 ++- .../dubbo/common/serialize/java/JavaObjectOutput.java | 1 - .../dubbo/common/serialize/kryo/CompatibleKryo.java | 7 ++++--- .../common/serialize/kryo/utils/AbstractKryoFactory.java | 5 +++-- .../serialize/protostuff/ProtostuffObjectInput.java | 5 +++-- .../serialize/protostuff/ProtostuffObjectOutput.java | 5 +++-- .../common/serialize/protostuff/utils/WrapperUtils.java | 5 +++-- .../org/apache/dubbo/test/Spring3CompatibilityTest.java | 1 + .../dubbo/test/consumer/ConsumerConfiguration.java | 1 + .../dubbo/test/provider/ProviderConfiguration.java | 1 + 85 files changed, 108 insertions(+), 62 deletions(-) diff --git a/codestyle/checkstyle.xml b/codestyle/checkstyle.xml index ffdafd15f4..621a9e37bc 100644 --- a/codestyle/checkstyle.xml +++ b/codestyle/checkstyle.xml @@ -20,5 +20,11 @@ + + + + + + \ No newline at end of file diff --git a/codestyle/dubbo_codestyle_for_idea.xml b/codestyle/dubbo_codestyle_for_idea.xml index 4c632e4b28..1f87caa713 100644 --- a/codestyle/dubbo_codestyle_for_idea.xml +++ b/codestyle/dubbo_codestyle_for_idea.xml @@ -5,8 +5,6 @@ - - diff --git a/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/router/tag/TagRouter.java b/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/router/tag/TagRouter.java index 38fd6166ef..e9a3b5b869 100644 --- a/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/router/tag/TagRouter.java +++ b/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/router/tag/TagRouter.java @@ -16,7 +16,6 @@ */ package org.apache.dubbo.rpc.cluster.router.tag; - import org.apache.dubbo.common.Constants; import org.apache.dubbo.common.URL; import org.apache.dubbo.common.logger.Logger; diff --git a/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/router/tag/TagRouterFactory.java b/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/router/tag/TagRouterFactory.java index 05ad427ce6..f827b08d51 100644 --- a/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/router/tag/TagRouterFactory.java +++ b/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/router/tag/TagRouterFactory.java @@ -16,7 +16,6 @@ */ package org.apache.dubbo.rpc.cluster.router.tag; - import org.apache.dubbo.common.URL; import org.apache.dubbo.rpc.cluster.Router; import org.apache.dubbo.rpc.cluster.RouterFactory; diff --git a/dubbo-common/src/main/java/org/apache/dubbo/common/compiler/Compiler.java b/dubbo-common/src/main/java/org/apache/dubbo/common/compiler/Compiler.java index 7c55a2910a..3b8961d83f 100644 --- a/dubbo-common/src/main/java/org/apache/dubbo/common/compiler/Compiler.java +++ b/dubbo-common/src/main/java/org/apache/dubbo/common/compiler/Compiler.java @@ -16,7 +16,6 @@ */ package org.apache.dubbo.common.compiler; - import org.apache.dubbo.common.extension.SPI; /** diff --git a/dubbo-common/src/main/java/org/apache/dubbo/common/compiler/support/AdaptiveCompiler.java b/dubbo-common/src/main/java/org/apache/dubbo/common/compiler/support/AdaptiveCompiler.java index b47857c686..a0c5cc6b41 100644 --- a/dubbo-common/src/main/java/org/apache/dubbo/common/compiler/support/AdaptiveCompiler.java +++ b/dubbo-common/src/main/java/org/apache/dubbo/common/compiler/support/AdaptiveCompiler.java @@ -16,7 +16,6 @@ */ package org.apache.dubbo.common.compiler.support; - import org.apache.dubbo.common.compiler.Compiler; import org.apache.dubbo.common.extension.Adaptive; import org.apache.dubbo.common.extension.ExtensionLoader; diff --git a/dubbo-common/src/main/java/org/apache/dubbo/common/logger/jcl/JclLogger.java b/dubbo-common/src/main/java/org/apache/dubbo/common/logger/jcl/JclLogger.java index c88c1ab0bf..59e30e24bb 100644 --- a/dubbo-common/src/main/java/org/apache/dubbo/common/logger/jcl/JclLogger.java +++ b/dubbo-common/src/main/java/org/apache/dubbo/common/logger/jcl/JclLogger.java @@ -17,6 +17,7 @@ package org.apache.dubbo.common.logger.jcl; import org.apache.dubbo.common.logger.Logger; + import org.apache.commons.logging.Log; import java.io.Serializable; diff --git a/dubbo-common/src/main/java/org/apache/dubbo/common/logger/jcl/JclLoggerAdapter.java b/dubbo-common/src/main/java/org/apache/dubbo/common/logger/jcl/JclLoggerAdapter.java index 6a80695250..4ff23c66b9 100644 --- a/dubbo-common/src/main/java/org/apache/dubbo/common/logger/jcl/JclLoggerAdapter.java +++ b/dubbo-common/src/main/java/org/apache/dubbo/common/logger/jcl/JclLoggerAdapter.java @@ -19,6 +19,7 @@ package org.apache.dubbo.common.logger.jcl; import org.apache.dubbo.common.logger.Level; import org.apache.dubbo.common.logger.Logger; import org.apache.dubbo.common.logger.LoggerAdapter; + import org.apache.commons.logging.LogFactory; import java.io.File; diff --git a/dubbo-common/src/main/java/org/apache/dubbo/common/threadpool/support/eager/EagerThreadPoolExecutor.java b/dubbo-common/src/main/java/org/apache/dubbo/common/threadpool/support/eager/EagerThreadPoolExecutor.java index f8eb5df2c8..d35e8d8f6c 100644 --- a/dubbo-common/src/main/java/org/apache/dubbo/common/threadpool/support/eager/EagerThreadPoolExecutor.java +++ b/dubbo-common/src/main/java/org/apache/dubbo/common/threadpool/support/eager/EagerThreadPoolExecutor.java @@ -17,11 +17,11 @@ package org.apache.dubbo.common.threadpool.support.eager; +import java.util.concurrent.RejectedExecutionException; import java.util.concurrent.RejectedExecutionHandler; import java.util.concurrent.ThreadFactory; import java.util.concurrent.ThreadPoolExecutor; import java.util.concurrent.TimeUnit; -import java.util.concurrent.RejectedExecutionException; import java.util.concurrent.atomic.AtomicInteger; /** diff --git a/dubbo-common/src/main/java/org/apache/dubbo/common/timer/HashedWheelTimer.java b/dubbo-common/src/main/java/org/apache/dubbo/common/timer/HashedWheelTimer.java index 7801ce06a4..f786caeb8c 100644 --- a/dubbo-common/src/main/java/org/apache/dubbo/common/timer/HashedWheelTimer.java +++ b/dubbo-common/src/main/java/org/apache/dubbo/common/timer/HashedWheelTimer.java @@ -20,17 +20,17 @@ import org.apache.dubbo.common.logger.Logger; import org.apache.dubbo.common.logger.LoggerFactory; import org.apache.dubbo.common.utils.ClassHelper; +import java.util.Collections; +import java.util.HashSet; +import java.util.Locale; import java.util.Queue; import java.util.Set; -import java.util.HashSet; -import java.util.Collections; -import java.util.Locale; import java.util.concurrent.ArrayBlockingQueue; import java.util.concurrent.CountDownLatch; import java.util.concurrent.Executors; +import java.util.concurrent.RejectedExecutionException; import java.util.concurrent.ThreadFactory; import java.util.concurrent.TimeUnit; -import java.util.concurrent.RejectedExecutionException; import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.atomic.AtomicIntegerFieldUpdater; diff --git a/dubbo-compatible/src/main/java/com/alibaba/dubbo/config/spring/context/annotation/EnableDubbo.java b/dubbo-compatible/src/main/java/com/alibaba/dubbo/config/spring/context/annotation/EnableDubbo.java index 0c25432403..1310d1a203 100644 --- a/dubbo-compatible/src/main/java/com/alibaba/dubbo/config/spring/context/annotation/EnableDubbo.java +++ b/dubbo-compatible/src/main/java/com/alibaba/dubbo/config/spring/context/annotation/EnableDubbo.java @@ -20,6 +20,7 @@ package com.alibaba.dubbo.config.spring.context.annotation; import org.apache.dubbo.config.AbstractConfig; import org.apache.dubbo.config.spring.context.annotation.CompatibleDubboComponentScan; import org.apache.dubbo.config.spring.context.annotation.EnableDubboConfig; + import org.springframework.core.annotation.AliasFor; import java.lang.annotation.Documented; diff --git a/dubbo-compatible/src/main/java/org/apache/dubbo/config/spring/beans/factory/annotation/CompatibleReferenceAnnotationBeanPostProcessor.java b/dubbo-compatible/src/main/java/org/apache/dubbo/config/spring/beans/factory/annotation/CompatibleReferenceAnnotationBeanPostProcessor.java index 009bd28f80..544b1cb0bd 100644 --- a/dubbo-compatible/src/main/java/org/apache/dubbo/config/spring/beans/factory/annotation/CompatibleReferenceAnnotationBeanPostProcessor.java +++ b/dubbo-compatible/src/main/java/org/apache/dubbo/config/spring/beans/factory/annotation/CompatibleReferenceAnnotationBeanPostProcessor.java @@ -16,9 +16,9 @@ */ package org.apache.dubbo.config.spring.beans.factory.annotation; -import com.alibaba.dubbo.config.annotation.Reference; - import org.apache.dubbo.config.spring.ReferenceBean; + +import com.alibaba.dubbo.config.annotation.Reference; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.springframework.beans.BeanUtils; diff --git a/dubbo-compatible/src/main/java/org/apache/dubbo/config/spring/beans/factory/annotation/CompatibleReferenceBeanBuilder.java b/dubbo-compatible/src/main/java/org/apache/dubbo/config/spring/beans/factory/annotation/CompatibleReferenceBeanBuilder.java index 924ffcbee3..cb2ba68a51 100644 --- a/dubbo-compatible/src/main/java/org/apache/dubbo/config/spring/beans/factory/annotation/CompatibleReferenceBeanBuilder.java +++ b/dubbo-compatible/src/main/java/org/apache/dubbo/config/spring/beans/factory/annotation/CompatibleReferenceBeanBuilder.java @@ -16,12 +16,12 @@ */ package org.apache.dubbo.config.spring.beans.factory.annotation; -import com.alibaba.dubbo.config.annotation.Reference; - import org.apache.dubbo.config.ConsumerConfig; import org.apache.dubbo.config.spring.ReferenceBean; import org.apache.dubbo.config.spring.convert.converter.StringArrayToMapConverter; import org.apache.dubbo.config.spring.convert.converter.StringArrayToStringConverter; + +import com.alibaba.dubbo.config.annotation.Reference; import org.springframework.context.ApplicationContext; import org.springframework.core.convert.ConversionService; import org.springframework.core.convert.support.DefaultConversionService; diff --git a/dubbo-compatible/src/main/java/org/apache/dubbo/config/spring/beans/factory/annotation/CompatibleServiceAnnotationBeanPostProcessor.java b/dubbo-compatible/src/main/java/org/apache/dubbo/config/spring/beans/factory/annotation/CompatibleServiceAnnotationBeanPostProcessor.java index b2ab6151be..5f4d990352 100644 --- a/dubbo-compatible/src/main/java/org/apache/dubbo/config/spring/beans/factory/annotation/CompatibleServiceAnnotationBeanPostProcessor.java +++ b/dubbo-compatible/src/main/java/org/apache/dubbo/config/spring/beans/factory/annotation/CompatibleServiceAnnotationBeanPostProcessor.java @@ -16,12 +16,12 @@ */ package org.apache.dubbo.config.spring.beans.factory.annotation; -import com.alibaba.dubbo.config.annotation.Service; - import org.apache.dubbo.common.logger.Logger; import org.apache.dubbo.common.logger.LoggerFactory; import org.apache.dubbo.config.spring.ServiceBean; import org.apache.dubbo.config.spring.context.annotation.DubboClassPathBeanDefinitionScanner; + +import com.alibaba.dubbo.config.annotation.Service; import org.springframework.beans.BeansException; import org.springframework.beans.MutablePropertyValues; import org.springframework.beans.factory.BeanClassLoaderAware; diff --git a/dubbo-compatible/src/main/java/org/apache/dubbo/config/spring/context/annotation/CompatibleDubboComponentScanRegistrar.java b/dubbo-compatible/src/main/java/org/apache/dubbo/config/spring/context/annotation/CompatibleDubboComponentScanRegistrar.java index df41b6e131..089bdda8cd 100644 --- a/dubbo-compatible/src/main/java/org/apache/dubbo/config/spring/context/annotation/CompatibleDubboComponentScanRegistrar.java +++ b/dubbo-compatible/src/main/java/org/apache/dubbo/config/spring/context/annotation/CompatibleDubboComponentScanRegistrar.java @@ -19,6 +19,7 @@ package org.apache.dubbo.config.spring.context.annotation; import org.apache.dubbo.config.spring.beans.factory.annotation.CompatibleReferenceAnnotationBeanPostProcessor; import org.apache.dubbo.config.spring.beans.factory.annotation.CompatibleServiceAnnotationBeanPostProcessor; import org.apache.dubbo.config.spring.util.BeanRegistrar; + import org.springframework.beans.factory.BeanFactory; import org.springframework.beans.factory.config.BeanDefinition; import org.springframework.beans.factory.support.AbstractBeanDefinition; diff --git a/dubbo-compatible/src/main/java/org/apache/dubbo/config/spring/schema/CompatibleAnnotationBeanDefinitionParser.java b/dubbo-compatible/src/main/java/org/apache/dubbo/config/spring/schema/CompatibleAnnotationBeanDefinitionParser.java index c5e7bfaca8..66d6ac2dcc 100644 --- a/dubbo-compatible/src/main/java/org/apache/dubbo/config/spring/schema/CompatibleAnnotationBeanDefinitionParser.java +++ b/dubbo-compatible/src/main/java/org/apache/dubbo/config/spring/schema/CompatibleAnnotationBeanDefinitionParser.java @@ -17,11 +17,10 @@ package org.apache.dubbo.config.spring.schema; import org.apache.dubbo.config.spring.AnnotationBean; - import org.apache.dubbo.config.spring.beans.factory.annotation.CompatibleReferenceAnnotationBeanPostProcessor; import org.apache.dubbo.config.spring.beans.factory.annotation.CompatibleServiceAnnotationBeanPostProcessor; - import org.apache.dubbo.config.spring.util.BeanRegistrar; + import org.springframework.beans.factory.BeanFactory; import org.springframework.beans.factory.config.BeanDefinition; import org.springframework.beans.factory.support.BeanDefinitionBuilder; diff --git a/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/AnnotationBean.java b/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/AnnotationBean.java index 6b54a395db..874fedc44f 100644 --- a/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/AnnotationBean.java +++ b/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/AnnotationBean.java @@ -32,6 +32,7 @@ import org.apache.dubbo.config.RegistryConfig; import org.apache.dubbo.config.ServiceConfig; import org.apache.dubbo.config.annotation.Reference; import org.apache.dubbo.config.annotation.Service; + import org.springframework.beans.BeansException; import org.springframework.beans.factory.DisposableBean; import org.springframework.beans.factory.config.BeanFactoryPostProcessor; diff --git a/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/ReferenceBean.java b/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/ReferenceBean.java index bd6195ccb2..337b250f77 100644 --- a/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/ReferenceBean.java +++ b/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/ReferenceBean.java @@ -25,6 +25,7 @@ import org.apache.dubbo.config.RegistryConfig; import org.apache.dubbo.config.annotation.Reference; import org.apache.dubbo.config.spring.extension.SpringExtensionFactory; import org.apache.dubbo.config.support.Parameter; + import org.springframework.beans.factory.BeanFactoryUtils; import org.springframework.beans.factory.DisposableBean; import org.springframework.beans.factory.FactoryBean; diff --git a/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/ServiceBean.java b/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/ServiceBean.java index 07031f2257..1abd8e1cc4 100644 --- a/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/ServiceBean.java +++ b/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/ServiceBean.java @@ -25,6 +25,7 @@ import org.apache.dubbo.config.RegistryConfig; import org.apache.dubbo.config.ServiceConfig; import org.apache.dubbo.config.annotation.Service; import org.apache.dubbo.config.spring.extension.SpringExtensionFactory; + import org.springframework.aop.support.AopUtils; import org.springframework.beans.factory.BeanFactoryUtils; import org.springframework.beans.factory.BeanNameAware; diff --git a/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/beans/factory/annotation/AbstractAnnotationConfigBeanBuilder.java b/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/beans/factory/annotation/AbstractAnnotationConfigBeanBuilder.java index 431b130e70..eb99855e72 100644 --- a/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/beans/factory/annotation/AbstractAnnotationConfigBeanBuilder.java +++ b/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/beans/factory/annotation/AbstractAnnotationConfigBeanBuilder.java @@ -21,6 +21,7 @@ import org.apache.dubbo.config.ApplicationConfig; import org.apache.dubbo.config.ModuleConfig; import org.apache.dubbo.config.MonitorConfig; import org.apache.dubbo.config.RegistryConfig; + import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.springframework.context.ApplicationContext; diff --git a/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/beans/factory/annotation/DubboConfigBindingBeanPostProcessor.java b/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/beans/factory/annotation/DubboConfigBindingBeanPostProcessor.java index 356c476178..65aadeff35 100644 --- a/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/beans/factory/annotation/DubboConfigBindingBeanPostProcessor.java +++ b/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/beans/factory/annotation/DubboConfigBindingBeanPostProcessor.java @@ -22,6 +22,7 @@ import org.apache.dubbo.config.spring.context.annotation.DubboConfigBindingRegis import org.apache.dubbo.config.spring.context.annotation.EnableDubboConfigBinding; import org.apache.dubbo.config.spring.context.properties.DefaultDubboConfigBinder; import org.apache.dubbo.config.spring.context.properties.DubboConfigBinder; + import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.springframework.beans.BeansException; diff --git a/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/beans/factory/annotation/ReferenceBeanBuilder.java b/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/beans/factory/annotation/ReferenceBeanBuilder.java index ec3f4e9e7e..617b5f15ff 100644 --- a/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/beans/factory/annotation/ReferenceBeanBuilder.java +++ b/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/beans/factory/annotation/ReferenceBeanBuilder.java @@ -21,6 +21,7 @@ import org.apache.dubbo.config.annotation.Reference; import org.apache.dubbo.config.spring.ReferenceBean; import org.apache.dubbo.config.spring.convert.converter.StringArrayToMapConverter; import org.apache.dubbo.config.spring.convert.converter.StringArrayToStringConverter; + import org.springframework.context.ApplicationContext; import org.springframework.core.convert.ConversionService; import org.springframework.core.convert.support.DefaultConversionService; diff --git a/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/beans/factory/annotation/ServiceAnnotationBeanPostProcessor.java b/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/beans/factory/annotation/ServiceAnnotationBeanPostProcessor.java index 0558528f61..ad4a6c4b88 100644 --- a/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/beans/factory/annotation/ServiceAnnotationBeanPostProcessor.java +++ b/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/beans/factory/annotation/ServiceAnnotationBeanPostProcessor.java @@ -21,6 +21,7 @@ import org.apache.dubbo.common.logger.LoggerFactory; import org.apache.dubbo.config.annotation.Service; import org.apache.dubbo.config.spring.ServiceBean; import org.apache.dubbo.config.spring.context.annotation.DubboClassPathBeanDefinitionScanner; + import org.springframework.beans.BeansException; import org.springframework.beans.MutablePropertyValues; import org.springframework.beans.factory.BeanClassLoaderAware; diff --git a/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/context/annotation/DubboComponentScan.java b/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/context/annotation/DubboComponentScan.java index a947a02be5..82f16ecbb4 100644 --- a/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/context/annotation/DubboComponentScan.java +++ b/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/context/annotation/DubboComponentScan.java @@ -18,6 +18,7 @@ package org.apache.dubbo.config.spring.context.annotation; import org.apache.dubbo.config.annotation.Reference; import org.apache.dubbo.config.annotation.Service; + import org.springframework.context.annotation.Import; import java.lang.annotation.Annotation; diff --git a/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/context/annotation/DubboComponentScanRegistrar.java b/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/context/annotation/DubboComponentScanRegistrar.java index 7fda60f553..6e14d56247 100644 --- a/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/context/annotation/DubboComponentScanRegistrar.java +++ b/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/context/annotation/DubboComponentScanRegistrar.java @@ -20,6 +20,7 @@ import org.apache.dubbo.config.annotation.Service; import org.apache.dubbo.config.spring.beans.factory.annotation.ReferenceAnnotationBeanPostProcessor; import org.apache.dubbo.config.spring.beans.factory.annotation.ServiceAnnotationBeanPostProcessor; import org.apache.dubbo.config.spring.util.BeanRegistrar; + import org.springframework.beans.factory.BeanFactory; import org.springframework.beans.factory.config.BeanDefinition; import org.springframework.beans.factory.support.AbstractBeanDefinition; diff --git a/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/context/annotation/DubboConfigBindingRegistrar.java b/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/context/annotation/DubboConfigBindingRegistrar.java index 2440f3446a..52ab0e6712 100644 --- a/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/context/annotation/DubboConfigBindingRegistrar.java +++ b/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/context/annotation/DubboConfigBindingRegistrar.java @@ -18,6 +18,7 @@ package org.apache.dubbo.config.spring.context.annotation; import org.apache.dubbo.config.AbstractConfig; import org.apache.dubbo.config.spring.beans.factory.annotation.DubboConfigBindingBeanPostProcessor; + import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.springframework.beans.factory.config.BeanDefinition; diff --git a/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/context/annotation/DubboConfigBindingsRegistrar.java b/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/context/annotation/DubboConfigBindingsRegistrar.java index 9472c1b76d..b420fe12ff 100644 --- a/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/context/annotation/DubboConfigBindingsRegistrar.java +++ b/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/context/annotation/DubboConfigBindingsRegistrar.java @@ -17,6 +17,7 @@ package org.apache.dubbo.config.spring.context.annotation; import org.apache.dubbo.config.AbstractConfig; + import org.springframework.beans.factory.support.BeanDefinitionRegistry; import org.springframework.context.EnvironmentAware; import org.springframework.context.annotation.ImportBeanDefinitionRegistrar; diff --git a/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/context/annotation/DubboConfigConfiguration.java b/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/context/annotation/DubboConfigConfiguration.java index b3e98a5979..e9f39da986 100644 --- a/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/context/annotation/DubboConfigConfiguration.java +++ b/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/context/annotation/DubboConfigConfiguration.java @@ -24,6 +24,7 @@ import org.apache.dubbo.config.MonitorConfig; import org.apache.dubbo.config.ProtocolConfig; import org.apache.dubbo.config.ProviderConfig; import org.apache.dubbo.config.RegistryConfig; + import org.springframework.context.annotation.Configuration; /** diff --git a/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/context/annotation/DubboConfigConfigurationSelector.java b/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/context/annotation/DubboConfigConfigurationSelector.java index a5e97b26a2..639ad971b4 100644 --- a/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/context/annotation/DubboConfigConfigurationSelector.java +++ b/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/context/annotation/DubboConfigConfigurationSelector.java @@ -17,6 +17,7 @@ package org.apache.dubbo.config.spring.context.annotation; import org.apache.dubbo.config.AbstractConfig; + import org.springframework.context.annotation.ImportSelector; import org.springframework.core.Ordered; import org.springframework.core.annotation.AnnotationAttributes; diff --git a/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/context/annotation/EnableDubbo.java b/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/context/annotation/EnableDubbo.java index 0ce6e27159..4535f188e4 100644 --- a/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/context/annotation/EnableDubbo.java +++ b/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/context/annotation/EnableDubbo.java @@ -17,6 +17,7 @@ package org.apache.dubbo.config.spring.context.annotation; import org.apache.dubbo.config.AbstractConfig; + import org.springframework.core.annotation.AliasFor; import java.lang.annotation.Documented; diff --git a/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/context/annotation/EnableDubboConfig.java b/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/context/annotation/EnableDubboConfig.java index 710ed796a1..889e39078b 100644 --- a/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/context/annotation/EnableDubboConfig.java +++ b/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/context/annotation/EnableDubboConfig.java @@ -23,6 +23,7 @@ import org.apache.dubbo.config.MonitorConfig; import org.apache.dubbo.config.ProtocolConfig; import org.apache.dubbo.config.ProviderConfig; import org.apache.dubbo.config.RegistryConfig; + import org.springframework.context.annotation.Import; import java.lang.annotation.Documented; diff --git a/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/context/annotation/EnableDubboConfigBinding.java b/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/context/annotation/EnableDubboConfigBinding.java index 7bc7008d6a..8b50f36728 100644 --- a/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/context/annotation/EnableDubboConfigBinding.java +++ b/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/context/annotation/EnableDubboConfigBinding.java @@ -21,6 +21,7 @@ import org.apache.dubbo.config.ApplicationConfig; import org.apache.dubbo.config.ModuleConfig; import org.apache.dubbo.config.RegistryConfig; import org.apache.dubbo.config.spring.beans.factory.annotation.DubboConfigBindingBeanPostProcessor; + import org.springframework.context.annotation.Import; import org.springframework.core.env.PropertySources; diff --git a/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/context/properties/DefaultDubboConfigBinder.java b/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/context/properties/DefaultDubboConfigBinder.java index 670c49e5bc..e1d44da8f7 100644 --- a/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/context/properties/DefaultDubboConfigBinder.java +++ b/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/context/properties/DefaultDubboConfigBinder.java @@ -17,6 +17,7 @@ package org.apache.dubbo.config.spring.context.properties; import org.apache.dubbo.config.AbstractConfig; + import org.springframework.beans.MutablePropertyValues; import org.springframework.validation.DataBinder; diff --git a/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/context/properties/DubboConfigBinder.java b/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/context/properties/DubboConfigBinder.java index a0052ff95c..00d713fac6 100644 --- a/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/context/properties/DubboConfigBinder.java +++ b/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/context/properties/DubboConfigBinder.java @@ -17,6 +17,7 @@ package org.apache.dubbo.config.spring.context.properties; import org.apache.dubbo.config.AbstractConfig; + import org.springframework.context.EnvironmentAware; /** diff --git a/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/convert/converter/StringArrayToMapConverter.java b/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/convert/converter/StringArrayToMapConverter.java index b7739d11c4..a2e4790919 100644 --- a/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/convert/converter/StringArrayToMapConverter.java +++ b/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/convert/converter/StringArrayToMapConverter.java @@ -17,6 +17,7 @@ package org.apache.dubbo.config.spring.convert.converter; import org.apache.dubbo.common.utils.CollectionUtils; + import org.springframework.core.convert.converter.Converter; import org.springframework.util.ObjectUtils; diff --git a/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/extension/SpringExtensionFactory.java b/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/extension/SpringExtensionFactory.java index 988bcecbd1..99b538c25e 100644 --- a/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/extension/SpringExtensionFactory.java +++ b/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/extension/SpringExtensionFactory.java @@ -23,6 +23,7 @@ import org.apache.dubbo.common.logger.LoggerFactory; import org.apache.dubbo.common.utils.ConcurrentHashSet; import org.apache.dubbo.config.DubboShutdownHook; import org.apache.dubbo.config.spring.util.BeanFactoryUtils; + import org.springframework.beans.factory.NoSuchBeanDefinitionException; import org.springframework.beans.factory.NoUniqueBeanDefinitionException; import org.springframework.context.ApplicationContext; diff --git a/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/schema/AnnotationBeanDefinitionParser.java b/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/schema/AnnotationBeanDefinitionParser.java index 833f816cd4..918c916f3c 100644 --- a/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/schema/AnnotationBeanDefinitionParser.java +++ b/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/schema/AnnotationBeanDefinitionParser.java @@ -20,6 +20,7 @@ import org.apache.dubbo.config.spring.AnnotationBean; import org.apache.dubbo.config.spring.beans.factory.annotation.ReferenceAnnotationBeanPostProcessor; import org.apache.dubbo.config.spring.beans.factory.annotation.ServiceAnnotationBeanPostProcessor; import org.apache.dubbo.config.spring.util.BeanRegistrar; + import org.springframework.beans.factory.BeanFactory; import org.springframework.beans.factory.config.BeanDefinition; import org.springframework.beans.factory.support.BeanDefinitionBuilder; diff --git a/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/schema/DubboNamespaceHandler.java b/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/schema/DubboNamespaceHandler.java index 9f16c39cfa..035c3f925c 100644 --- a/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/schema/DubboNamespaceHandler.java +++ b/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/schema/DubboNamespaceHandler.java @@ -26,6 +26,7 @@ import org.apache.dubbo.config.ProviderConfig; import org.apache.dubbo.config.RegistryConfig; import org.apache.dubbo.config.spring.ReferenceBean; import org.apache.dubbo.config.spring.ServiceBean; + import org.springframework.beans.factory.xml.NamespaceHandlerSupport; /** diff --git a/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/status/DataSourceStatusChecker.java b/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/status/DataSourceStatusChecker.java index 5a934bed1f..5f268065b4 100644 --- a/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/status/DataSourceStatusChecker.java +++ b/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/status/DataSourceStatusChecker.java @@ -22,6 +22,7 @@ import org.apache.dubbo.common.logger.LoggerFactory; import org.apache.dubbo.common.status.Status; import org.apache.dubbo.common.status.StatusChecker; import org.apache.dubbo.config.spring.extension.SpringExtensionFactory; + import org.springframework.context.ApplicationContext; import javax.sql.DataSource; diff --git a/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/status/SpringStatusChecker.java b/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/status/SpringStatusChecker.java index 8f4fb6525b..9a99ec138f 100644 --- a/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/status/SpringStatusChecker.java +++ b/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/status/SpringStatusChecker.java @@ -22,6 +22,7 @@ import org.apache.dubbo.common.logger.LoggerFactory; import org.apache.dubbo.common.status.Status; import org.apache.dubbo.common.status.StatusChecker; import org.apache.dubbo.config.spring.extension.SpringExtensionFactory; + import org.springframework.context.ApplicationContext; import org.springframework.context.Lifecycle; diff --git a/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/util/BeanFactoryUtils.java b/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/util/BeanFactoryUtils.java index e9b170885c..e519cdee28 100644 --- a/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/util/BeanFactoryUtils.java +++ b/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/util/BeanFactoryUtils.java @@ -17,6 +17,7 @@ package org.apache.dubbo.config.spring.util; import org.apache.dubbo.common.utils.StringUtils; + import org.springframework.beans.factory.BeanFactory; import org.springframework.beans.factory.ListableBeanFactory; import org.springframework.beans.factory.config.ConfigurableBeanFactory; diff --git a/dubbo-demo/dubbo-demo-consumer/src/main/java/org/apache/dubbo/demo/consumer/Consumer.java b/dubbo-demo/dubbo-demo-consumer/src/main/java/org/apache/dubbo/demo/consumer/Consumer.java index 8ad330e978..dd2f585194 100644 --- a/dubbo-demo/dubbo-demo-consumer/src/main/java/org/apache/dubbo/demo/consumer/Consumer.java +++ b/dubbo-demo/dubbo-demo-consumer/src/main/java/org/apache/dubbo/demo/consumer/Consumer.java @@ -17,6 +17,7 @@ package org.apache.dubbo.demo.consumer; import org.apache.dubbo.demo.DemoService; + import org.springframework.context.support.ClassPathXmlApplicationContext; public class Consumer { diff --git a/dubbo-filter/dubbo-filter-cache/src/main/java/org/apache/dubbo/cache/filter/CacheFilter.java b/dubbo-filter/dubbo-filter-cache/src/main/java/org/apache/dubbo/cache/filter/CacheFilter.java index 62a739d186..ee6282659a 100644 --- a/dubbo-filter/dubbo-filter-cache/src/main/java/org/apache/dubbo/cache/filter/CacheFilter.java +++ b/dubbo-filter/dubbo-filter-cache/src/main/java/org/apache/dubbo/cache/filter/CacheFilter.java @@ -16,8 +16,6 @@ */ package org.apache.dubbo.cache.filter; -import java.io.Serializable; - import org.apache.dubbo.cache.Cache; import org.apache.dubbo.cache.CacheFactory; import org.apache.dubbo.common.Constants; @@ -31,6 +29,8 @@ import org.apache.dubbo.rpc.Result; import org.apache.dubbo.rpc.RpcException; import org.apache.dubbo.rpc.RpcResult; +import java.io.Serializable; + /** * CacheFilter */ diff --git a/dubbo-filter/dubbo-filter-cache/src/main/java/org/apache/dubbo/cache/support/expiring/ExpiringMap.java b/dubbo-filter/dubbo-filter-cache/src/main/java/org/apache/dubbo/cache/support/expiring/ExpiringMap.java index c3cb373bc0..381a43ada8 100644 --- a/dubbo-filter/dubbo-filter-cache/src/main/java/org/apache/dubbo/cache/support/expiring/ExpiringMap.java +++ b/dubbo-filter/dubbo-filter-cache/src/main/java/org/apache/dubbo/cache/support/expiring/ExpiringMap.java @@ -16,9 +16,9 @@ */ package org.apache.dubbo.cache.support.expiring; +import java.util.ArrayList; import java.util.Collection; import java.util.List; -import java.util.ArrayList; import java.util.Map; import java.util.Set; import java.util.concurrent.ConcurrentHashMap; diff --git a/dubbo-metrics/dubbo-metrics-api/src/main/java/org/apache/dubbo/metrics/MetricRegistry.java b/dubbo-metrics/dubbo-metrics-api/src/main/java/org/apache/dubbo/metrics/MetricRegistry.java index abb467a319..567ee4aa73 100644 --- a/dubbo-metrics/dubbo-metrics-api/src/main/java/org/apache/dubbo/metrics/MetricRegistry.java +++ b/dubbo-metrics/dubbo-metrics-api/src/main/java/org/apache/dubbo/metrics/MetricRegistry.java @@ -16,7 +16,6 @@ */ package org.apache.dubbo.metrics; - import java.util.Map; import java.util.Set; diff --git a/dubbo-plugin/dubbo-qos/src/main/java/org/apache/dubbo/qos/server/Server.java b/dubbo-plugin/dubbo-qos/src/main/java/org/apache/dubbo/qos/server/Server.java index 4051698e06..b39221dcbf 100644 --- a/dubbo-plugin/dubbo-qos/src/main/java/org/apache/dubbo/qos/server/Server.java +++ b/dubbo-plugin/dubbo-qos/src/main/java/org/apache/dubbo/qos/server/Server.java @@ -19,6 +19,7 @@ package org.apache.dubbo.qos.server; import org.apache.dubbo.common.logger.Logger; import org.apache.dubbo.common.logger.LoggerFactory; import org.apache.dubbo.qos.server.handler.QosProcessHandler; + import io.netty.bootstrap.ServerBootstrap; import io.netty.channel.Channel; import io.netty.channel.ChannelInitializer; diff --git a/dubbo-plugin/dubbo-qos/src/main/java/org/apache/dubbo/qos/server/handler/HttpProcessHandler.java b/dubbo-plugin/dubbo-qos/src/main/java/org/apache/dubbo/qos/server/handler/HttpProcessHandler.java index b7fea07aca..9a36c9758c 100644 --- a/dubbo-plugin/dubbo-qos/src/main/java/org/apache/dubbo/qos/server/handler/HttpProcessHandler.java +++ b/dubbo-plugin/dubbo-qos/src/main/java/org/apache/dubbo/qos/server/handler/HttpProcessHandler.java @@ -23,6 +23,7 @@ import org.apache.dubbo.qos.command.CommandExecutor; import org.apache.dubbo.qos.command.DefaultCommandExecutor; import org.apache.dubbo.qos.command.NoSuchCommandException; import org.apache.dubbo.qos.command.decoder.HttpCommandDecoder; + import io.netty.buffer.Unpooled; import io.netty.channel.ChannelFutureListener; import io.netty.channel.ChannelHandlerContext; diff --git a/dubbo-plugin/dubbo-qos/src/main/java/org/apache/dubbo/qos/server/handler/LocalHostPermitHandler.java b/dubbo-plugin/dubbo-qos/src/main/java/org/apache/dubbo/qos/server/handler/LocalHostPermitHandler.java index 2194b728e0..d93284ae7f 100644 --- a/dubbo-plugin/dubbo-qos/src/main/java/org/apache/dubbo/qos/server/handler/LocalHostPermitHandler.java +++ b/dubbo-plugin/dubbo-qos/src/main/java/org/apache/dubbo/qos/server/handler/LocalHostPermitHandler.java @@ -16,7 +16,6 @@ */ package org.apache.dubbo.qos.server.handler; - import org.apache.dubbo.qos.common.QosConstants; import io.netty.buffer.ByteBuf; diff --git a/dubbo-plugin/dubbo-qos/src/main/java/org/apache/dubbo/qos/server/handler/TelnetProcessHandler.java b/dubbo-plugin/dubbo-qos/src/main/java/org/apache/dubbo/qos/server/handler/TelnetProcessHandler.java index f1c02094a1..2faffa04e7 100644 --- a/dubbo-plugin/dubbo-qos/src/main/java/org/apache/dubbo/qos/server/handler/TelnetProcessHandler.java +++ b/dubbo-plugin/dubbo-qos/src/main/java/org/apache/dubbo/qos/server/handler/TelnetProcessHandler.java @@ -16,7 +16,6 @@ */ package org.apache.dubbo.qos.server.handler; - import org.apache.dubbo.common.logger.Logger; import org.apache.dubbo.common.logger.LoggerFactory; import org.apache.dubbo.common.utils.StringUtils; diff --git a/dubbo-plugin/dubbo-qos/src/main/java/org/apache/dubbo/qos/textui/TTable.java b/dubbo-plugin/dubbo-qos/src/main/java/org/apache/dubbo/qos/textui/TTable.java index 74372e5c57..9469f1e6a3 100644 --- a/dubbo-plugin/dubbo-qos/src/main/java/org/apache/dubbo/qos/textui/TTable.java +++ b/dubbo-plugin/dubbo-qos/src/main/java/org/apache/dubbo/qos/textui/TTable.java @@ -21,13 +21,13 @@ import java.util.ArrayList; import java.util.List; import java.util.Scanner; +import static java.lang.Math.abs; +import static java.lang.Math.max; +import static java.lang.String.format; import static org.apache.dubbo.common.utils.StringUtils.EMPTY; import static org.apache.dubbo.common.utils.StringUtils.length; import static org.apache.dubbo.common.utils.StringUtils.repeat; import static org.apache.dubbo.common.utils.StringUtils.replace; -import static java.lang.Math.abs; -import static java.lang.Math.max; -import static java.lang.String.format; /** * Table diff --git a/dubbo-plugin/dubbo-qos/src/main/java/org/apache/dubbo/qos/textui/TTree.java b/dubbo-plugin/dubbo-qos/src/main/java/org/apache/dubbo/qos/textui/TTree.java index 70e14e9588..351f876426 100644 --- a/dubbo-plugin/dubbo-qos/src/main/java/org/apache/dubbo/qos/textui/TTree.java +++ b/dubbo-plugin/dubbo-qos/src/main/java/org/apache/dubbo/qos/textui/TTree.java @@ -21,10 +21,10 @@ import java.util.ArrayList; import java.util.List; import java.util.Scanner; +import static java.lang.System.currentTimeMillis; import static org.apache.dubbo.common.utils.StringUtils.EMPTY; import static org.apache.dubbo.common.utils.StringUtils.length; import static org.apache.dubbo.common.utils.StringUtils.repeat; -import static java.lang.System.currentTimeMillis; /** * tree diff --git a/dubbo-remoting/dubbo-remoting-api/src/main/java/org/apache/dubbo/remoting/telnet/support/command/LogTelnetHandler.java b/dubbo-remoting/dubbo-remoting-api/src/main/java/org/apache/dubbo/remoting/telnet/support/command/LogTelnetHandler.java index e01aa83af7..121b9d3538 100644 --- a/dubbo-remoting/dubbo-remoting-api/src/main/java/org/apache/dubbo/remoting/telnet/support/command/LogTelnetHandler.java +++ b/dubbo-remoting/dubbo-remoting-api/src/main/java/org/apache/dubbo/remoting/telnet/support/command/LogTelnetHandler.java @@ -16,7 +16,6 @@ */ package org.apache.dubbo.remoting.telnet.support.command; - import org.apache.dubbo.common.extension.Activate; import org.apache.dubbo.common.logger.Level; import org.apache.dubbo.common.logger.LoggerFactory; diff --git a/dubbo-remoting/dubbo-remoting-api/src/main/java/org/apache/dubbo/remoting/transport/dispatcher/ChannelHandlers.java b/dubbo-remoting/dubbo-remoting-api/src/main/java/org/apache/dubbo/remoting/transport/dispatcher/ChannelHandlers.java index d14a1c3d6d..1ec59617ad 100644 --- a/dubbo-remoting/dubbo-remoting-api/src/main/java/org/apache/dubbo/remoting/transport/dispatcher/ChannelHandlers.java +++ b/dubbo-remoting/dubbo-remoting-api/src/main/java/org/apache/dubbo/remoting/transport/dispatcher/ChannelHandlers.java @@ -16,7 +16,6 @@ */ package org.apache.dubbo.remoting.transport.dispatcher; - import org.apache.dubbo.common.URL; import org.apache.dubbo.common.extension.ExtensionLoader; import org.apache.dubbo.remoting.ChannelHandler; diff --git a/dubbo-remoting/dubbo-remoting-netty4/src/main/java/org/apache/dubbo/remoting/transport/netty4/NettyBackedChannelBuffer.java b/dubbo-remoting/dubbo-remoting-netty4/src/main/java/org/apache/dubbo/remoting/transport/netty4/NettyBackedChannelBuffer.java index 20ac7a143e..143660a3d9 100644 --- a/dubbo-remoting/dubbo-remoting-netty4/src/main/java/org/apache/dubbo/remoting/transport/netty4/NettyBackedChannelBuffer.java +++ b/dubbo-remoting/dubbo-remoting-netty4/src/main/java/org/apache/dubbo/remoting/transport/netty4/NettyBackedChannelBuffer.java @@ -20,6 +20,7 @@ import org.apache.dubbo.common.utils.Assert; import org.apache.dubbo.remoting.buffer.ChannelBuffer; import org.apache.dubbo.remoting.buffer.ChannelBufferFactory; import org.apache.dubbo.remoting.buffer.ChannelBuffers; + import io.netty.buffer.ByteBuf; import java.io.IOException; diff --git a/dubbo-remoting/dubbo-remoting-netty4/src/main/java/org/apache/dubbo/remoting/transport/netty4/NettyClientHandler.java b/dubbo-remoting/dubbo-remoting-netty4/src/main/java/org/apache/dubbo/remoting/transport/netty4/NettyClientHandler.java index 61086e20e3..2d8981170f 100644 --- a/dubbo-remoting/dubbo-remoting-netty4/src/main/java/org/apache/dubbo/remoting/transport/netty4/NettyClientHandler.java +++ b/dubbo-remoting/dubbo-remoting-netty4/src/main/java/org/apache/dubbo/remoting/transport/netty4/NettyClientHandler.java @@ -19,12 +19,12 @@ package org.apache.dubbo.remoting.transport.netty4; import org.apache.dubbo.common.URL; import org.apache.dubbo.common.utils.StringUtils; import org.apache.dubbo.remoting.ChannelHandler; +import org.apache.dubbo.remoting.exchange.Request; +import org.apache.dubbo.remoting.exchange.Response; import io.netty.channel.ChannelDuplexHandler; import io.netty.channel.ChannelHandlerContext; import io.netty.channel.ChannelPromise; -import org.apache.dubbo.remoting.exchange.Request; -import org.apache.dubbo.remoting.exchange.Response; /** * NettyClientHandler diff --git a/dubbo-remoting/dubbo-remoting-netty4/src/main/java/org/apache/dubbo/remoting/transport/netty4/logging/MessageFormatter.java b/dubbo-remoting/dubbo-remoting-netty4/src/main/java/org/apache/dubbo/remoting/transport/netty4/logging/MessageFormatter.java index c8a6c2a3bc..a138bcf6e6 100644 --- a/dubbo-remoting/dubbo-remoting-netty4/src/main/java/org/apache/dubbo/remoting/transport/netty4/logging/MessageFormatter.java +++ b/dubbo-remoting/dubbo-remoting-netty4/src/main/java/org/apache/dubbo/remoting/transport/netty4/logging/MessageFormatter.java @@ -16,7 +16,6 @@ */ package org.apache.dubbo.remoting.transport.netty4.logging; - import java.text.MessageFormat; import java.util.HashMap; import java.util.Map; diff --git a/dubbo-remoting/dubbo-remoting-zookeeper/src/main/java/org/apache/dubbo/remoting/zookeeper/zkclient/ZkClientWrapper.java b/dubbo-remoting/dubbo-remoting-zookeeper/src/main/java/org/apache/dubbo/remoting/zookeeper/zkclient/ZkClientWrapper.java index 17aa372da8..a22bbe99a1 100644 --- a/dubbo-remoting/dubbo-remoting-zookeeper/src/main/java/org/apache/dubbo/remoting/zookeeper/zkclient/ZkClientWrapper.java +++ b/dubbo-remoting/dubbo-remoting-zookeeper/src/main/java/org/apache/dubbo/remoting/zookeeper/zkclient/ZkClientWrapper.java @@ -16,12 +16,13 @@ */ package org.apache.dubbo.remoting.zookeeper.zkclient; -import org.I0Itec.zkclient.IZkChildListener; -import org.I0Itec.zkclient.IZkStateListener; -import org.I0Itec.zkclient.ZkClient; import org.apache.dubbo.common.logger.Logger; import org.apache.dubbo.common.logger.LoggerFactory; import org.apache.dubbo.common.utils.Assert; + +import org.I0Itec.zkclient.IZkChildListener; +import org.I0Itec.zkclient.IZkStateListener; +import org.I0Itec.zkclient.ZkClient; import org.apache.zookeeper.Watcher.Event.KeeperState; import java.util.List; diff --git a/dubbo-rpc/dubbo-rpc-api/src/main/java/org/apache/dubbo/rpc/filter/AccessLogFilter.java b/dubbo-rpc/dubbo-rpc-api/src/main/java/org/apache/dubbo/rpc/filter/AccessLogFilter.java index 58965e1196..89eb070603 100644 --- a/dubbo-rpc/dubbo-rpc-api/src/main/java/org/apache/dubbo/rpc/filter/AccessLogFilter.java +++ b/dubbo-rpc/dubbo-rpc-api/src/main/java/org/apache/dubbo/rpc/filter/AccessLogFilter.java @@ -18,7 +18,6 @@ package org.apache.dubbo.rpc.filter; import org.apache.dubbo.common.Constants; import org.apache.dubbo.common.extension.Activate; -import com.alibaba.fastjson.JSON; import org.apache.dubbo.common.logger.Logger; import org.apache.dubbo.common.logger.LoggerFactory; import org.apache.dubbo.common.utils.ConcurrentHashSet; @@ -31,6 +30,8 @@ import org.apache.dubbo.rpc.Result; import org.apache.dubbo.rpc.RpcContext; import org.apache.dubbo.rpc.RpcException; +import com.alibaba.fastjson.JSON; + import java.io.File; import java.io.FileWriter; import java.text.SimpleDateFormat; diff --git a/dubbo-rpc/dubbo-rpc-api/src/main/java/org/apache/dubbo/rpc/proxy/AbstractProxyFactory.java b/dubbo-rpc/dubbo-rpc-api/src/main/java/org/apache/dubbo/rpc/proxy/AbstractProxyFactory.java index bc4a4c9ba7..c46aada701 100644 --- a/dubbo-rpc/dubbo-rpc-api/src/main/java/org/apache/dubbo/rpc/proxy/AbstractProxyFactory.java +++ b/dubbo-rpc/dubbo-rpc-api/src/main/java/org/apache/dubbo/rpc/proxy/AbstractProxyFactory.java @@ -16,8 +16,6 @@ */ package org.apache.dubbo.rpc.proxy; -import com.alibaba.dubbo.rpc.service.EchoService; - import org.apache.dubbo.common.Constants; import org.apache.dubbo.common.utils.ReflectUtils; import org.apache.dubbo.rpc.Invoker; @@ -25,6 +23,8 @@ import org.apache.dubbo.rpc.ProxyFactory; import org.apache.dubbo.rpc.RpcException; import org.apache.dubbo.rpc.service.GenericService; +import com.alibaba.dubbo.rpc.service.EchoService; + /** * AbstractProxyFactory */ diff --git a/dubbo-rpc/dubbo-rpc-api/src/main/java/org/apache/dubbo/rpc/support/MockInvoker.java b/dubbo-rpc/dubbo-rpc-api/src/main/java/org/apache/dubbo/rpc/support/MockInvoker.java index 5d4d2fc259..ef9dac3b89 100644 --- a/dubbo-rpc/dubbo-rpc-api/src/main/java/org/apache/dubbo/rpc/support/MockInvoker.java +++ b/dubbo-rpc/dubbo-rpc-api/src/main/java/org/apache/dubbo/rpc/support/MockInvoker.java @@ -30,6 +30,7 @@ import org.apache.dubbo.rpc.Result; import org.apache.dubbo.rpc.RpcException; import org.apache.dubbo.rpc.RpcInvocation; import org.apache.dubbo.rpc.RpcResult; + import com.alibaba.fastjson.JSON; import java.lang.reflect.Constructor; diff --git a/dubbo-rpc/dubbo-rpc-dubbo/src/main/java/org/apache/dubbo/rpc/protocol/dubbo/filter/TraceFilter.java b/dubbo-rpc/dubbo-rpc-dubbo/src/main/java/org/apache/dubbo/rpc/protocol/dubbo/filter/TraceFilter.java index 475c3eef2a..53ae2bd457 100644 --- a/dubbo-rpc/dubbo-rpc-dubbo/src/main/java/org/apache/dubbo/rpc/protocol/dubbo/filter/TraceFilter.java +++ b/dubbo-rpc/dubbo-rpc-dubbo/src/main/java/org/apache/dubbo/rpc/protocol/dubbo/filter/TraceFilter.java @@ -28,6 +28,7 @@ import org.apache.dubbo.rpc.Invoker; import org.apache.dubbo.rpc.Result; import org.apache.dubbo.rpc.RpcContext; import org.apache.dubbo.rpc.RpcException; + import com.alibaba.fastjson.JSON; import java.util.ArrayList; diff --git a/dubbo-rpc/dubbo-rpc-dubbo/src/main/java/org/apache/dubbo/rpc/protocol/dubbo/telnet/InvokeTelnetHandler.java b/dubbo-rpc/dubbo-rpc-dubbo/src/main/java/org/apache/dubbo/rpc/protocol/dubbo/telnet/InvokeTelnetHandler.java index d149a50e45..82591ab90c 100644 --- a/dubbo-rpc/dubbo-rpc-dubbo/src/main/java/org/apache/dubbo/rpc/protocol/dubbo/telnet/InvokeTelnetHandler.java +++ b/dubbo-rpc/dubbo-rpc-dubbo/src/main/java/org/apache/dubbo/rpc/protocol/dubbo/telnet/InvokeTelnetHandler.java @@ -28,6 +28,7 @@ import org.apache.dubbo.rpc.Invoker; import org.apache.dubbo.rpc.RpcContext; import org.apache.dubbo.rpc.RpcInvocation; import org.apache.dubbo.rpc.protocol.dubbo.DubboProtocol; + import com.alibaba.fastjson.JSON; import java.lang.reflect.Method; diff --git a/dubbo-rpc/dubbo-rpc-dubbo/src/main/java/org/apache/dubbo/rpc/protocol/dubbo/telnet/LogTelnetHandler.java b/dubbo-rpc/dubbo-rpc-dubbo/src/main/java/org/apache/dubbo/rpc/protocol/dubbo/telnet/LogTelnetHandler.java index ae8ac964f7..ac2379784c 100644 --- a/dubbo-rpc/dubbo-rpc-dubbo/src/main/java/org/apache/dubbo/rpc/protocol/dubbo/telnet/LogTelnetHandler.java +++ b/dubbo-rpc/dubbo-rpc-dubbo/src/main/java/org/apache/dubbo/rpc/protocol/dubbo/telnet/LogTelnetHandler.java @@ -16,7 +16,6 @@ */ package org.apache.dubbo.rpc.protocol.dubbo.telnet; - import org.apache.dubbo.common.extension.Activate; import org.apache.dubbo.common.logger.Level; import org.apache.dubbo.common.logger.LoggerFactory; diff --git a/dubbo-rpc/dubbo-rpc-hessian/src/main/java/org/apache/dubbo/rpc/protocol/hessian/DubboHessianURLConnectionFactory.java b/dubbo-rpc/dubbo-rpc-hessian/src/main/java/org/apache/dubbo/rpc/protocol/hessian/DubboHessianURLConnectionFactory.java index 0cce1045f0..21c566fe0f 100644 --- a/dubbo-rpc/dubbo-rpc-hessian/src/main/java/org/apache/dubbo/rpc/protocol/hessian/DubboHessianURLConnectionFactory.java +++ b/dubbo-rpc/dubbo-rpc-hessian/src/main/java/org/apache/dubbo/rpc/protocol/hessian/DubboHessianURLConnectionFactory.java @@ -19,6 +19,7 @@ package org.apache.dubbo.rpc.protocol.hessian; import org.apache.dubbo.common.Constants; import org.apache.dubbo.rpc.RpcContext; + import com.caucho.hessian.client.HessianConnection; import com.caucho.hessian.client.HessianURLConnectionFactory; diff --git a/dubbo-rpc/dubbo-rpc-hessian/src/main/java/org/apache/dubbo/rpc/protocol/hessian/HessianProtocol.java b/dubbo-rpc/dubbo-rpc-hessian/src/main/java/org/apache/dubbo/rpc/protocol/hessian/HessianProtocol.java index 8a7e0e99bb..3b9239171a 100644 --- a/dubbo-rpc/dubbo-rpc-hessian/src/main/java/org/apache/dubbo/rpc/protocol/hessian/HessianProtocol.java +++ b/dubbo-rpc/dubbo-rpc-hessian/src/main/java/org/apache/dubbo/rpc/protocol/hessian/HessianProtocol.java @@ -24,9 +24,9 @@ import org.apache.dubbo.remoting.http.HttpServer; import org.apache.dubbo.rpc.RpcContext; import org.apache.dubbo.rpc.RpcException; import org.apache.dubbo.rpc.protocol.AbstractProxyProtocol; - import org.apache.dubbo.rpc.service.GenericService; import org.apache.dubbo.rpc.support.ProtocolUtils; + import com.caucho.hessian.HessianException; import com.caucho.hessian.client.HessianConnectionException; import com.caucho.hessian.client.HessianConnectionFactory; diff --git a/dubbo-rpc/dubbo-rpc-http/src/main/java/org/apache/dubbo/rpc/protocol/http/HttpProtocol.java b/dubbo-rpc/dubbo-rpc-http/src/main/java/org/apache/dubbo/rpc/protocol/http/HttpProtocol.java index 76130d69ea..ba4bb4f243 100644 --- a/dubbo-rpc/dubbo-rpc-http/src/main/java/org/apache/dubbo/rpc/protocol/http/HttpProtocol.java +++ b/dubbo-rpc/dubbo-rpc-http/src/main/java/org/apache/dubbo/rpc/protocol/http/HttpProtocol.java @@ -26,6 +26,7 @@ import org.apache.dubbo.rpc.RpcException; import org.apache.dubbo.rpc.protocol.AbstractProxyProtocol; import org.apache.dubbo.rpc.service.GenericService; import org.apache.dubbo.rpc.support.ProtocolUtils; + import org.aopalliance.intercept.MethodInvocation; import org.springframework.remoting.RemoteAccessException; import org.springframework.remoting.httpinvoker.HttpComponentsHttpInvokerRequestExecutor; diff --git a/dubbo-rpc/dubbo-rpc-http/src/main/java/org/apache/dubbo/rpc/protocol/http/HttpRemoteInvocation.java b/dubbo-rpc/dubbo-rpc-http/src/main/java/org/apache/dubbo/rpc/protocol/http/HttpRemoteInvocation.java index 77179f2456..c2cf48ac5f 100644 --- a/dubbo-rpc/dubbo-rpc-http/src/main/java/org/apache/dubbo/rpc/protocol/http/HttpRemoteInvocation.java +++ b/dubbo-rpc/dubbo-rpc-http/src/main/java/org/apache/dubbo/rpc/protocol/http/HttpRemoteInvocation.java @@ -20,6 +20,7 @@ package org.apache.dubbo.rpc.protocol.http; import org.apache.dubbo.common.Constants; import org.apache.dubbo.common.utils.StringUtils; import org.apache.dubbo.rpc.RpcContext; + import org.aopalliance.intercept.MethodInvocation; import org.springframework.remoting.support.RemoteInvocation; diff --git a/dubbo-rpc/dubbo-rpc-rest/src/main/java/org/apache/dubbo/rpc/protocol/rest/RpcContextFilter.java b/dubbo-rpc/dubbo-rpc-rest/src/main/java/org/apache/dubbo/rpc/protocol/rest/RpcContextFilter.java index ae9e813ddc..b99bf1dc4e 100644 --- a/dubbo-rpc/dubbo-rpc-rest/src/main/java/org/apache/dubbo/rpc/protocol/rest/RpcContextFilter.java +++ b/dubbo-rpc/dubbo-rpc-rest/src/main/java/org/apache/dubbo/rpc/protocol/rest/RpcContextFilter.java @@ -18,6 +18,7 @@ package org.apache.dubbo.rpc.protocol.rest; import org.apache.dubbo.common.utils.StringUtils; import org.apache.dubbo.rpc.RpcContext; + import org.jboss.resteasy.spi.ResteasyProviderFactory; import javax.annotation.Priority; diff --git a/dubbo-rpc/dubbo-rpc-rest/src/main/java/org/apache/dubbo/rpc/protocol/rest/integration/swagger/DubboSwaggerApiListingResource.java b/dubbo-rpc/dubbo-rpc-rest/src/main/java/org/apache/dubbo/rpc/protocol/rest/integration/swagger/DubboSwaggerApiListingResource.java index 6fcc8db620..41b8ff51fd 100644 --- a/dubbo-rpc/dubbo-rpc-rest/src/main/java/org/apache/dubbo/rpc/protocol/rest/integration/swagger/DubboSwaggerApiListingResource.java +++ b/dubbo-rpc/dubbo-rpc-rest/src/main/java/org/apache/dubbo/rpc/protocol/rest/integration/swagger/DubboSwaggerApiListingResource.java @@ -17,16 +17,17 @@ package org.apache.dubbo.rpc.protocol.rest.integration.swagger; import org.apache.dubbo.config.annotation.Service; + import com.fasterxml.jackson.core.JsonProcessingException; import io.swagger.jaxrs.listing.BaseApiListingResource; import javax.servlet.ServletConfig; import javax.servlet.ServletContext; -import javax.ws.rs.core.Response; -import javax.ws.rs.core.HttpHeaders; -import javax.ws.rs.core.UriInfo; -import javax.ws.rs.core.Context; import javax.ws.rs.core.Application; +import javax.ws.rs.core.Context; +import javax.ws.rs.core.HttpHeaders; +import javax.ws.rs.core.Response; +import javax.ws.rs.core.UriInfo; @Service public class DubboSwaggerApiListingResource extends BaseApiListingResource implements DubboSwaggerService { diff --git a/dubbo-rpc/dubbo-rpc-rest/src/main/java/org/apache/dubbo/rpc/protocol/rest/integration/swagger/DubboSwaggerService.java b/dubbo-rpc/dubbo-rpc-rest/src/main/java/org/apache/dubbo/rpc/protocol/rest/integration/swagger/DubboSwaggerService.java index bca1b863e7..3f6d7630ba 100644 --- a/dubbo-rpc/dubbo-rpc-rest/src/main/java/org/apache/dubbo/rpc/protocol/rest/integration/swagger/DubboSwaggerService.java +++ b/dubbo-rpc/dubbo-rpc-rest/src/main/java/org/apache/dubbo/rpc/protocol/rest/integration/swagger/DubboSwaggerService.java @@ -25,9 +25,9 @@ import javax.ws.rs.Path; import javax.ws.rs.Produces; import javax.ws.rs.core.Application; import javax.ws.rs.core.Context; +import javax.ws.rs.core.HttpHeaders; import javax.ws.rs.core.MediaType; import javax.ws.rs.core.Response; -import javax.ws.rs.core.HttpHeaders; import javax.ws.rs.core.UriInfo; diff --git a/dubbo-rpc/dubbo-rpc-rmi/src/main/java/org/apache/dubbo/rpc/protocol/rmi/RmiRemoteInvocation.java b/dubbo-rpc/dubbo-rpc-rmi/src/main/java/org/apache/dubbo/rpc/protocol/rmi/RmiRemoteInvocation.java index f85afccf61..dbbe9d6686 100644 --- a/dubbo-rpc/dubbo-rpc-rmi/src/main/java/org/apache/dubbo/rpc/protocol/rmi/RmiRemoteInvocation.java +++ b/dubbo-rpc/dubbo-rpc-rmi/src/main/java/org/apache/dubbo/rpc/protocol/rmi/RmiRemoteInvocation.java @@ -17,6 +17,7 @@ package org.apache.dubbo.rpc.protocol.rmi; import org.apache.dubbo.rpc.RpcContext; + import org.aopalliance.intercept.MethodInvocation; import org.springframework.remoting.support.RemoteInvocation; diff --git a/dubbo-rpc/dubbo-rpc-thrift/src/main/java/org/apache/dubbo/rpc/protocol/thrift/ThriftCodec.java b/dubbo-rpc/dubbo-rpc-thrift/src/main/java/org/apache/dubbo/rpc/protocol/thrift/ThriftCodec.java index b693847fb1..02c0699af2 100644 --- a/dubbo-rpc/dubbo-rpc-thrift/src/main/java/org/apache/dubbo/rpc/protocol/thrift/ThriftCodec.java +++ b/dubbo-rpc/dubbo-rpc-thrift/src/main/java/org/apache/dubbo/rpc/protocol/thrift/ThriftCodec.java @@ -16,7 +16,6 @@ */ package org.apache.dubbo.rpc.protocol.thrift; - import org.apache.dubbo.common.Constants; import org.apache.dubbo.common.extension.ExtensionLoader; import org.apache.dubbo.common.utils.ClassHelper; diff --git a/dubbo-serialization/dubbo-serialization-fastjson/src/main/java/org/apache/dubbo/common/serialize/fastjson/FastJsonObjectOutput.java b/dubbo-serialization/dubbo-serialization-fastjson/src/main/java/org/apache/dubbo/common/serialize/fastjson/FastJsonObjectOutput.java index 0ec5c010ea..d0e4ed546e 100644 --- a/dubbo-serialization/dubbo-serialization-fastjson/src/main/java/org/apache/dubbo/common/serialize/fastjson/FastJsonObjectOutput.java +++ b/dubbo-serialization/dubbo-serialization-fastjson/src/main/java/org/apache/dubbo/common/serialize/fastjson/FastJsonObjectOutput.java @@ -17,6 +17,7 @@ package org.apache.dubbo.common.serialize.fastjson; import org.apache.dubbo.common.serialize.ObjectOutput; + import com.alibaba.fastjson.serializer.JSONSerializer; import com.alibaba.fastjson.serializer.SerializeWriter; import com.alibaba.fastjson.serializer.SerializerFeature; diff --git a/dubbo-serialization/dubbo-serialization-fst/src/main/java/org/apache/dubbo/common/serialize/fst/FstFactory.java b/dubbo-serialization/dubbo-serialization-fst/src/main/java/org/apache/dubbo/common/serialize/fst/FstFactory.java index 6329d1ecb7..b0830332b5 100644 --- a/dubbo-serialization/dubbo-serialization-fst/src/main/java/org/apache/dubbo/common/serialize/fst/FstFactory.java +++ b/dubbo-serialization/dubbo-serialization-fst/src/main/java/org/apache/dubbo/common/serialize/fst/FstFactory.java @@ -17,6 +17,7 @@ package org.apache.dubbo.common.serialize.fst; import org.apache.dubbo.common.serialize.support.SerializableClassRegistry; + import org.nustaq.serialization.FSTConfiguration; import org.nustaq.serialization.FSTObjectInput; import org.nustaq.serialization.FSTObjectOutput; diff --git a/dubbo-serialization/dubbo-serialization-hessian2/src/main/java/org/apache/dubbo/common/serialize/hessian2/Hessian2ObjectInput.java b/dubbo-serialization/dubbo-serialization-hessian2/src/main/java/org/apache/dubbo/common/serialize/hessian2/Hessian2ObjectInput.java index 4ec97a4c70..348d04d991 100644 --- a/dubbo-serialization/dubbo-serialization-hessian2/src/main/java/org/apache/dubbo/common/serialize/hessian2/Hessian2ObjectInput.java +++ b/dubbo-serialization/dubbo-serialization-hessian2/src/main/java/org/apache/dubbo/common/serialize/hessian2/Hessian2ObjectInput.java @@ -16,9 +16,10 @@ */ package org.apache.dubbo.common.serialize.hessian2; -import com.alibaba.com.caucho.hessian.io.Hessian2Input; import org.apache.dubbo.common.serialize.ObjectInput; +import com.alibaba.com.caucho.hessian.io.Hessian2Input; + import java.io.IOException; import java.io.InputStream; import java.lang.reflect.Type; diff --git a/dubbo-serialization/dubbo-serialization-hessian2/src/main/java/org/apache/dubbo/common/serialize/hessian2/Hessian2ObjectOutput.java b/dubbo-serialization/dubbo-serialization-hessian2/src/main/java/org/apache/dubbo/common/serialize/hessian2/Hessian2ObjectOutput.java index 5d640fdc8d..fec356a668 100644 --- a/dubbo-serialization/dubbo-serialization-hessian2/src/main/java/org/apache/dubbo/common/serialize/hessian2/Hessian2ObjectOutput.java +++ b/dubbo-serialization/dubbo-serialization-hessian2/src/main/java/org/apache/dubbo/common/serialize/hessian2/Hessian2ObjectOutput.java @@ -16,9 +16,10 @@ */ package org.apache.dubbo.common.serialize.hessian2; -import com.alibaba.com.caucho.hessian.io.Hessian2Output; import org.apache.dubbo.common.serialize.ObjectOutput; +import com.alibaba.com.caucho.hessian.io.Hessian2Output; + import java.io.IOException; import java.io.OutputStream; diff --git a/dubbo-serialization/dubbo-serialization-jdk/src/main/java/org/apache/dubbo/common/serialize/java/JavaObjectOutput.java b/dubbo-serialization/dubbo-serialization-jdk/src/main/java/org/apache/dubbo/common/serialize/java/JavaObjectOutput.java index 44308b4828..49a4b45123 100644 --- a/dubbo-serialization/dubbo-serialization-jdk/src/main/java/org/apache/dubbo/common/serialize/java/JavaObjectOutput.java +++ b/dubbo-serialization/dubbo-serialization-jdk/src/main/java/org/apache/dubbo/common/serialize/java/JavaObjectOutput.java @@ -16,7 +16,6 @@ */ package org.apache.dubbo.common.serialize.java; - import org.apache.dubbo.common.serialize.nativejava.NativeJavaObjectOutput; import java.io.IOException; diff --git a/dubbo-serialization/dubbo-serialization-kryo/src/main/java/org/apache/dubbo/common/serialize/kryo/CompatibleKryo.java b/dubbo-serialization/dubbo-serialization-kryo/src/main/java/org/apache/dubbo/common/serialize/kryo/CompatibleKryo.java index ba854e5381..69e4b35b16 100644 --- a/dubbo-serialization/dubbo-serialization-kryo/src/main/java/org/apache/dubbo/common/serialize/kryo/CompatibleKryo.java +++ b/dubbo-serialization/dubbo-serialization-kryo/src/main/java/org/apache/dubbo/common/serialize/kryo/CompatibleKryo.java @@ -16,13 +16,14 @@ */ package org.apache.dubbo.common.serialize.kryo; -import com.esotericsoftware.kryo.Kryo; -import com.esotericsoftware.kryo.Serializer; -import com.esotericsoftware.kryo.serializers.JavaSerializer; import org.apache.dubbo.common.logger.Logger; import org.apache.dubbo.common.logger.LoggerFactory; import org.apache.dubbo.common.serialize.kryo.utils.ReflectionUtils; +import com.esotericsoftware.kryo.Kryo; +import com.esotericsoftware.kryo.Serializer; +import com.esotericsoftware.kryo.serializers.JavaSerializer; + public class CompatibleKryo extends Kryo { private static final Logger logger = LoggerFactory.getLogger(CompatibleKryo.class); diff --git a/dubbo-serialization/dubbo-serialization-kryo/src/main/java/org/apache/dubbo/common/serialize/kryo/utils/AbstractKryoFactory.java b/dubbo-serialization/dubbo-serialization-kryo/src/main/java/org/apache/dubbo/common/serialize/kryo/utils/AbstractKryoFactory.java index 523b59f7b3..541a5e7dd0 100644 --- a/dubbo-serialization/dubbo-serialization-kryo/src/main/java/org/apache/dubbo/common/serialize/kryo/utils/AbstractKryoFactory.java +++ b/dubbo-serialization/dubbo-serialization-kryo/src/main/java/org/apache/dubbo/common/serialize/kryo/utils/AbstractKryoFactory.java @@ -16,6 +16,9 @@ */ package org.apache.dubbo.common.serialize.kryo.utils; +import org.apache.dubbo.common.serialize.kryo.CompatibleKryo; +import org.apache.dubbo.common.serialize.support.SerializableClassRegistry; + import com.esotericsoftware.kryo.Kryo; import com.esotericsoftware.kryo.Serializer; import com.esotericsoftware.kryo.pool.KryoFactory; @@ -29,8 +32,6 @@ import de.javakaffee.kryoserializers.SynchronizedCollectionsSerializer; import de.javakaffee.kryoserializers.URISerializer; import de.javakaffee.kryoserializers.UUIDSerializer; import de.javakaffee.kryoserializers.UnmodifiableCollectionsSerializer; -import org.apache.dubbo.common.serialize.kryo.CompatibleKryo; -import org.apache.dubbo.common.serialize.support.SerializableClassRegistry; import java.lang.reflect.InvocationHandler; import java.math.BigDecimal; diff --git a/dubbo-serialization/dubbo-serialization-protostuff/src/main/java/org/apache/dubbo/common/serialize/protostuff/ProtostuffObjectInput.java b/dubbo-serialization/dubbo-serialization-protostuff/src/main/java/org/apache/dubbo/common/serialize/protostuff/ProtostuffObjectInput.java index f98cbd8914..0202762cfa 100644 --- a/dubbo-serialization/dubbo-serialization-protostuff/src/main/java/org/apache/dubbo/common/serialize/protostuff/ProtostuffObjectInput.java +++ b/dubbo-serialization/dubbo-serialization-protostuff/src/main/java/org/apache/dubbo/common/serialize/protostuff/ProtostuffObjectInput.java @@ -17,11 +17,12 @@ package org.apache.dubbo.common.serialize.protostuff; +import org.apache.dubbo.common.serialize.ObjectInput; +import org.apache.dubbo.common.serialize.protostuff.utils.WrapperUtils; + import io.protostuff.ProtobufIOUtil; import io.protostuff.Schema; import io.protostuff.runtime.RuntimeSchema; -import org.apache.dubbo.common.serialize.ObjectInput; -import org.apache.dubbo.common.serialize.protostuff.utils.WrapperUtils; import java.io.DataInputStream; import java.io.IOException; diff --git a/dubbo-serialization/dubbo-serialization-protostuff/src/main/java/org/apache/dubbo/common/serialize/protostuff/ProtostuffObjectOutput.java b/dubbo-serialization/dubbo-serialization-protostuff/src/main/java/org/apache/dubbo/common/serialize/protostuff/ProtostuffObjectOutput.java index fa34f5e70f..2e91d17ef6 100644 --- a/dubbo-serialization/dubbo-serialization-protostuff/src/main/java/org/apache/dubbo/common/serialize/protostuff/ProtostuffObjectOutput.java +++ b/dubbo-serialization/dubbo-serialization-protostuff/src/main/java/org/apache/dubbo/common/serialize/protostuff/ProtostuffObjectOutput.java @@ -17,12 +17,13 @@ package org.apache.dubbo.common.serialize.protostuff; +import org.apache.dubbo.common.serialize.ObjectOutput; +import org.apache.dubbo.common.serialize.protostuff.utils.WrapperUtils; + import io.protostuff.LinkedBuffer; import io.protostuff.ProtobufIOUtil; import io.protostuff.Schema; import io.protostuff.runtime.RuntimeSchema; -import org.apache.dubbo.common.serialize.ObjectOutput; -import org.apache.dubbo.common.serialize.protostuff.utils.WrapperUtils; import java.io.DataOutputStream; import java.io.IOException; diff --git a/dubbo-serialization/dubbo-serialization-protostuff/src/main/java/org/apache/dubbo/common/serialize/protostuff/utils/WrapperUtils.java b/dubbo-serialization/dubbo-serialization-protostuff/src/main/java/org/apache/dubbo/common/serialize/protostuff/utils/WrapperUtils.java index a44df54fce..9d8be8b4db 100644 --- a/dubbo-serialization/dubbo-serialization-protostuff/src/main/java/org/apache/dubbo/common/serialize/protostuff/utils/WrapperUtils.java +++ b/dubbo-serialization/dubbo-serialization-protostuff/src/main/java/org/apache/dubbo/common/serialize/protostuff/utils/WrapperUtils.java @@ -17,11 +17,12 @@ package org.apache.dubbo.common.serialize.protostuff.utils; -import io.protostuff.runtime.DefaultIdStrategy; -import io.protostuff.runtime.RuntimeEnv; import org.apache.dubbo.common.serialize.protostuff.Wrapper; import org.apache.dubbo.common.serialize.protostuff.delegate.TimeDelegate; +import io.protostuff.runtime.DefaultIdStrategy; +import io.protostuff.runtime.RuntimeEnv; + import java.math.BigDecimal; import java.sql.Time; import java.util.ArrayList; diff --git a/dubbo-test/dubbo-test-compatibility/dubbo-test-spring3/src/main/java/org/apache/dubbo/test/Spring3CompatibilityTest.java b/dubbo-test/dubbo-test-compatibility/dubbo-test-spring3/src/main/java/org/apache/dubbo/test/Spring3CompatibilityTest.java index 35928152aa..752be7fc31 100644 --- a/dubbo-test/dubbo-test-compatibility/dubbo-test-spring3/src/main/java/org/apache/dubbo/test/Spring3CompatibilityTest.java +++ b/dubbo-test/dubbo-test-compatibility/dubbo-test-spring3/src/main/java/org/apache/dubbo/test/Spring3CompatibilityTest.java @@ -19,6 +19,7 @@ package org.apache.dubbo.test; import org.apache.dubbo.demo.DemoService; import org.apache.dubbo.test.consumer.ConsumerConfiguration; import org.apache.dubbo.test.provider.ProviderConfiguration; + import org.springframework.context.ConfigurableApplicationContext; import org.springframework.context.annotation.AnnotationConfigApplicationContext; import org.springframework.util.Assert; diff --git a/dubbo-test/dubbo-test-compatibility/dubbo-test-spring3/src/main/java/org/apache/dubbo/test/consumer/ConsumerConfiguration.java b/dubbo-test/dubbo-test-compatibility/dubbo-test-spring3/src/main/java/org/apache/dubbo/test/consumer/ConsumerConfiguration.java index 074efcc41b..7026ef3340 100644 --- a/dubbo-test/dubbo-test-compatibility/dubbo-test-spring3/src/main/java/org/apache/dubbo/test/consumer/ConsumerConfiguration.java +++ b/dubbo-test/dubbo-test-compatibility/dubbo-test-spring3/src/main/java/org/apache/dubbo/test/consumer/ConsumerConfiguration.java @@ -19,6 +19,7 @@ package org.apache.dubbo.test.consumer; import org.apache.dubbo.config.annotation.Reference; import org.apache.dubbo.config.spring.context.annotation.DubboComponentScan; import org.apache.dubbo.demo.DemoService; + import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.ImportResource; diff --git a/dubbo-test/dubbo-test-compatibility/dubbo-test-spring3/src/main/java/org/apache/dubbo/test/provider/ProviderConfiguration.java b/dubbo-test/dubbo-test-compatibility/dubbo-test-spring3/src/main/java/org/apache/dubbo/test/provider/ProviderConfiguration.java index b0a7629c15..d959e54451 100644 --- a/dubbo-test/dubbo-test-compatibility/dubbo-test-spring3/src/main/java/org/apache/dubbo/test/provider/ProviderConfiguration.java +++ b/dubbo-test/dubbo-test-compatibility/dubbo-test-spring3/src/main/java/org/apache/dubbo/test/provider/ProviderConfiguration.java @@ -17,6 +17,7 @@ package org.apache.dubbo.test.provider; import org.apache.dubbo.config.spring.context.annotation.DubboComponentScan; + import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.ImportResource; From dcbd3269863ce28856e1f441356d4cdc495d0159 Mon Sep 17 00:00:00 2001 From: OrDTesters <44483852+OrDTesters@users.noreply.github.com> Date: Wed, 7 Nov 2018 23:41:10 -0600 Subject: [PATCH 19/23] Changing URL so tests can run in any order (#2760) --- .../apache/dubbo/cache/support/jcache/JCacheFactoryTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dubbo-filter/dubbo-filter-cache/src/test/java/org/apache/dubbo/cache/support/jcache/JCacheFactoryTest.java b/dubbo-filter/dubbo-filter-cache/src/test/java/org/apache/dubbo/cache/support/jcache/JCacheFactoryTest.java index bd701bd60c..6dbd15d6f7 100644 --- a/dubbo-filter/dubbo-filter-cache/src/test/java/org/apache/dubbo/cache/support/jcache/JCacheFactoryTest.java +++ b/dubbo-filter/dubbo-filter-cache/src/test/java/org/apache/dubbo/cache/support/jcache/JCacheFactoryTest.java @@ -38,7 +38,7 @@ public class JCacheFactoryTest extends AbstractCacheFactoryTest { @Test public void testJCacheGetExpired() throws Exception { - URL url = URL.valueOf("test://test:11/test?cache=jacache&.cache.write.expire=1"); + URL url = URL.valueOf("test://test:12/test?cache=jacache&.cache.write.expire=1"); AbstractCacheFactory cacheFactory = getCacheFactory(); Invocation invocation = new RpcInvocation(); Cache cache = cacheFactory.getCache(url, invocation); From 117d48530672440bdb63ab68033f71a9535e1473 Mon Sep 17 00:00:00 2001 From: alphacba Date: Thu, 8 Nov 2018 14:14:50 +0800 Subject: [PATCH 20/23] [Dubbo-2353]fix Invalid property 'interfaceName' of bean class [org.apache.dubbo.config.spring.ServiceBean]#2353 (#2418) * add getter and setter for ServiceConfig's interfaceName property#2353 * add interfaceName to ignoreAttributeNames and change the unit test * delete the demo source code and update the unit test * unchange ServiceConfig * update unit test * update unit test --- .../ServiceAnnotationBeanPostProcessor.java | 2 +- .../dubbo/config/spring/ConfigTest.java | 19 +++++++++++++++++++ .../annotation/provider/HelloServiceImpl.java | 2 +- 3 files changed, 21 insertions(+), 2 deletions(-) diff --git a/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/beans/factory/annotation/ServiceAnnotationBeanPostProcessor.java b/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/beans/factory/annotation/ServiceAnnotationBeanPostProcessor.java index ad4a6c4b88..c08cc13e6a 100644 --- a/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/beans/factory/annotation/ServiceAnnotationBeanPostProcessor.java +++ b/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/beans/factory/annotation/ServiceAnnotationBeanPostProcessor.java @@ -387,7 +387,7 @@ public class ServiceAnnotationBeanPostProcessor implements BeanDefinitionRegistr MutablePropertyValues propertyValues = beanDefinition.getPropertyValues(); - String[] ignoreAttributeNames = of("provider", "monitor", "application", "module", "registry", "protocol", "interface"); + String[] ignoreAttributeNames = of("provider", "monitor", "application", "module", "registry", "protocol", "interface", "interfaceName"); propertyValues.addPropertyValues(new AnnotationPropertyValuesAdapter(service, environment, ignoreAttributeNames)); diff --git a/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/ConfigTest.java b/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/ConfigTest.java index d36fedc583..d68a295296 100644 --- a/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/ConfigTest.java +++ b/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/ConfigTest.java @@ -33,6 +33,7 @@ import org.apache.dubbo.config.spring.action.DemoActionBySetter; import org.apache.dubbo.config.spring.annotation.consumer.AnnotationAction; import org.apache.dubbo.config.spring.api.DemoService; import org.apache.dubbo.config.spring.api.HelloService; +import org.apache.dubbo.config.spring.context.annotation.provider.ProviderConfiguration; import org.apache.dubbo.config.spring.filter.MockFilter; import org.apache.dubbo.config.spring.impl.DemoServiceImpl; import org.apache.dubbo.config.spring.impl.HelloServiceImpl; @@ -50,6 +51,7 @@ import org.junit.Assert; import org.junit.Ignore; import org.junit.Test; import org.springframework.beans.factory.BeanCreationException; +import org.springframework.context.annotation.AnnotationConfigApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; import java.util.Collection; @@ -105,6 +107,23 @@ public class ConfigTest { } } + @Test + public void testServiceAnnotation() { + AnnotationConfigApplicationContext providerContext = new AnnotationConfigApplicationContext(); + providerContext.register(ProviderConfiguration.class); + + providerContext.refresh(); + + ReferenceConfig reference = new ReferenceConfig(); + reference.setApplication(new ApplicationConfig("consumer")); + reference.setRegistry(new RegistryConfig(RegistryConfig.NO_AVAILABLE)); + reference.setInterface(HelloService.class); + reference.setUrl("dubbo://127.0.0.1:12345"); + String hello = reference.get().sayHello("hello"); + assertEquals("Hello, hello", hello); + + } + @Test @SuppressWarnings("unchecked") public void testProviderNestedService() { diff --git a/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/context/annotation/provider/HelloServiceImpl.java b/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/context/annotation/provider/HelloServiceImpl.java index 1c4b405a90..982e52a3f7 100644 --- a/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/context/annotation/provider/HelloServiceImpl.java +++ b/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/context/annotation/provider/HelloServiceImpl.java @@ -24,7 +24,7 @@ import org.apache.dubbo.config.spring.api.HelloService; * * @since 2.5.9 */ -@Service +@Service(interfaceName = "org.apache.dubbo.config.spring.api.HelloService") public class HelloServiceImpl implements HelloService { @Override From 7f5fd469ee44cc2802194cbecde48d7d1fc920e4 Mon Sep 17 00:00:00 2001 From: Ian Luo Date: Fri, 9 Nov 2018 16:31:42 +0800 Subject: [PATCH 21/23] #2762: [Dubbo - qos-http] stopServer should be invoked ? (#2767) --- .../apache/dubbo/qos/protocol/QosProtocolWrapper.java | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/dubbo-plugin/dubbo-qos/src/main/java/org/apache/dubbo/qos/protocol/QosProtocolWrapper.java b/dubbo-plugin/dubbo-qos/src/main/java/org/apache/dubbo/qos/protocol/QosProtocolWrapper.java index 5c83ab0605..6c2fbaed91 100644 --- a/dubbo-plugin/dubbo-qos/src/main/java/org/apache/dubbo/qos/protocol/QosProtocolWrapper.java +++ b/dubbo-plugin/dubbo-qos/src/main/java/org/apache/dubbo/qos/protocol/QosProtocolWrapper.java @@ -75,13 +75,10 @@ public class QosProtocolWrapper implements Protocol { @Override public void destroy() { protocol.destroy(); + stopServer(); } private void startQosServer(URL url) { - if (!hasStarted.compareAndSet(false, true)) { - return; - } - try { boolean qosEnable = url.getParameter(QOS_ENABLE,true); if (!qosEnable) { @@ -91,6 +88,10 @@ public class QosProtocolWrapper implements Protocol { return; } + if (!hasStarted.compareAndSet(false, true)) { + return; + } + int port = url.getParameter(QOS_PORT, QosConstants.DEFAULT_PORT); boolean acceptForeignIp = Boolean.parseBoolean(url.getParameter(ACCEPT_FOREIGN_IP,"false")); Server server = Server.getInstance(); From bff16ebe1fa6d73d64e1f90b5aacc3812eb40d90 Mon Sep 17 00:00:00 2001 From: Ian Luo Date: Tue, 13 Nov 2018 16:05:38 +0800 Subject: [PATCH 22/23] #2777: heartbeat threads blocks process shutdown (#2778) Fix heartbeat threads blocks process shutdown because its hashed-wheel-timer is non-daemon thread. --- .../exchange/support/header/HeaderExchangeClient.java | 4 +++- .../exchange/support/header/HeaderExchangeServer.java | 4 +++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/dubbo-remoting/dubbo-remoting-api/src/main/java/org/apache/dubbo/remoting/exchange/support/header/HeaderExchangeClient.java b/dubbo-remoting/dubbo-remoting-api/src/main/java/org/apache/dubbo/remoting/exchange/support/header/HeaderExchangeClient.java index bfd2ece11c..3abbe5b542 100644 --- a/dubbo-remoting/dubbo-remoting-api/src/main/java/org/apache/dubbo/remoting/exchange/support/header/HeaderExchangeClient.java +++ b/dubbo-remoting/dubbo-remoting-api/src/main/java/org/apache/dubbo/remoting/exchange/support/header/HeaderExchangeClient.java @@ -19,6 +19,7 @@ package org.apache.dubbo.remoting.exchange.support.header; import org.apache.dubbo.common.Constants; import org.apache.dubbo.common.URL; import org.apache.dubbo.common.timer.HashedWheelTimer; +import org.apache.dubbo.common.utils.NamedThreadFactory; import org.apache.dubbo.remoting.ChannelHandler; import org.apache.dubbo.remoting.Client; import org.apache.dubbo.remoting.RemotingException; @@ -61,7 +62,8 @@ public class HeaderExchangeClient implements ExchangeClient { if (needHeartbeat) { long tickDuration = calculateLeastDuration(heartbeat); - heartbeatTimer = new HashedWheelTimer(tickDuration, TimeUnit.MILLISECONDS, Constants.TICKS_PER_WHEEL); + heartbeatTimer = new HashedWheelTimer(new NamedThreadFactory("dubbo-client-heartbeat", true), tickDuration, + TimeUnit.MILLISECONDS, Constants.TICKS_PER_WHEEL); startHeartbeatTimer(); } } diff --git a/dubbo-remoting/dubbo-remoting-api/src/main/java/org/apache/dubbo/remoting/exchange/support/header/HeaderExchangeServer.java b/dubbo-remoting/dubbo-remoting-api/src/main/java/org/apache/dubbo/remoting/exchange/support/header/HeaderExchangeServer.java index bc7e3a72d8..7f3067d60c 100644 --- a/dubbo-remoting/dubbo-remoting-api/src/main/java/org/apache/dubbo/remoting/exchange/support/header/HeaderExchangeServer.java +++ b/dubbo-remoting/dubbo-remoting-api/src/main/java/org/apache/dubbo/remoting/exchange/support/header/HeaderExchangeServer.java @@ -22,6 +22,7 @@ import org.apache.dubbo.common.Version; import org.apache.dubbo.common.logger.Logger; import org.apache.dubbo.common.logger.LoggerFactory; import org.apache.dubbo.common.timer.HashedWheelTimer; +import org.apache.dubbo.common.utils.NamedThreadFactory; import org.apache.dubbo.remoting.Channel; import org.apache.dubbo.remoting.ChannelHandler; import org.apache.dubbo.remoting.RemotingException; @@ -260,7 +261,8 @@ public class HeaderExchangeServer implements ExchangeServer { private void startHeartbeatTimer() { long tickDuration = calculateLeastDuration(heartbeat); - heartbeatTimer = new HashedWheelTimer(tickDuration, TimeUnit.MILLISECONDS, Constants.TICKS_PER_WHEEL); + heartbeatTimer = new HashedWheelTimer(new NamedThreadFactory("dubbo-server-heartbeat", true), tickDuration, + TimeUnit.MILLISECONDS, Constants.TICKS_PER_WHEEL); AbstractTimerTask.ChannelProvider cp = () -> unmodifiableCollection(HeaderExchangeServer.this.getChannels()); From 38a65115a5bff24dd6c8dc78eb7655443be84a69 Mon Sep 17 00:00:00 2001 From: Ian Luo Date: Wed, 14 Nov 2018 17:29:19 +0800 Subject: [PATCH 23/23] oschina vote (#2786) --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index 75ec9704bd..a5d5e1a76d 100644 --- a/README.md +++ b/README.md @@ -13,6 +13,8 @@ Apache Dubbo (incubating) is a high-performance, Java based open source RPC fram We are now collecting dubbo user info in order to help us to improve Dubbo better, pls. kindly help us by providing yours on [issue#1012: Wanted: who's using dubbo](https://github.com/apache/incubator-dubbo/issues/1012), thanks :) +各位 Dubboer,开源中国正在举办 [2018 年度最受欢迎中国开源软件评比活动](https://www.oschina.net/project/top_cn_2018),请投 Dubbo 一票。 + ## Architecture ![Architecture](http://dubbo.apache.org/img/architecture.png)