AMQP协议

SuperMap iMobile 提供的消息总线模块支持AMQP、MQTT、STOMP三种协议。

AMQP管理类

AMQP管理类AMQPManager,负责队列、交换机、接收端、发送端的创建和绑定。

通过将队列和交换机绑定,并设定唯一的RoutingKey,来实现队列内的消息收发功能。

注意事项:

使用时,接收端需要在子线程中接收消息,并且接收消息是阻塞型的。

private AMQPReceiver mReceiver_Message = null;
public boolean MessageQueue() {
  //构造AMQPManager
  AMQPManager mAMQPManager = new AMQPManager();
  //建立与服务器的链接
  mAMQPManager.connection(sIP,sPort,sHostName,sUserName,sPassword,sUserId);
  //声明交换机
  mAMQPManager.declareExchange(sExchange, AMQPExchangeType.TOPIC);
  //声明队列
  mAMQPManager.declareQueue(sQueue_Message);
  构造AMQP发送端
  AMQPSender mAMQPSender = mAMQPManager.newSender();
  构造AMQP接收端
  AMQPReceiver mReceiver_Message =mAMQPManager.newReceiver(sQueue_Message);
  //绑定队列
  mAMQPManager.bindQueue(sExchange,sQueue_Message,sRoutingKey_Message);
}

AMQP发送端

AMQP发送端AMQPSender,负责发送AMQP的消息。

public boolean sendMessage(String geoJson) {
  if(mAMQPSender != null)
  {
    if (geoJson.isEmpty()) {
      return true;
    }
    else {
      boolean bSend = false;
      //发送消息
      bSend = mAMQPSender.sendMessage(sExchange, geoJson, sRoutingKey_TxtMessage);
    }
    System.out.println("send:"+bSend);
  }
  else
  {
    System.out.println("No connection has been made, please create the connection");
    return false;
  }
  return true;
}

AMQP接收端

AMQP接收端AMQPReceiver,负责接收AMQP的消息。

private void startReceiveMessage() {
  if (m_Thread_Message == null) {
    m_Thread_Message =  new Thread(new Runnable() {
      @Override
      public void run() {
        Looper.prepare();
        while (mReceiver_Message != null) {
          //接收消息
          AMQPReturnMessage returnMsg = mReceiver_Message.receiveMessage();
          if (!returnMsg.getMessage().isEmpty()) {
            if (returnMsg.getQueue().equals(sUserId)) {
              continue;// 自己发的消息,忽略
            }
            // 获取消息
            String msg = returnMsg.getMessage();
          }
        }
      }
    });
    m_Thread_Message.start();
  }
}

AMQP交换机类型

AMQP协议支持3种交换机类型:

DIRECT: 转发消息到routingKey中指定的队列 要求队列绑定时使用的bindingKey和发送时使用的routingKey保持一致,保证只有key匹配的队列中才可以进行收发消息。

FANOUT: 转发消息到与该交换机绑定的所有队列 只要接收端和发送端使用同一个交换机,所有端都可以收发消息。

TOPIC: 转发消息到所有关心routingkey中指定话题的队列 只要队列关心的主题(bindingkey)能与消息带的routingkey模糊匹配,就可以将消息发送到该队列。