code: private AmqpChannel publishBasic(ByteBuffer body, HashMap<String, Object> headers, String exchange, String routingKey, boolean mandatory, boolean immediate) {
          Object[] args = {0, exchange, routingKey, mandatory, immediate};
          WrappedByteBuffer bodyArg = null;
          if (body != null) {
              bodyArg = new WrappedByteBuffer(body);
          }
          HashMap<String, Object> headersArg = new HashMap<String, Object>();
          headersArg = headers;
  
          String methodName = "publishBasic";
          String methodId = "60" + "40";
          AmqpMethod amqpMethod = MethodLookup.LookupMethod(methodId);
          Object[] arguments = {this, amqpMethod, this.id, args, bodyArg, headersArg};
  
          asyncClient.enqueueAction(methodName, "channelWrite", arguments, null, null);
  
          return this;
      }
docs: /*
  This method publishes a message to a specific exchange. The message will be routed to queues as defined by the exchange configuration and distributed to
  any active consumers when the transaction, if any, is committed.
  
  @param body
  @param headers
  @param exchange
  @param routingKey
  @param mandatory
  @param immediate
  @return AmqpChannel