use of org.apache.dubbo.remoting.exchange.ExchangeChannel in project dubbo by alibaba.
the class DubboTelnetDecodeTest method testDubboDecode.
/**
* just dubbo request
*
* @throws InterruptedException
*/
@Test
public void testDubboDecode() throws InterruptedException, IOException {
ByteBuf dubboByteBuf = createDubboByteBuf();
EmbeddedChannel ch = null;
try {
Codec2 codec = ExtensionLoader.getExtensionLoader(Codec2.class).getExtension("dubbo");
URL url = new URL("dubbo", "localhost", 22226);
NettyCodecAdapter adapter = new NettyCodecAdapter(codec, url, new MockChannelHandler());
MockHandler mockHandler = new MockHandler(null, new MultiMessageHandler(new DecodeHandler(new HeaderExchangeHandler(new ExchangeHandlerAdapter() {
@Override
public CompletableFuture<Object> reply(ExchangeChannel channel, Object msg) {
if (checkDubboDecoded(msg)) {
dubbo.incrementAndGet();
}
return getDefaultFuture();
}
}))));
ch = new LocalEmbeddedChannel();
ch.pipeline().addLast("decoder", adapter.getDecoder()).addLast("handler", mockHandler);
ch.writeInbound(dubboByteBuf);
} catch (Exception e) {
e.printStackTrace();
} finally {
if (ch != null) {
ch.close().await(200, TimeUnit.MILLISECONDS);
}
}
TimeUnit.MILLISECONDS.sleep(100);
Assertions.assertEquals(1, dubbo.get());
}
use of org.apache.dubbo.remoting.exchange.ExchangeChannel in project dubbo by alibaba.
the class DubboTelnetDecodeTest method testDubboTelnetDecoded.
/**
* dubbo and telnet request
*
* <p>
* First ByteBuf:
* ++-------------------------------------------------+
* || dubbo(incomplete) |
* ++-------------------------------------------------+
* ||
* Magic Code
*
* <p>
* Second ByteBuf:
* +--------------------------------------------------+
* | dubbo(the remaining) | telnet(complete) |
* +--------------------------------------------------+
*
* @throws InterruptedException
*/
@Test
public void testDubboTelnetDecoded() throws InterruptedException, IOException {
ByteBuf dubboByteBuf = createDubboByteBuf();
ByteBuf firstDubboByteBuf = dubboByteBuf.copy(0, 50);
ByteBuf secondLeftDubboByteBuf = dubboByteBuf.copy(50, dubboByteBuf.readableBytes());
ByteBuf telnetByteBuf = Unpooled.wrappedBuffer("\r\n".getBytes());
ByteBuf secondByteBuf = Unpooled.wrappedBuffer(secondLeftDubboByteBuf, telnetByteBuf);
EmbeddedChannel ch = null;
try {
Codec2 codec = ExtensionLoader.getExtensionLoader(Codec2.class).getExtension("dubbo");
URL url = new URL("dubbo", "localhost", 22226);
NettyCodecAdapter adapter = new NettyCodecAdapter(codec, url, new MockChannelHandler());
MockHandler mockHandler = new MockHandler((msg) -> {
if (checkTelnetDecoded(msg)) {
dubboTelnet.incrementAndGet();
}
}, new MultiMessageHandler(new DecodeHandler(new HeaderExchangeHandler(new ExchangeHandlerAdapter() {
@Override
public CompletableFuture<Object> reply(ExchangeChannel channel, Object msg) {
if (checkDubboDecoded(msg)) {
dubboTelnet.incrementAndGet();
}
return getDefaultFuture();
}
}))));
ch = new LocalEmbeddedChannel();
ch.pipeline().addLast("decoder", adapter.getDecoder()).addLast("handler", mockHandler);
ch.writeInbound(firstDubboByteBuf);
ch.writeInbound(secondByteBuf);
} catch (Exception e) {
e.printStackTrace();
} finally {
if (ch != null) {
ch.close().await(200, TimeUnit.MILLISECONDS);
}
}
TimeUnit.MILLISECONDS.sleep(100);
Assertions.assertEquals(2, dubboTelnet.get());
}
use of org.apache.dubbo.remoting.exchange.ExchangeChannel in project dubbo by alibaba.
the class HeaderExchangeHandler method received.
@Override
public void received(Channel channel, Object message) throws RemotingException {
final ExchangeChannel exchangeChannel = HeaderExchangeChannel.getOrAddChannel(channel);
if (message instanceof Request) {
// handle request.
Request request = (Request) message;
if (request.isEvent()) {
handlerEvent(channel, request);
} else {
if (request.isTwoWay()) {
handleRequest(exchangeChannel, request);
} else {
handler.received(exchangeChannel, request.getData());
}
}
} else if (message instanceof Response) {
handleResponse(channel, (Response) message);
} else if (message instanceof String) {
if (isClientSide(channel)) {
Exception e = new Exception("Dubbo client can not supported string message: " + message + " in channel: " + channel + ", url: " + channel.getUrl());
logger.error(e.getMessage(), e);
} else {
String echo = handler.telnet(channel, (String) message);
if (echo != null && echo.length() > 0) {
channel.send(echo);
}
}
} else {
handler.received(exchangeChannel, message);
}
}
use of org.apache.dubbo.remoting.exchange.ExchangeChannel in project dubbo by alibaba.
the class HeaderExchangeHandler method caught.
@Override
public void caught(Channel channel, Throwable exception) throws RemotingException {
if (exception instanceof ExecutionException) {
ExecutionException e = (ExecutionException) exception;
Object msg = e.getRequest();
if (msg instanceof Request) {
Request req = (Request) msg;
if (req.isTwoWay() && !req.isHeartbeat()) {
Response res = new Response(req.getId(), req.getVersion());
res.setStatus(Response.SERVER_ERROR);
res.setErrorMessage(StringUtils.toString(e));
channel.send(res);
return;
}
}
}
ExchangeChannel exchangeChannel = HeaderExchangeChannel.getOrAddChannel(channel);
try {
handler.caught(exchangeChannel, exception);
} finally {
HeaderExchangeChannel.removeChannelIfDisconnected(channel);
}
}
use of org.apache.dubbo.remoting.exchange.ExchangeChannel in project dubbo by alibaba.
the class MulticastExchangeNetworkerTest method testJoin.
@Test
public void testJoin() throws RemotingException, InterruptedException {
final String groupURL = "multicast://224.5.6.7:1234";
MulticastExchangeNetworker multicastExchangeNetworker = new MulticastExchangeNetworker();
final CountDownLatch countDownLatch = new CountDownLatch(1);
Peer peer1 = multicastExchangeNetworker.lookup(URL.valueOf(groupURL)).join(URL.valueOf("exchange://0.0.0.0:" + NetUtils.getAvailablePort() + "?exchanger=header"), new ExchangeHandlerAdapter() {
@Override
public CompletableFuture<Object> reply(ExchangeChannel channel, Object msg) throws RemotingException {
countDownLatch.countDown();
return super.reply(channel, msg);
}
});
Peer peer2 = multicastExchangeNetworker.lookup(URL.valueOf(groupURL)).join(URL.valueOf("exchange://0.0.0.0:" + NetUtils.getAvailablePort() + "?exchanger=header"), mock(ExchangeHandler.class));
while (true) {
for (Channel channel : peer1.getChannels()) {
channel.send("hello multicast exchange network!");
}
TimeUnit.MILLISECONDS.sleep(50);
long count = countDownLatch.getCount();
if (count > 0) {
break;
}
}
Group lookup = Networkers.lookup(groupURL);
assertThat(lookup, not(nullValue()));
assertThat(peer1, instanceOf(ExchangeServerPeer.class));
peer1.close();
peer2.close();
}
Aggregations