DUBBO-424 Heartbeat response不应该在业务线程处理
This commit is contained in:
parent
a5843b835b
commit
215e1405b7
|
|
@ -0,0 +1,8 @@
|
|||
package com.alibaba.dubbo.remoting.exchange.support.header;
|
||||
|
||||
/**
|
||||
* @author <a href="mailto:gang.lvg@alibaba-inc.com">kimi</a>
|
||||
*/
|
||||
public class HeartbeatHandler {
|
||||
|
||||
}
|
||||
|
|
@ -0,0 +1,120 @@
|
|||
/*
|
||||
* 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.exchange.support.header;
|
||||
|
||||
import org.junit.After;
|
||||
import org.junit.Test;
|
||||
|
||||
import com.alibaba.dubbo.common.Constants;
|
||||
import com.alibaba.dubbo.common.URL;
|
||||
import com.alibaba.dubbo.remoting.Channel;
|
||||
import com.alibaba.dubbo.remoting.RemotingException;
|
||||
import com.alibaba.dubbo.remoting.exchange.ExchangeChannel;
|
||||
import com.alibaba.dubbo.remoting.exchange.ExchangeClient;
|
||||
import com.alibaba.dubbo.remoting.exchange.ExchangeHandler;
|
||||
import com.alibaba.dubbo.remoting.exchange.ExchangeServer;
|
||||
import com.alibaba.dubbo.remoting.exchange.Exchangers;
|
||||
import com.alibaba.dubbo.remoting.transport.dispather.FakeChannelHandlers;
|
||||
|
||||
import junit.framework.Assert;
|
||||
|
||||
/**
|
||||
* @author <a href="mailto:gang.lvg@alibaba-inc.com">kimi</a>
|
||||
*/
|
||||
public class HeartbeatHandlerTest {
|
||||
|
||||
private ExchangeServer server;
|
||||
private ExchangeClient client;
|
||||
|
||||
@After
|
||||
public void after() throws Exception {
|
||||
if (client != null) {
|
||||
client.close();
|
||||
}
|
||||
|
||||
if (server != null) {
|
||||
server.close();
|
||||
}
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testServerHeartbeat() throws Exception {
|
||||
URL serverURL = URL.valueOf("header://localhost:55555");
|
||||
serverURL = serverURL.addParameter(Constants.HEARTBEAT_KEY, 1000);
|
||||
TestHeartbeatHandler handler = new TestHeartbeatHandler();
|
||||
server = Exchangers.bind(serverURL, handler);
|
||||
System.out.println("Server bind successfully");
|
||||
|
||||
FakeChannelHandlers.setTestingChannelHandlers();
|
||||
serverURL = serverURL.removeParameter(Constants.HEARTBEAT_KEY);
|
||||
client = Exchangers.connect(serverURL);
|
||||
Thread.sleep(10000);
|
||||
Assert.assertTrue(handler.disconnectCount > 0);
|
||||
System.out.println("disconnect count " + handler.disconnectCount);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testClientHeartbeat() throws Exception {
|
||||
FakeChannelHandlers.setTestingChannelHandlers();
|
||||
URL serverURL = URL.valueOf("header://localhost:55555");
|
||||
TestHeartbeatHandler handler = new TestHeartbeatHandler();
|
||||
server = Exchangers.bind(serverURL, handler);
|
||||
System.out.println("Server bind successfully");
|
||||
|
||||
FakeChannelHandlers.resetChannelHandlers();
|
||||
serverURL = serverURL.addParameter(Constants.HEARTBEAT_KEY, 1000);
|
||||
client = Exchangers.connect(serverURL);
|
||||
Thread.sleep(10000);
|
||||
Assert.assertTrue(handler.connectCount > 0);
|
||||
System.out.println("connect count " + handler.connectCount);
|
||||
}
|
||||
|
||||
class TestHeartbeatHandler implements ExchangeHandler {
|
||||
|
||||
public int disconnectCount = 0;
|
||||
public int connectCount = 0;
|
||||
|
||||
public Object reply(ExchangeChannel channel, Object request) throws RemotingException {
|
||||
return request;
|
||||
}
|
||||
|
||||
public void connected(Channel channel) throws RemotingException {
|
||||
++connectCount;
|
||||
}
|
||||
|
||||
public void disconnected(Channel channel) throws RemotingException {
|
||||
++disconnectCount;
|
||||
}
|
||||
|
||||
public void sent(Channel channel, Object message) throws RemotingException {
|
||||
|
||||
}
|
||||
|
||||
public void received(Channel channel, Object message) throws RemotingException {
|
||||
HeartbeatHandler.log.error(this.getClass().getSimpleName() + message.toString());
|
||||
}
|
||||
|
||||
public void caught(Channel channel, Throwable exception) throws RemotingException {
|
||||
exception.printStackTrace();
|
||||
}
|
||||
|
||||
public String telnet(Channel channel, String message) throws RemotingException {
|
||||
return message;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -0,0 +1,46 @@
|
|||
/*
|
||||
* 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.dispather;
|
||||
|
||||
import com.alibaba.dubbo.common.URL;
|
||||
import com.alibaba.dubbo.common.extension.ExtensionLoader;
|
||||
import com.alibaba.dubbo.remoting.ChannelHandler;
|
||||
import com.alibaba.dubbo.remoting.Dispather;
|
||||
|
||||
/**
|
||||
* @author <a href="mailto:gang.lvg@alibaba-inc.com">kimi</a>
|
||||
*/
|
||||
public class FakeChannelHandlers extends ChannelHandlers {
|
||||
|
||||
public FakeChannelHandlers() {
|
||||
super();
|
||||
}
|
||||
|
||||
@Override
|
||||
protected ChannelHandler wrapInternal(ChannelHandler handler, URL url) {
|
||||
return ExtensionLoader.getExtensionLoader(Dispather.class)
|
||||
.getAdaptiveExtension().dispath(handler, url);
|
||||
}
|
||||
|
||||
public static void setTestingChannelHandlers() {
|
||||
ChannelHandlers.setTestingChannelHandlers(new FakeChannelHandlers());
|
||||
}
|
||||
|
||||
public static void resetChannelHandlers() {
|
||||
ChannelHandlers.setTestingChannelHandlers(new ChannelHandlers());
|
||||
}
|
||||
}
|
||||
Loading…
Reference in New Issue