/* * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. * */ package testcase; import org.apache.mina.core.buffer.IoBuffer; import org.apache.mina.core.future.ConnectFuture; import org.apache.mina.core.future.IoFutureListener; import org.apache.mina.core.service.IoHandlerAdapter; import org.apache.mina.core.session.IoSession; import org.apache.mina.filter.codec.ProtocolCodecFilter; import org.apache.mina.filter.executor.ExecutorFilter; import org.apache.mina.filter.executor.OrderedThreadPoolExecutor; import org.apache.mina.transport.socket.SocketAcceptor; import org.apache.mina.transport.socket.SocketConnector; import org.apache.mina.transport.socket.nio.NioSocketAcceptor; import org.apache.mina.transport.socket.nio.NioSocketConnector; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.io.IOException; import java.net.InetSocketAddress; import java.util.concurrent.ThreadFactory; import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicInteger; /** * TODO : Add documentation * @author <a href="http://mina.apache.org">Apache MINA Project</a> * */ public class MinaRegressionTest extends IoHandlerAdapter { private static final Logger logger = LoggerFactory.getLogger(MinaRegressionTest.class); public static final int MSG_SIZE = 5000; public static final int MSG_COUNT = 10; private static final int PORT = 23234; private static final int BUFFER_SIZE = 8192; private static final int TIMEOUT = 10000; public static final String OPEN = "open"; public SocketAcceptor acceptor; public SocketConnector connector; private final Object LOCK = new Object(); private static final ThreadFactory THREAD_FACTORY = new ThreadFactory() { public Thread newThread(final Runnable r) { return new Thread(null, r, "MinaThread", 64 * 1024); } }; private OrderedThreadPoolExecutor executor; public static AtomicInteger sent = new AtomicInteger(0); public MinaRegressionTest() throws IOException { executor = new OrderedThreadPoolExecutor( 0, 1000, 60, TimeUnit.SECONDS, THREAD_FACTORY); acceptor = new NioSocketAcceptor(Runtime.getRuntime().availableProcessors() + 1); acceptor.setReuseAddress( true ); acceptor.getSessionConfig().setReceiveBufferSize(BUFFER_SIZE); acceptor.getFilterChain().addLast("threadPool", new ExecutorFilter(executor)); acceptor.getFilterChain().addLast("codec", new ProtocolCodecFilter(new MyProtocolCodecFactory())); connector = new NioSocketConnector(Runtime.getRuntime().availableProcessors() + 1); connector.setConnectTimeoutMillis(TIMEOUT); connector.getSessionConfig().setSendBufferSize(BUFFER_SIZE); connector.getSessionConfig().setReuseAddress( true ); } public void connect() throws Exception { final InetSocketAddress socketAddress = new InetSocketAddress("0.0.0.0", PORT); acceptor.setHandler(new MyIoHandler(LOCK)); acceptor.bind(socketAddress); connector.setHandler(this); final IoFutureListener<ConnectFuture> listener = new IoFutureListener<ConnectFuture>() { public void operationComplete(ConnectFuture future) { try {logger.info( "Write message to session " + future.getSession().getId() ); final IoSession s = future.getSession(); IoBuffer wb = IoBuffer.allocate(MSG_SIZE); wb.put(new byte[MSG_SIZE]); wb.flip(); s.write(wb); } catch (Exception e) { logger.error("Can't send message: {}", e.getMessage()); } } }; for (int i = 0; i < MSG_COUNT; i++) { ConnectFuture future = connector.connect(socketAddress); future.addListener(listener); } synchronized (LOCK) { LOCK.wait(50000); } connector.dispose(); acceptor.unbind(); acceptor.dispose(); executor.shutdownNow(); logger.info("Received: " + MyIoHandler.received.intValue()); logger.info("Sent: " + sent.intValue()); logger.info("FINISH"); } @Override public void exceptionCaught(IoSession session, Throwable cause) { if (!(cause instanceof IOException)) { logger.error("Exception: ", cause); } else { logger.info("I/O error: " + cause.getMessage()); } session.close(true); } @Override public void messageSent(IoSession session, Object message) throws Exception { sent.incrementAndGet(); } public static void main(String[] args) throws Exception { logger.info("START"); new MinaRegressionTest().connect(); } }