dreamhead / moco

Easy Setup Stub Server
MIT License
4.36k stars 1.08k forks source link

There is exception server side when requesting with apache httpclient. #283

Open waitshang opened 4 years ago

waitshang commented 4 years ago

It doesn't happen using netty to request.

java.io.IOException: 远程主机强迫关闭了一个现有的连接。
    at sun.nio.ch.SocketDispatcher.read0(Native Method)
    at sun.nio.ch.SocketDispatcher.read(SocketDispatcher.java:43)
    at sun.nio.ch.IOUtil.readIntoNativeBuffer(IOUtil.java:223)
    at sun.nio.ch.IOUtil.read(IOUtil.java:192)
    at sun.nio.ch.SocketChannelImpl.read(SocketChannelImpl.java:380)
    at io.netty.buffer.PooledByteBuf.setBytes(PooledByteBuf.java:253)
    at io.netty.buffer.AbstractByteBuf.writeBytes(AbstractByteBuf.java:1133)
    at io.netty.channel.socket.nio.NioSocketChannel.doReadBytes(NioSocketChannel.java:350)
    at io.netty.channel.nio.AbstractNioByteChannel$NioByteUnsafe.read(AbstractNioByteChannel.java:148)
    at io.netty.channel.nio.NioEventLoop.processSelectedKey(NioEventLoop.java:714)
    at io.netty.channel.nio.NioEventLoop.processSelectedKeysOptimized(NioEventLoop.java:650)
    at io.netty.channel.nio.NioEventLoop.processSelectedKeys(NioEventLoop.java:576)
    at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:493)
    at io.netty.util.concurrent.SingleThreadEventExecutor$4.run(SingleThreadEventExecutor.java:989)
    at io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
    at java.lang.Thread.run(Thread.java:748)
dreamhead commented 4 years ago

@waitshang Could you please provide the whole test scenario?

waitshang commented 4 years ago

@waitshang Could you please provide the whole test scenario?

import static com.github.dreamhead.moco.Moco.by; import static com.github.dreamhead.moco.Moco.log; import static com.github.dreamhead.moco.Moco.template; import static com.github.dreamhead.moco.Moco.uri;

/**

import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader;

/**

dreamhead commented 4 years ago

It seems you close your client before you read.

client.close();
final HttpEntity entity = response.getEntity();
final InputStreamReader inputStreamReader = new InputStreamReader(entity.getContent());
final BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
bufferedReader.lines().forEach(System.out::println);
bufferedReader.close();

simply you can fix it to put close at the end of this code.

final HttpEntity entity = response.getEntity();
final InputStreamReader inputStreamReader = new InputStreamReader(entity.getContent());
final BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
bufferedReader.lines().forEach(System.out::println);
bufferedReader.close();
client.close();
waitshang commented 4 years ago

It seems you close your client before you read.

client.close();
final HttpEntity entity = response.getEntity();
final InputStreamReader inputStreamReader = new InputStreamReader(entity.getContent());
final BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
bufferedReader.lines().forEach(System.out::println);
bufferedReader.close();

simply you can fix it to put close at the end of this code.

final HttpEntity entity = response.getEntity();
final InputStreamReader inputStreamReader = new InputStreamReader(entity.getContent());
final BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
bufferedReader.lines().forEach(System.out::println);
bufferedReader.close();
client.close();

I see. But the problem happens when using complete.

import com.github.dreamhead.moco.HttpServer;
import com.github.dreamhead.moco.Moco;
import com.github.dreamhead.moco.Runner;

import java.util.concurrent.TimeUnit;

import static com.github.dreamhead.moco.Moco.async;
import static com.github.dreamhead.moco.Moco.by;
import static com.github.dreamhead.moco.Moco.complete;
import static com.github.dreamhead.moco.Moco.latency;
import static com.github.dreamhead.moco.Moco.post;
import static com.github.dreamhead.moco.Moco.template;
import static com.github.dreamhead.moco.Moco.uri;

/**
 * Created by shangwei2009@hotmail.com on 2020/5/25 18:31
 */
public class Second {
    public static void main(String[] args) {
        final HttpServer httpServer = Moco.httpServer(12307);
        httpServer.request(by(uri("/notify"))).response(template("${req.method}")).on(
                complete(
                        async(
                                post("http://localhost:12306/get", "hello"), latency(10, TimeUnit.SECONDS)
                        )
                )
        );

        final Runner runner = Runner.runner(httpServer);
        runner.start();
    }
}

Here I setup a Second server which port is 12307. When I request http://localhost:12307/notify, the Second server request Server after 10 seconds. But the Server throws exception when handling the request from Second server.