content: package top.arkstack.shine.mq.coordinator;
  
  import org.springframework.amqp.rabbit.support.CorrelationData;
  import top.arkstack.shine.mq.bean.EventMessage;
  import top.arkstack.shine.mq.bean.PrepareMessage;
  
  import java.util.List;
  
  /**
   * 协调者
   *
   * @author 7le
   * @version 2.0.0
   */
  public interface Coordinator {
  
      /**
       * 设置消息为prepare状态
       * 用于回查时，定位执行的任务
       *
       * @param prepare prepare信息
       */
      void setPrepare(PrepareMessage prepare);
  
      /**
       * 补偿prepare状态消息
       *
       * @param prepare prepare信息
       * @throws Exception
       */
      void compensatePrepare(PrepareMessage prepare) throws Exception;
  
      /**
       * 设置消息为ready状态，删除prepare状态
       *
       * @param msgId       消息id
       * @param checkBackId 回查id
       * @param message     消息
       */
      void setReady(String msgId, String checkBackId, EventMessage message);
  
  
      /**
       * 设置回滚消息的状态（rollback状态）
       *
       * @param msgId 消息id
       */
      void setRollback(String msgId, EventMessage message);
  
      /**
       * 删除状态（prepare状态）
       *
       * @param checkBackId 回查id
       */
      void delPrepare(String checkBackId);
  
      /**
       * 删除状态（ready状态）
       *
       * @param msgId 消息id
       */
      void delReady(String msgId);
  
      /**
       * 回滚消息的状态（rollback状态）
       *
       * @param msgId 消息id
       */
      void delRollback(String msgId);
  
      /**
       * 获取消息
       *
       * @param msgId 消息id
       * @return 消息
       */
      EventMessage getEventMsg(String msgId);
  
  
      /**
       * 获取prepare状态消息
       *
       * @return
       * @throws Exception
       */
      List<PrepareMessage> getPrepare() throws Exception;
  
      /**
       * 获取ready状态消息
       *
       * @return
       * @throws Exception
       */
      List<EventMessage> getReady() throws Exception;
  
      /**
       * 获取rollback状态消息
       *
       * @return
       * @throws Exception
       */
      List<EventMessage> getRollback() throws Exception;
  
      /**
       * 设置消息发送到RabbitMQ交换器，但无对应queue时的状态
       */
      void setReturnCallback(String msgId);
  
      /**
       * 获取ReturnCallback的状态
       * true 为无对应的queue
       */
      boolean getReturnCallback(String msgId);
  
      /**
       * 删除ReturnCallback的状态
       *
       * @param msgId 消息id
       */
      void delReturnCallback(String msgId);
  
      /**
       * 补偿ready状态消息
       *
       * @param message 消息
       * @throws Exception
       */
      void compensateReady(EventMessage message) throws Exception;
  
      /**
       * 删除回查后的状态 (prepare)
       *
       * @param ids 回查id
       */
      void delCheckBackIdWithPrepare(List<String> ids);
  
      /**
       * 删除回查后的状态 (ready)
       *
       * @param ids 回查id
       */
      void delCheckBackIdWithReady(List<EventMessage> ids);
  
      /**
       * 消息重发次数+1
       *
       * @param key     重发消息key
       * @param hashKey 消息id
       * @return 消息重发次数
       */
      Double incrementResendKey(String key, String hashKey);
  
      /**
       * 获取重发消息的值（消息重发次数）
       *
       * @param key     消息id
       * @param hashKey 消息id
       * @return 消息重发次数
       */
      Double getResendValue(String key, String hashKey);
  
      /**
       * 删除重发消息的值
       *
       * @param key     重发消息key
       * @param hashKey 消息id
       */
      void delResendKey(String key, String hashKey);
  
      /**
       * 消息发送到RabbitMQ后 自定义ack回调
       *
       * @param correlationData
       * @param ack
       */
      void confirmCallback(CorrelationData correlationData, boolean ack);
  }
  