public void newChannel(String queue_id, AMQHandler task) throws IOException {

    channel = (ChannelN) connection.createChannel();
    // channel.queueDeclare(queue_id, true, false, false, null);
    channel.basicQos(0);
    consumer = new QueueingConsumer(channel);
    channel.basicConsume(queue_id, false, consumer);
    task.setConsumer(consumer);
    thread_pool.execute(task);
  }
  @Test
  public void openingTooManyChannels() throws Exception {
    int n = 48;

    try {
      Host.rabbitmqctl("eval 'application:set_env(rabbit, channel_max, " + n + ").'");
      ConnectionFactory cf = TestUtils.connectionFactory();
      Connection conn = cf.newConnection();
      assertEquals(n, conn.getChannelMax());

      for (int i = 1; i <= n; i++) {
        assertNotNull(conn.createChannel(i));
      }
      // ChannelManager guards against channel.open being sent
      assertNull(conn.createChannel(n + 1));

      // Construct a channel directly
      final ChannelN ch =
          new ChannelN(
              ((AutorecoveringConnection) conn).getDelegate(),
              n + 1,
              new ConsumerWorkService(
                  Executors.newSingleThreadExecutor(),
                  Executors.defaultThreadFactory(),
                  ConnectionFactory.DEFAULT_SHUTDOWN_TIMEOUT));
      conn.addShutdownListener(
          new ShutdownListener() {
            public void shutdownCompleted(ShutdownSignalException cause) {
              // make sure channel.open continuation is released
              ch.processShutdownSignal(cause, true, true);
            }
          });
      ch.open();
      fail("expected channel.open to cause a connection exception");
    } catch (IOException e) {
      checkShutdownSignal(530, e);
    } finally {
      Host.rabbitmqctl("eval 'application:set_env(rabbit, channel_max, 0).'");
    }
  }