use of com.weibo.api.motan.transport.MessageHandler in project motan by weibocom.
the class NettyEndpointFactoryTest method testShareChannel.
private void testShareChannel(boolean isServer) {
NettyEndpointFactory factory = new NettyEndpointFactory();
MessageHandler handler = new ProviderMessageRouter();
URL url1 = new URL("motan", "localhost", 18080, "com.weibo.api.motan.procotol.example.IHello");
url1.addParameter(URLParamType.shareChannel.getName(), "true");
Endpoint endpoint1 = createEndpoint(url1, handler, isServer, factory);
Assert.assertEquals(endpoint1.getUrl().getServerPortStr(), url1.getServerPortStr());
URL url2 = new URL("motan", "localhost", 18081, "com.weibo.api.motan.protocol.example.IHello1");
url2.addParameter(URLParamType.shareChannel.getName(), "true");
Endpoint endpoint2 = createEndpoint(url2, handler, isServer, factory);
Assert.assertEquals(endpoint2.getUrl().getServerPortStr(), url2.getServerPortStr());
URL url3 = new URL("motan", "localhost", 18081, "com.weibo.api.motan.protocol.example.IHello2");
url3.addParameter(URLParamType.shareChannel.getName(), "true");
Endpoint endpoint3 = createEndpoint(url3, handler, isServer, factory);
if (isServer) {
Assert.assertTrue(endpoint2 == endpoint3);
} else {
Assert.assertTrue(endpoint2 != endpoint3);
}
URL url4 = new URL("injvm", "localhost", 18081, "com.weibo.api.motan.protocol.example.IHello3");
url4.addParameter(URLParamType.shareChannel.getName(), "true");
Endpoint endpoint4 = null;
if (isServer) {
try {
endpoint4 = createEndpoint(url4, handler, isServer, factory);
Assert.assertTrue(false);
} catch (Exception e) {
Assert.assertTrue(true);
}
} else {
try {
endpoint4 = createEndpoint(url4, handler, isServer, factory);
Assert.assertTrue(true);
} catch (Exception e) {
Assert.assertTrue(false);
}
}
if (isServer) {
Assert.assertEquals(factory.getShallServerChannels().size(), 2);
}
if (isServer) {
factory.safeReleaseResource((Server) endpoint1, url1);
factory.safeReleaseResource((Server) endpoint2, url2);
factory.safeReleaseResource((Server) endpoint3, url3);
Assert.assertEquals(factory.getShallServerChannels().size(), 0);
} else {
Assert.assertEquals(((HeartbeatClientEndpointManager) factory.getEndpointManager()).getClients().size(), 4);
factory.safeReleaseResource((Client) endpoint1, url1);
Assert.assertEquals(((HeartbeatClientEndpointManager) factory.getEndpointManager()).getClients().size(), 3);
factory.safeReleaseResource((Client) endpoint2, url2);
Assert.assertEquals(((HeartbeatClientEndpointManager) factory.getEndpointManager()).getClients().size(), 2);
factory.safeReleaseResource((Client) endpoint3, url3);
Assert.assertEquals(((HeartbeatClientEndpointManager) factory.getEndpointManager()).getClients().size(), 1);
factory.safeReleaseResource((Client) endpoint4, url4);
Assert.assertEquals(((HeartbeatClientEndpointManager) factory.getEndpointManager()).getClients().size(), 0);
}
}
use of com.weibo.api.motan.transport.MessageHandler in project motan by weibocom.
the class UnSerializableClass method testNettyEncodeException.
@Test
public void testNettyEncodeException() throws Exception {
NettyServer nettyServer;
nettyServer = new NettyServer(url, new MessageHandler() {
@Override
public Object handle(Channel channel, Object message) {
Request request = (Request) message;
DefaultResponse response = new DefaultResponse();
response.setRequestId(request.getRequestId());
// 序列化错误
response.setValue(new UnSerializableClass());
return response;
}
});
nettyServer.open();
NettyClient nettyClient = new NettyClient(url);
nettyClient.open();
DefaultRequest request = new DefaultRequest();
request.setRequestId(RequestIdGenerator.getRequestId());
request.setInterfaceName(url.getPath());
request.setMethodName("helloSerializable");
request.setParamtersDesc("com.weibo.api.motan.procotol.example.UnSerializableClass");
request.setArguments(new Object[] { new UnSerializableClass() });
try {
nettyClient.request(request);
Assert.assertFalse(true);
} catch (Exception e) {
Assert.assertTrue(true);
}
DefaultRequest request1 = new DefaultRequest();
request1.setRequestId(RequestIdGenerator.getRequestId());
request1.setInterfaceName(url.getPath());
request1.setMethodName("helloSerializable");
request1.setParamtersDesc("void");
try {
nettyClient.request(request1);
Assert.fail();
} catch (Exception e) {
Assert.assertTrue(e.getMessage().contains("error_code: 20002"));
} finally {
nettyClient.close();
nettyServer.close();
}
}
use of com.weibo.api.motan.transport.MessageHandler in project motan by weibocom.
the class UnSerializableClass method testNettyDecodeException.
@Test
public void testNettyDecodeException() throws Exception {
NettyServer nettyServer;
nettyServer = new NettyServer(url, new MessageHandler() {
@Override
public Object handle(Channel channel, Object message) {
Request request = (Request) message;
DefaultResponse response = new DefaultResponse();
response.setRequestId(request.getRequestId());
response.setValue("error");
return response;
}
});
nettyServer.open();
NettyClient nettyClient = new NettyClient(url);
nettyClient.open();
DefaultRequest request = new DefaultRequest();
request.setRequestId(RequestIdGenerator.getRequestId());
request.setInterfaceName(url.getPath());
request.setMethodName("hello");
request.setParamtersDesc("void");
try {
nettyClient.request(request);
Assert.assertTrue(false);
} catch (Exception e) {
Assert.assertTrue(e.getMessage().contains("response dataType not support"));
} finally {
nettyClient.close();
nettyServer.close();
}
}
use of com.weibo.api.motan.transport.MessageHandler in project motan by weibocom.
the class NettyClient method initClientBootstrap.
/**
* 初始化 netty clientBootstrap
*/
private void initClientBootstrap() {
bootstrap = new ClientBootstrap(channelFactory);
bootstrap.setOption("keepAlive", true);
bootstrap.setOption("tcpNoDelay", true);
// 实际上,极端情况下,connectTimeout会达到500ms,因为netty nio的实现中,是依赖BossThread来控制超时,
// 如果为了严格意义的timeout,那么需要应用端进行控制。
int timeout = getUrl().getIntParameter(URLParamType.connectTimeout.getName(), URLParamType.connectTimeout.getIntValue());
if (timeout <= 0) {
throw new MotanFrameworkException("NettyClient init Error: timeout(" + timeout + ") <= 0 is forbid.", MotanErrorMsgConstant.FRAMEWORK_INIT_ERROR);
}
bootstrap.setOption("connectTimeoutMillis", timeout);
// 最大响应包限制
final int maxContentLength = url.getIntParameter(URLParamType.maxContentLength.getName(), URLParamType.maxContentLength.getIntValue());
bootstrap.setPipelineFactory(new ChannelPipelineFactory() {
public ChannelPipeline getPipeline() {
ChannelPipeline pipeline = Channels.pipeline();
pipeline.addLast("decoder", new NettyDecoder(codec, NettyClient.this, maxContentLength));
pipeline.addLast("encoder", new NettyEncoder(codec, NettyClient.this));
pipeline.addLast("handler", new NettyChannelHandler(NettyClient.this, new MessageHandler() {
@Override
public Object handle(Channel channel, Object message) {
Response response = (Response) message;
NettyResponseFuture responseFuture = NettyClient.this.removeCallback(response.getRequestId());
if (responseFuture == null) {
LoggerUtil.warn("NettyClient has response from server, but resonseFuture not exist, requestId={}", response.getRequestId());
return null;
}
if (response.getException() != null) {
responseFuture.onFailure(response);
} else {
responseFuture.onSuccess(response);
}
return null;
}
}));
return pipeline;
}
});
}
Aggregations