/** * $Id: NettyRPCTest.java 1831 2013-05-16 01:39:51Z shijia.wxr $ */ package com.alibaba.rocketmq.remoting; import static org.junit.Assert.assertTrue; import io.netty.channel.ChannelHandlerContext; import java.util.concurrent.Executors; import org.junit.Test; import com.alibaba.rocketmq.remoting.annotation.CFNullable; import com.alibaba.rocketmq.remoting.exception.RemotingCommandException; import com.alibaba.rocketmq.remoting.exception.RemotingConnectException; import com.alibaba.rocketmq.remoting.exception.RemotingSendRequestException; import com.alibaba.rocketmq.remoting.exception.RemotingTimeoutException; import com.alibaba.rocketmq.remoting.exception.RemotingTooMuchRequestException; import com.alibaba.rocketmq.remoting.netty.NettyClientConfig; import com.alibaba.rocketmq.remoting.netty.NettyRemotingClient; import com.alibaba.rocketmq.remoting.netty.NettyRemotingServer; import com.alibaba.rocketmq.remoting.netty.NettyRequestProcessor; import com.alibaba.rocketmq.remoting.netty.NettyServerConfig; import com.alibaba.rocketmq.remoting.netty.ResponseFuture; import com.alibaba.rocketmq.remoting.protocol.RemotingCommand; /** * @author shijia.wxr<vintage.wang@gmail.com> */ public class NettyRPCTest { public static RemotingClient createRemotingClient() { NettyClientConfig config = new NettyClientConfig(); RemotingClient client = new NettyRemotingClient(config); client.start(); return client; } public static RemotingServer createRemotingServer() throws InterruptedException { NettyServerConfig config = new NettyServerConfig(); RemotingServer remotingServer = new NettyRemotingServer(config); remotingServer.registerProcessor(0, new NettyRequestProcessor() { private int i = 0; @Override public RemotingCommand processRequest(ChannelHandlerContext ctx, RemotingCommand request) { System.out.println("processRequest=" + request + " " + (i++)); request.setRemark("hello, I am respponse " + ctx.channel().remoteAddress()); return request; } }, Executors.newCachedThreadPool()); remotingServer.start(); return remotingServer; } @Test public void test_RPC_Sync() throws InterruptedException, RemotingConnectException, RemotingSendRequestException, RemotingTimeoutException { RemotingServer server = createRemotingServer(); RemotingClient client = createRemotingClient(); for (int i = 0; i < 100; i++) { TestRequestHeader requestHeader = new TestRequestHeader(); requestHeader.setCount(i); requestHeader.setMessageTitle("HelloMessageTitle"); RemotingCommand request = RemotingCommand.createRequestCommand(0, requestHeader); RemotingCommand response = client.invokeSync("127.0.0.1:8888", request, 1000 * 3000); System.out.println("invoke result = " + response); assertTrue(response != null); } client.shutdown(); server.shutdown(); System.out.println("-----------------------------------------------------------------"); } @Test public void test_RPC_Oneway() throws InterruptedException, RemotingConnectException, RemotingTimeoutException, RemotingTooMuchRequestException, RemotingSendRequestException { RemotingServer server = createRemotingServer(); RemotingClient client = createRemotingClient(); for (int i = 0; i < 100; i++) { RemotingCommand request = RemotingCommand.createRequestCommand(0, null); request.setRemark(String.valueOf(i)); client.invokeOneway("127.0.0.1:8888", request, 1000 * 3); } client.shutdown(); server.shutdown(); System.out.println("-----------------------------------------------------------------"); } @Test public void test_RPC_Async() throws InterruptedException, RemotingConnectException, RemotingTimeoutException, RemotingTooMuchRequestException, RemotingSendRequestException { RemotingServer server = createRemotingServer(); RemotingClient client = createRemotingClient(); for (int i = 0; i < 100; i++) { RemotingCommand request = RemotingCommand.createRequestCommand(0, null); request.setRemark(String.valueOf(i)); client.invokeAsync("127.0.0.1:8888", request, 1000 * 3, new InvokeCallback() { @Override public void operationComplete(ResponseFuture responseFuture) { System.out.println(responseFuture.getResponseCommand()); } }); } Thread.sleep(1000 * 3); client.shutdown(); server.shutdown(); System.out.println("-----------------------------------------------------------------"); } @Test public void test_server_call_client() throws InterruptedException, RemotingConnectException, RemotingSendRequestException, RemotingTimeoutException { final RemotingServer server = createRemotingServer(); final RemotingClient client = createRemotingClient(); server.registerProcessor(0, new NettyRequestProcessor() { @Override public RemotingCommand processRequest(ChannelHandlerContext ctx, RemotingCommand request) { try { return server.invokeSync(ctx.channel(), request, 1000 * 10); } catch (InterruptedException e) { e.printStackTrace(); } catch (RemotingSendRequestException e) { e.printStackTrace(); } catch (RemotingTimeoutException e) { e.printStackTrace(); } return null; } }, Executors.newCachedThreadPool()); client.registerProcessor(0, new NettyRequestProcessor() { @Override public RemotingCommand processRequest(ChannelHandlerContext ctx, RemotingCommand request) { System.out.println("client receive server request = " + request); request.setRemark("client remark"); return request; } }, Executors.newCachedThreadPool()); for (int i = 0; i < 3; i++) { RemotingCommand request = RemotingCommand.createRequestCommand(0, null); RemotingCommand response = client.invokeSync("127.0.0.1:8888", request, 1000 * 3); System.out.println("invoke result = " + response); assertTrue(response != null); } client.shutdown(); server.shutdown(); System.out.println("-----------------------------------------------------------------"); } } class TestRequestHeader implements CommandCustomHeader { @CFNullable private Integer count; @CFNullable private String messageTitle; @Override public void checkFields() throws RemotingCommandException { } public Integer getCount() { return count; } public void setCount(Integer count) { this.count = count; } public String getMessageTitle() { return messageTitle; } public void setMessageTitle(String messageTitle) { this.messageTitle = messageTitle; } } class TestResponseHeader implements CommandCustomHeader { @CFNullable private Integer count; @CFNullable private String messageTitle; @Override public void checkFields() throws RemotingCommandException { } public Integer getCount() { return count; } public void setCount(Integer count) { this.count = count; } public String getMessageTitle() { return messageTitle; } public void setMessageTitle(String messageTitle) { this.messageTitle = messageTitle; } }