首先,让我解释一下背景:
我必须创建一个客户端,它将发送许多HTTP请求来下载图像.这些请求必须是异步的,因为只要图像完成,它就会被添加到队列然后打印到屏幕.因为图像可能很大并且响应被分块,我的处理程序必须将它聚合到缓冲区中.
所以我按照Netty示例代码(HTTP勺子示例).
目前,我有三个静态Map来存储每个通道的通道ID和缓冲区/块布尔/我的最终对象.
private static final ConcurrentHashMap<Integer, ChannelBuffer> BUFFER_MAP = new ConcurrentHashMap<Integer, ChannelBuffer>();
private static final ConcurrentHashMap<Integer, ImagePack> PACK_MAP = new ConcurrentHashMap<Integer, ImagePack>();
private static final ConcurrentHashMap<Integer, Boolean> CHUNKS_MAP = new ConcurrentHashMap<Integer, Boolean>();
Run Code Online (Sandbox Code Playgroud)
之后,我创建了我的bootstrap客户端,并计数到countDown挂起的请求数.当响应图像为complet时,最终队列和计数器将传递给我的Handler.
final ClientBootstrap bootstrap = new ClientBootstrap(
new NioClientSocketChannelFactory(
Executors.newCachedThreadPool(),
Executors.newCachedThreadPool()));
bootstrap.setOption("keepAlive", true);
bootstrap.setOption("tcpNoDelay", true);
bootstrap.setOption("reuseAddress", true);
bootstrap.setOption("connectTimeoutMillis", 30000);
final CountDownLatch latch = new CountDownLatch(downloadList.size()) {
@Override
public void countDown() {
super.countDown();
if (getCount() <= 0) {
try {
queue.put(END_OF_QUEUE);
bootstrap.releaseExternalResources();
} catch (InterruptedException …Run Code Online (Sandbox Code Playgroud)