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模糊匹配,就可以将消息发送到该队列。