package com.elab.mq.msg;

import com.elab.mq.model.MessageModel;
import com.elab.mq.model.SendResultModel;
import com.elab.mq.msg.adptor.SendCallbackAdaptor;

import java.util.Date;
import java.util.Properties;
import java.util.concurrent.ExecutorService;

/**
 * 消息生产门面类
 * 不做处理,只是为了到时候好切换
 *
 * @author Liukx
 * @create 2018-04-09 18:25
 * @email liukx@elab-plus.com
 **/
public interface IMsgProducerFacade {
    void start();

    void shutdown();

    /**
     * 发送普通消息
     *
     * @param var1
     * @return
     */
    SendResultModel send(MessageModel var1);

    /**
     * 发送单向消息
     *
     * @param messageModel
     */
    void sendOneway(MessageModel messageModel);

    /**
     * 发送异步消息
     *
     * @param messageModel       消息内容
     * @param sendCallbackFacade 异步消息回调
     */
    void sendAsync(MessageModel messageModel, SendCallbackAdaptor sendCallbackFacade);

    /**
     * 发送延时消息
     *
     * @param messageModel 消息内容
     * @param seconds      延时消息(秒)
     * @return
     */
    SendResultModel sendDeliverTime(MessageModel messageModel, int seconds);

    /**
     * 发送定时消息
     *
     * @param messageModel 消息内容
     * @param datetime     时间对象 格式: yyyy-MM-dd HH:mm:ss
     * @return
     */
    SendResultModel sendTimingMsg(MessageModel messageModel, Date datetime);

    /**
     * 设置属性
     * @param properties
     */
    public void setProperties(Properties properties);

    /**
     * 设置异步发送消息执行Callback的目标线程池。
     *
     * 如果不设置，将使用公共线程池，仅建议执行轻量级的Callback任务，避免阻塞公共线程池
     * 引起其它链路超时。
     *
     * @param callbackExecutor 执行Callback的线程池
     */
    public void setCallbackExecutor(final ExecutorService callbackExecutor);
}
