| /*
|
| * Copyright 1999-2011 Alibaba Group.
|
| *
|
| * Licensed under the Apache License, Version 2.0 (the "License");
|
| * you may not use this file except in compliance with the License.
|
| * You may obtain a copy of the License at
|
| *
|
| * http://www.apache.org/licenses/LICENSE-2.0
|
| *
|
| * Unless required by applicable law or agreed to in writing, software
|
| * distributed under the License is distributed on an "AS IS" BASIS,
|
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
| * See the License for the specific language governing permissions and
|
| * limitations under the License.
|
| */
|
| package com.alibaba.dubbo.remoting.transport.netty; |
| |
| import org.apache.log4j.Level;
|
| import org.junit.Assert;
|
| import org.junit.Test;
|
|
|
| import com.alibaba.dubbo.common.Constants;
|
| import com.alibaba.dubbo.common.utils.DubboAppender;
|
| import com.alibaba.dubbo.common.utils.LogUtil;
|
| import com.alibaba.dubbo.common.utils.NetUtils;
|
| import com.alibaba.dubbo.remoting.Channel;
|
| import com.alibaba.dubbo.remoting.Client;
|
| import com.alibaba.dubbo.remoting.RemotingException;
|
| import com.alibaba.dubbo.remoting.Server;
|
| import com.alibaba.dubbo.remoting.exchange.Exchangers;
|
| import com.alibaba.dubbo.remoting.exchange.support.ExchangeHandlerAdapter;
|
| |
| /** |
| * 客户端重连测试 |
| * @author chao.liuc |
| * |
| */ |
| public class ClientReconnectTest { |
| @Test |
| public void testReconnect() throws RemotingException, InterruptedException{ |
| { |
| int port = NetUtils.getAvailablePort(); |
| Client client = startClient(port, 200); |
| Assert.assertEquals(false, client.isConnected()); |
| Server server = startServer(port); |
| for (int i = 0; i < 100 && ! client.isConnected(); i++) { |
| Thread.sleep(10); |
| } |
| Assert.assertEquals(true, client.isConnected()); |
| client.close(2000); |
| server.close(2000); |
| } |
| { |
| int port = NetUtils.getAvailablePort(); |
| Client client = startClient(port, 20000); |
| Assert.assertEquals(false, client.isConnected()); |
| Server server = startServer(port); |
| for(int i=0;i<5;i++){ |
| Thread.sleep(200); |
| } |
| Assert.assertEquals(false, client.isConnected()); |
| client.close(2000); |
| server.close(2000); |
| } |
| }
|
|
|
| /**
|
| * 重连日志的校验,时间不够shutdown time时,不能有error日志,但必须有一条warn日志
|
| */
|
| @Test
|
| public void testReconnectWarnLog() throws RemotingException, InterruptedException{
|
| int port = NetUtils.getAvailablePort();
|
| DubboAppender.doStart();
|
| String url = "exchange://127.0.0.2:"+port + "/client.reconnect.test?check=false&"
|
| +Constants.RECONNECT_KEY+"="+1 ; //1ms reconnect,保证有足够频率的重连
|
| try{
|
| Exchangers.connect(url);
|
| }catch (Exception e) {
|
| //do nothing
|
| }
|
| Thread.sleep(1500);//重连线程的运行
|
| //时间不够长,不会产生error日志
|
| Assert.assertEquals("no error message ", 0 , LogUtil.findMessage(Level.ERROR, "client reconnect to "));
|
| //第一次重连失败就会有warn日志
|
| Assert.assertEquals("must have one warn message ", 1 , LogUtil.findMessage(Level.WARN, "client reconnect to "));
|
| DubboAppender.doStop();
|
| }
|
|
|
| /**
|
| * 重连日志的校验,不能一直抛出error日志.
|
| */
|
| @Test
|
| public void testReconnectErrorLog() throws RemotingException, InterruptedException{
|
| int port = NetUtils.getAvailablePort();
|
| DubboAppender.doStart();
|
| String url = "exchange://127.0.0.3:"+port + "/client.reconnect.test?check=false&"
|
| +Constants.RECONNECT_KEY+"="+1 + //1ms reconnect,保证有足够频率的重连
|
| "&"+Constants.SHUTDOWN_TIMEOUT_KEY+ "=1";//shutdown时间足够短,确保error日志输出
|
| try{
|
| Exchangers.connect(url);
|
| }catch (Exception e) {
|
| //do nothing
|
| }
|
| Thread.sleep(1500);//重连线程的运行
|
| Assert.assertEquals("only one error message ", 1 , LogUtil.findMessage(Level.ERROR, "client reconnect to "));
|
| DubboAppender.doStop();
|
| }
|
|
|
| /**
|
| * 测试client重连方法不会导致重连线程失效.
|
| */
|
| @Test
|
| public void testClientReconnectMethod() throws RemotingException, InterruptedException{
|
| int port = NetUtils.getAvailablePort();
|
| String url = "exchange://127.0.0.3:"+port + "/client.reconnect.test?check=false&"
|
| +Constants.RECONNECT_KEY+"="+10 //1ms reconnect,保证有足够频率的重连
|
| +"&reconnect.waring.period=1";
|
| DubboAppender.doStart();
|
| Client client = Exchangers.connect(url);
|
| try {
|
| client.reconnect();
|
| } catch (Exception e) {
|
| //do nothing
|
| }
|
| Thread.sleep(1500);//重连线程的运行
|
| Assert.assertTrue("have more then one warn msgs . bug was :" + LogUtil.findMessage(Level.WARN, "client reconnect to "),LogUtil.findMessage(Level.WARN, "client reconnect to ") >1);
|
| DubboAppender.doStop();
|
| }
|
| public static void main(String[] args) {
|
| System.out.println(3%1);
|
| }
|
|
|
| /**
|
| * 重连日志的校验
|
| */
|
| @Test
|
| public void testReconnectWaringLog() throws RemotingException, InterruptedException{
|
| int port = NetUtils.getAvailablePort();
|
| DubboAppender.doStart();
|
| String url = "exchange://127.0.0.4:"+port + "/client.reconnect.test?check=false&"
|
| +Constants.RECONNECT_KEY+"="+1 //1ms reconnect,保证有足够频率的重连
|
| +"&"+Constants.SHUTDOWN_TIMEOUT_KEY+ "=1"//shutdown时间足够短,确保error日志输出
|
| +"&reconnect.waring.period=100";//每隔多少warning记录一次
|
| try{
|
| Exchangers.connect(url);
|
| }catch (Exception e) {
|
| //do nothing
|
| }
|
| int count = 0;
|
| for (int i=0;i<100;i++){
|
| count = LogUtil.findMessage(Level.WARN, "client reconnect to ") ;
|
| if (count >=1){
|
| break;
|
| }
|
| Thread.sleep(50);//重连线程的运行
|
| }
|
| Assert.assertTrue("warning message count must >= 1, real :"+count, count>= 1);
|
| DubboAppender.doStop();
|
| } |
| |
| public Client startClient(int port , int reconnectPeriod) throws RemotingException{ |
| final String url = "exchange://127.0.0.1:"+port + "/client.reconnect.test?check=false&"+Constants.RECONNECT_KEY+"="+reconnectPeriod; |
| return Exchangers.connect(url); |
| } |
| |
| public Server startServer(int port) throws RemotingException{ |
| final String url = "exchange://127.0.0.1:"+port +"/client.reconnect.test"; |
| return Exchangers.bind(url, new HandlerAdapter()); |
| } |
| |
| static class HandlerAdapter extends ExchangeHandlerAdapter{ |
| public void connected(Channel channel) throws RemotingException { |
| } |
| public void disconnected(Channel channel) throws RemotingException { |
| } |
| public void caught(Channel channel, Throwable exception) throws RemotingException { |
| } |
| }
|
| } |