import { Options } from "amqplib/properties";
import { BaseProvider } from '../../mvc/ioc.decorator';
/** RabbitMQ 配置 */
export declare class RabbitMQConfig {
    /** 协议 `amqp` 或 `amqps`，默认 `amqp` */
    protocol?: string;
    /** 服务地址 */
    host: string;
    /** 端口，默认 `5672` */
    port?: number;
    /** 密码，默认 `guest` */
    password?: string;
    /** 用户名，默认 `guest` */
    username?: string;
    /** 心跳间隔，s, 默认 `10` */
    heartbeat?: number;
    /** 虚拟默认 `/` */
    virtualHost?: string;
    /** 消息队列名称 */
    queueName: string;
    /** 交换器的名字 */
    exchangeName: string;
    /** 交换机模型，默认 `topic` 主题模式 */
    exchangeType?: string;
    /** 交换机参数 `{ durable: true, autoDelete: false }` */
    exchangeArgs?: {
        /** 是否持久化，默认 `true` */
        durable: boolean;
        /** 是否自动删除已处理过的消息，默认 `false` */
        autoDelete: boolean;
    };
    /** 消息处理失败时最大重试次数 */
    retryCount?: number;
    /** 消息处理产生错误时是否允许重新归队， 默认 `true` */
    faildRequeue?: boolean;
    /** 消息接受用于绑定的路由键 */
    routeKey?: string;
    /** 消息发送用于绑定的路由键 */
    sendRouteKey?: string;
    /** 客户端1次处理最大消息条数，默认 `1` */
    prefetch?: number;
    /** 是否声明队列为排他队列，默认 `false` */
    exclusive?: boolean;
    /** 消息订阅选项 */
    consumeOptions?: Options.Consume;
    /** 区域设置，默认 `en_US` */
    locale?: string;
}
declare type ReceiveEvent = (msg: any) => Promise<boolean>;
/**
 * RabbitMQ Client Access
 */
export interface IRabbitMQAccess {
    config: RabbitMQConfig;
    /** 接收消息事件, 处理消息时发生错误或返回`false`则认为处理失败 */
    onRecvMsg: ReceiveEvent;
    /** 开始消息订阅和消费 */
    consume: (onRecvMsg?: ReceiveEvent, routeKey?: string, config?: RabbitMQConfig) => void;
    /** 消息发送, args 默认 `{ persistent: true, mandatory: true }` */
    send: (msg: any, args?: Options.Publish) => Promise<void>;
}
/**
 * RabbitMQ Client Access
 */
export declare class RabbitMQAccess extends BaseProvider implements IRabbitMQAccess {
    onFree(): void;
    constructor(config: RabbitMQConfig);
    private _amqplib;
    private get amqplib();
    config: RabbitMQConfig;
    private routeKey?;
    onRecvMsg: ReceiveEvent;
    /** 网络连接 */
    private recvConnection;
    private sendConnection;
    /** 消息接收通道 */
    private receiveChannel;
    /** 消息发送通道 */
    private sendChannel;
    consume(onRecvMsg?: ReceiveEvent, routeKey?: string, config?: RabbitMQConfig): void;
    send(msg: any, args?: Options.Publish): Promise<void>;
    private sendMsg;
    private startRecvServer;
    private relase;
    private relaseRecvConn;
    private relaseSendConn;
    private getConnection;
    private reStartRecv;
    private assertChannel;
    private assertQueue;
    private initialChannel;
    private initChannelExchange;
}
export {};
