API参考

API手册(REST)

目的

IMS REST接口可以很方便的操作IMS的Topic,并进行收发消息操作。REST可以通过不同开发语言编写,比如C/C++、C#、JAVA等语言编写;也可以通过不同脚本编写,比如Python、Shell、Curl等方式进行编写。

本文档描述了云消息服务平台IMS产品对外提供的所有API(REST)接口,方便开发者查询和二次开发。

使用对象

该文档是云消息服务平台IMS产品的API(REST)手册。

该文档使用对象为:使用IMS的开发人员。

术语定义

IMS:IMS是Inspur Message Service Platform的简称,中文名称为云消息服务平台,是云和大数据时代的一种高性能消息中间件,以云服务和集群方式对外提供高性能和高可靠的消息队列服务,支撑大数据采集、传输、汇聚和交换,大数据实时处理和微服务处理架构。

Topic:Topic是消息中间件里的一个重要的概念,每一个Topic代表了一类消息,有了多个Topic,就可以对消息进行归类与隔离。

CMS:CMS是Cloud Message Server的简称,中文名称为云消息服务器,是IMS的基础和核心组件,负责消息的存取和管理操作,狭义上说的IMS就是指云消息服务器CMS,其程序名称就叫ims。

IMS LN:IMS LN是Inspur Message Service Platform Load Balance Node的简称,中文名称为云消息服务平台负载均衡节点,是IMS企业版的必须组件,通过它对外开放的IP和端口统一对外提供服务。

IMS HTTP:IMS HTTP作为IMS 的一个代理组件,为IMS云消息服务提供HTTP1.1协议接入,具有高性能、高并发、高吞吐量等特点。用户可以使用HTTP1.1协议POST/GET请求实现和IMS云消息服务器收发消息。

REST:Representational State Transfer,简称REST,即表现层状态转化,是Roy Fielding博士在2000年他的博士论文中提出来的一种软件架构风格。它是一种针对网络应用的设计和开发方式,可以降低开发的复杂性,提高系统的可伸缩性。

API定义

IMS HTTP(REST)发送消息接口

功能描述

通过HTTP协议,向IMS中指定的主题topic中发送一条消息。

输入参数

表6-2 HTTP(REST)发送消息输入参数

参数名称 说明 参数值
token IMS HTTP提供的token串 参考《云消息服务平台IMS V7.0.0管理员使用手册》
topic 使用IMS Topic对应的主题名 参考《云消息服务平台IMS V7.0.0管理员使用手册》

返回值

成功:200 OK。

错误:500 Internal Server Error。

错误码说明

具体错误码和错误信息放入HTTP应答Body中,以Json形式返回“{"errcode":-10008,"errmsg":"server can not find token!"}”。其中,errcode=对应错误码,errmsg=对应错误信息。错误码参考《表7-1》或对应《云消息服务平台IMS V7.0.0 FAQ》文档

代码示例

在一些分布式系统中,服务之间的调用和传递数据往往采用REST方式,下面以HTTP Client 4.5为例介绍如何使用IMS REST接口发送消息。

import java.io.IOException;

import org.apache.http.HttpEntity;

import org.apache.http.HttpResponse;

import org.apache.http.StatusLine;

import org.apache.http.client.ClientProtocolException;

import org.apache.http.client.ResponseHandler;

import org.apache.http.client.methods.HttpPost;

import org.apache.http.entity.ByteArrayEntity;

import org.apache.http.impl.client.CloseableHttpClient;

import org.apache.http.impl.client.HttpClients;

import org.apache.http.util.EntityUtils;

/**

  • 以Rest方式从IMS test.topic中发送10条消息

  • @author gedy

    *

    */

public class PostMessage{

​ /*

​ * 主函数,默认IP/Port不需要输入参数;也可以输入IP和Port,以空格分割

​ */

​ public static void main(String[] args) {

​ System.out.println("Useage: IP:Port TopicName");

​ //指定IMS HTTP 服务器的IP和端口

​ String IP_PORT = "10.16.2.2:1326";

​ //指定IMS Topic名称

​ String argTopic= "test_topic";

​ if(args.length>=1){

​ IP_PORT = args[0];

​ }

​ if(args.length>=2){

​ argTopic = args[1];

​ }

​ //1.建立HTTP连接

​ CloseableHttpClient http = HttpClients.createDefault();

​ //2.定义HTTP 响应请求处理

​ ResponseHandler responseHandler = new ResponseHandler() {

​ @Override

​ public StatusLine handleResponse(HttpResponse response) throws ClientProtocolException, IOException {

​ HttpEntity entity = response.getEntity();

​ StatusLine sl = response.getStatusLine();

​ System.out.print(sl);

​ if (entity.getContentLength() < 200)

​ System.out.print("," + EntityUtils.toString(entity));

​ System.out.println("");

​ return sl;

​ }

​ };

​ //3.指定REST URL,并发送请求

// String initPostURL = "http://"+IP_PORT+"/ims/message?user=imqAdmin&pw=pw2017@GL!&topic="+argTopic;

// String postURL = "http://"+IP_PORT+"/ims/message?user=imqAdmin&topic="+argTopic;

​ String initPostURL = "http://"+IP_PORT+"/ims/message?token=MTUyNDYyNDM2My45MDMxNi45MzU1NDYyOTKEsGWEBK1s14BDkS4AWJMZUzpfoqIt7vp1BDBlH5NAZg&topic="+argTopic;

​ String postURL = "http://"+IP_PORT+"/ims/message?token=MTUyNDYyNDM2My45MDMxNi45MzU1NDYyOTKEsGWEBK1s14BDkS4AWJMZUzpfoqIt7vp1BDBlH5NAZg&topic="+argTopic;

​ byte[] postBody = "this is one ims message sent by http protocal.".getBytes();

​ HttpPost httpPost ;

​ HttpEntity entity = new ByteArrayEntity(postBody);

​ StatusLine sl = null;

​ try {

​ for(int i=0;i<3;i++){

​ //3.1第一次建连接或者服务器端响应不是200成功码,要重新输入用户名和口令进行验证

​ if(i==0 || sl.getStatusCode()!=200)

​ httpPost = new HttpPost(initPostURL);

​ else

​ //3.2第二次可以不用输入用户名和密码验证

​ httpPost = new HttpPost(postURL);

​ httpPost.setEntity(entity);

​ //3.3发送消息

​ sl = http.execute(httpPost, responseHandler);

​ }

​ } catch (ClientProtocolException e) {

​ // TODO Auto-generated catch block

​ e.printStackTrace();

​ } catch (IOException e) {

​ // TODO Auto-generated catch block

​ e.printStackTrace();

​ }

​ //4.关掉HTTP连接

​ finally{

​ try {

​ http.close();

​ } catch (IOException e) {

​ // TODO Auto-generated catch block

​ e.printStackTrace();

​ }

​ }

}

}

IMS HTTP(REST)接收消息接口

功能描述

通过HTTP协议,向IMS中指定的主题topic中接收一条消息。

接口信息

表6-3 HTTP(REST)接收消息接口

API**名称** URL 协议 方法 参数格式
HTTP协议接收消息接口 http://IP:Port/cmsp/message?token=MTUyNDYyNDM2My45MDMxNi45MzU1NDYyOTKEsGWEBK1s14BDkS4AWJMZUzpfoqIt7vp1BDBlH5NAZg&topic=topic1 HTTP GET 名值对以&分割

输入参数

表6-4 HTTP(REST)接收消息输入参数

参数名称 说明 参数值
token IMS HTTP提供的token串 参考《云消息服务平台IMS V7.0.0管理员使用手册》
topic 使用IMS Topic对应的主题名 参考《云消息服务平台IMS V7.0.0管理员使用手册》

返回值

成功:200 OK。HTTP body中为接收消息数据,Content-Length为接收消息长度。若为主题没有消息,Content-Length为0。

错误:500 Internal Server Error。

错误码说明

具体错误码和错误信息放入HTTP应答Body中,以Json形式返回“{"errcode":-10008,"errmsg":"server can not find token!"}”。其中,errcode=对应错误码,errmsg=对应错误信息。错误码参考《表7-1》或《云消息服务平台IMS V7.0.0 FAQ》文档。

应用举例

在一些分布式系统中,服务之间的调用和传递数据往往采用REST方式,下面以HTTP Client 4.5为例介绍如何使用IMS REST接口接收消息。

import java.io.IOException;

import java.nio.charset.Charset;

import org.apache.http.HttpEntity;

import org.apache.http.HttpResponse;

import org.apache.http.StatusLine;

import org.apache.http.client.ClientProtocolException;

import org.apache.http.client.ResponseHandler;

import org.apache.http.client.methods.HttpGet;

import org.apache.http.impl.client.CloseableHttpClient;

import org.apache.http.impl.client.HttpClients;

import org.apache.http.util.EntityUtils;

/**

  • 以Rest方式从IMS test.topic中收取10条消息

  • @author gedy

    *

    */

public class GetMessage{

​ /*

​ * 主函数,默认IP/Port不需要输入参数;也可以输入IP和Port,以空格分割

​ */

​ public static void main(String[] args) {

​ System.out.println("Useage: IP:Port TopicName");

​ //指定IMS HTTP 服务器的IP和端口

​ String IP_PORT = "10.16.2.2:1326";

​ //指定IMS Topic名称

​ String argTopic= "test_topic";

​ if(args.length>=1){

​ IP_PORT = args[0];

​ }

​ if(args.length>=2){

​ argTopic = args[1];

​ }

​ //1.建立HTTP连接

​ CloseableHttpClient http = HttpClients.createDefault();

​ //2.定义HTTP 响应请求处理

​ ResponseHandler responseHandler = new ResponseHandler() {

​ @Override

​ public StatusLine handleResponse(HttpResponse response) throws ClientProtocolException, IOException {

​ HttpEntity entity = response.getEntity();

​ StatusLine sl = response.getStatusLine();

​ System.out.print(sl);

​ if (entity.getContentLength() < 200){

​ //2.1 ContentLength为0代表,Ims Topic中没有消息

​ if(entity.getContentLength()==0)

​ System.out.print(", ims server has no message");

​ else

​ System.out.print("," + EntityUtils.toString(entity,Charset.defaultCharset()));

​ }

​ System.out.println("");

​ return sl;

​ }

​ };

​ //3.指定REST URL,并发送请求

// String initPostURL = "http://"+IP_PORT+"/ims/message?user=imqAdmin&pw=pw2017@GL!&topic="+argTopic;

// String postURL = "http://"+IP_PORT+"/ims/message?user=imqAdmin&topic="+argTopic;

​ String initPostURL = "http://"+IP_PORT+"/ims/message?token=MTUyNDYyNDM2My45MDMxNi45MzU1NDYyOTKEsGWEBK1s14BDkS4AWJMZUzpfoqIt7vp1BDBlH5NAZg&topic="+argTopic;

​ String postURL = "http://"+IP_PORT+"/ims/message?token=MTUyNDYyNDM2My45MDMxNi45MzU1NDYyOTKEsGWEBK1s14BDkS4AWJMZUzpfoqIt7vp1BDBlH5NAZg&topic="+argTopic;

​ HttpGet httpGet;

​ StatusLine sl = null;

​ try {

​ for(int i=0;i<3;i++){

​ //3.1第一次建连接或者服务器端响应不是200成功码,要重新输入用户名和口令进行验证

​ if(i==0 || sl.getStatusCode()!=200)

​ httpGet = new HttpGet(initPostURL);

​ else

​ //3.2第二次可以不用输入用户名和密码验证

​ httpGet = new HttpGet(postURL);

​ //3.3接收消息

​ sl = http.execute(httpGet, responseHandler);

​ }

​ } catch (ClientProtocolException e) {

​ // TODO Auto-generated catch block

​ e.printStackTrace();

​ } catch (IOException e) {

​ // TODO Auto-generated catch block

​ e.printStackTrace();

​ }

​ //4.关掉HTTP连接

​ finally{

​ try {

​ http.close();

​ } catch (IOException e) {

​ // TODO Auto-generated catch block

​ e.printStackTrace();

​ }

​ }

}

}

IMS HTTPS(REST)发送消息接口

功能描述

通过HTTPS协议,向IMS中指定的主题topic中发送一条消息。

接口信息

表6-5 HTTPS(REST)发送消息接口

API**名称** URL 协议 方法 参数格式
HTTPS协议发送消息接口 https://IP:Port/cmsp/message?token=MTUyNDYyNDM2My45MDMxNi45MzU1NDYyOTKEsGWEBK1s14BDkS4AWJMZUzpfoqIt7vp1BDBlH5NAZg&topic=topic1 HTTPS POST 名值对以&分割

输入参数

表6-6 HTTPS(REST)发送消息输入参数

参数名称 说明 参数值
token IMS HTTP提供的token串 参考《云消息服务平台IMS V7.0.0管理员使用手册》
topic 使用IMS Topic对应的主题名 参考《云消息服务平台IMS V7.0.0管理员使用手册》

返回值

成功:200 OK。

错误:500 Internal Server Error。

错误码说明

具体错误码和错误信息放入HTTP应答Body中,以Json形式返回“{"errcode":-10008,"errmsg":"server can not find token!"}”回。其中,errcode=对应错误码,errmsg=对应错误信息。错误码参考《表7-1》或对应《云消息服务平台IMS V7.0.0 FAQ》文档。

应用举例

在一些分布式系统中,服务之间的调用和传递数据往往采用REST方式,且要求数据安全,下面以HTTP Client 4.5为例介绍如何使用IMS REST接口发送消息。

import java.io.File;

import java.io.IOException;

import java.security.cert.CertificateException;

import java.security.cert.X509Certificate;

import javax.net.ssl.SSLContext;

import org.apache.http.HttpEntity;

import org.apache.http.HttpResponse;

import org.apache.http.StatusLine;

import org.apache.http.client.ClientProtocolException;

import org.apache.http.client.ResponseHandler;

import org.apache.http.client.methods.HttpPost;

import org.apache.http.client.protocol.HttpClientContext;

import org.apache.http.conn.ssl.SSLConnectionSocketFactory;

import org.apache.http.entity.ByteArrayEntity;

import org.apache.http.impl.client.CloseableHttpClient;

import org.apache.http.impl.client.HttpClients;

import org.apache.http.ssl.SSLContexts;

import org.apache.http.ssl.TrustStrategy;

import org.apache.http.util.EntityUtils;

/**

  • 以证书Rest方式从IMS test.topic中发送10条消息

  • @author gedy

    *

    */

public class HttpsPostMessage{

​ /*

​ * 主函数,默认IP/Port不需要输入参数;也可以输入IP和Port,以空格分割

​ */

​ public static void main(String[] args) {

​ System.out.println("Useage: IP:Port TopicName");

​ //指定IMS HTTPS 服务器的IP和端口

​ String IP_PORT = "10.16.2.2:1328";

​ //指定IMS Topic名称

​ String argTopic= "test_topic";

​ if(args.length>=1){

​ IP_PORT = args[0];

​ }

​ if(args.length>=2){

​ argTopic = args[1];

​ }

​ //1.建立HTTPS连接

​ CloseableHttpClient http = null;

​ SSLContext sslcontext = null;

​ try {

​ /1.1客户端有证书,服务端有证书,且服务端配置需要验证客户端/

​ sslcontext = SSLContexts.custom().loadKeyMaterial(new File("/home/cmsphttp/cert_tools/certs/client.p12"), "123456".toCharArray(), "123456".toCharArray())

​ /*1.2双向认证,客户端用InspurIMSCA.crt证书认证服务端个人证书,同时服务端也用InspurIMSCA.crt证书认证客户端个人证书,

而JavaInspurIMSCA与InspurIMSCA.crt是同一个ca证书,jdk 提供keytool导入InspurIMSCA.crt证书取了个别名JavaInspurIMSCA/

​ .loadTrustMaterial(new File("/home/cmsphttp/cert_tools/certs/JavaInspurIMSCA"), "123456".toCharArray(),

​ new TrustStrategy() {

​ //1.3信任所有

​ @Override

​ public boolean isTrusted(X509Certificate[] chain, String authType) throws CertificateException {

​ //System.out.println("isTrusted...........authType="+authType);

​ //1.4必须是fasle,ture 不对服务端用JavaInspurIMSCA证书对server个人证书进行验证

​ return false;

​ }

​ })

​ .build();

​ } catch (Exception e) {

​ // TODO Auto-generated catch block

​ e.printStackTrace();

​ }

​ //2. 指定 TLSv1 protocol

​ SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(

​ sslcontext,

​ new String[] { "TLSv1" },

​ null,

​ SSLConnectionSocketFactory.getDefaultHostnameVerifier());

​ http = HttpClients.custom().setSSLSocketFactory(sslsf).build();

​ HttpClientContext context = HttpClientContext.create();

​ //3.定义HTTPS 响应请求处理

​ ResponseHandler responseHandler = new ResponseHandler() {

​ @Override

​ public StatusLine handleResponse(HttpResponse response) throws ClientProtocolException, IOException {

​ HttpEntity entity = response.getEntity();

​ StatusLine sl = response.getStatusLine();

​ System.out.print(sl);

​ if (entity.getContentLength() < 200)

​ System.out.print("," + EntityUtils.toString(entity));

​ System.out.println("");

​ return sl;

​ }

​ };

​ //4.指定REST URL,并发送请求

// String initPostURL = "https://"+IP_PORT+"/IMS/message?user=imqAdmin&pw=pw2017@GL!&topic="+argTopic;

// String postURL = "https://"+IP_PORT+"/IMS /message?user=imqAdmin&topic="+argTopic;

​ String initPostURL = "https://"+IP_PORT+"/IMS/message?token=MTUyNDYyNDM2My45MDMxNi45MzU1NDYyOTKEsGWEBK1s14BDkS4AWJMZUzpfoqIt7vp1BDBlH5NAZg&topic="+argTopic;

​ String postURL = "https://"+IP_PORT+"/IMS/message?token=MTUyNDYyNDM2My45MDMxNi45MzU1NDYyOTKEsGWEBK1s14BDkS4AWJMZUzpfoqIt7vp1BDBlH5NAZg&topic="+argTopic;

​ byte[] postBody = "this is one IMS message sent by https protocal.".getBytes();

​ HttpPost httpPost ;

​ HttpEntity entity = new ByteArrayEntity(postBody);

​ StatusLine sl = null;

​ try {

​ for(int i=0;i<3;i++){

​ //4.1第一次建连接或者服务器端响应不是200成功码,要重新输入用户名和口令进行验证

​ if(i==0 || sl.getStatusCode()!=200)

​ httpPost = new HttpPost(initPostURL);

​ else

​ //4.2第二次可以不用输入用户名和密码验证

​ httpPost = new HttpPost(postURL);

​ httpPost.setEntity(entity);

​ //4.3发送消息

​ sl = http.execute(httpPost, responseHandler,context);

​ }

​ } catch (ClientProtocolException e) {

​ // TODO Auto-generated catch block

​ e.printStackTrace();

​ } catch (IOException e) {

​ // TODO Auto-generated catch block

​ e.printStackTrace();

​ }

​ //5.关掉HTTPS连接

​ finally{

​ try {

​ http.close();

​ } catch (IOException e) {

​ // TODO Auto-generated catch block

​ e.printStackTrace();

​ }

​ }

}

}

IMS HTTPS(REST)协议接收消息接口

功能描述

通过HTTPS协议,向IMS中指定的主题topic中接收一条消息。

接口信息

表6-7 HTTPS(REST)接收消息接口

API**名称** URL 协议 方法 参数格式
HTTPS协议接收消息接口 https://IP:Port/cmsp/message?token=MTUyNDYyNDM2My45MDMxNi45MzU1NDYyOTKEsGWEBK1s14BDkS4AWJMZUzpfoqIt7vp1BDBlH5NAZg&topic=topic1 HTTPS GET 名值对以&分割

输入参数

表6-8 HTTPS(REST)接收消息输入参数

参数名称 说明 参数值
token IMS HTTP提供的token串 参考《云消息服务平台IMS V7.0.0管理员使用手册》
topic 使用IMS Topic对应的主题名 参考《云消息服务平台IMS V7.0.0管理员使用手册》

返回值

成功:200 OK。HTTP body中为接收消息数据,Content-Length为接收消息长度。若为主题没有消息,Content-Length为0。

错误:500 Internal Server Error。

错误码说明

具体错误码和错误信息放入HTTP应答Body中,以Json形式返回“{"errcode":-10008,"errmsg":"server can not find token!"}”。其中,errcode=对应错误码,errmsg=对应错误信息。错误码参考《表7-1》或对应《云消息服务平台IMS V7.0.0 FAQ》文档

应用举例

在一些分布式系统中,服务之间的调用和传递数据往往采用REST方式,且要求数据安全,下面以HTTP Client 4.5为例介绍如何使用IMS REST接口接收消息。

import java.io.File;

import java.io.IOException;

import java.nio.charset.Charset;

import java.security.cert.CertificateException;

import java.security.cert.X509Certificate;

import javax.net.ssl.SSLContext;

import org.apache.http.HttpEntity;

import org.apache.http.HttpResponse;

import org.apache.http.StatusLine;

import org.apache.http.client.ClientProtocolException;

import org.apache.http.client.ResponseHandler;

import org.apache.http.client.methods.HttpGet;

import org.apache.http.client.protocol.HttpClientContext;

import org.apache.http.conn.ssl.SSLConnectionSocketFactory;

import org.apache.http.impl.client.CloseableHttpClient;

import org.apache.http.impl.client.HttpClients;

import org.apache.http.ssl.SSLContexts;

import org.apache.http.ssl.TrustStrategy;

import org.apache.http.util.EntityUtils;

/**

  • 以证书Rest方式从IMS test.topic中收取10条消息

  • @author gedy

    *

    */

public class HttpsGetMessage{

​ /*

​ * 主函数,默认IP/Port不需要输入参数;也可以输入IP和Port,以空格分割

​ */

​ public static void main(String[] args) {

​ System.out.println("Useage: IP:Port TopicName");

​ //指定IMS HTTPS 服务器的IP和端口

​ String IP_PORT = "10.16.2.2:1328";

​ //指定IMS Topic名称

​ String argTopic= "test_topic";

​ if(args.length>=1){

​ IP_PORT = args[0];

​ }

​ if(args.length>=2){

​ argTopic = args[1];

​ }

​ //1.建立HTTPS连接,并指定证书

​ CloseableHttpClient http = null;

​ SSLContext sslcontext = null;

​ try {

​ /1.1客户端有证书,服务端有证书,且服务端配置需要验证客户端/

​ sslcontext = SSLContexts.custom().loadKeyMaterial(new File("/home/cmsphttp/cert_tools/certs/client.p12"), "123456".toCharArray(), "123456".toCharArray())

​ /*1.2双向认证,客户端用InspurIMSCA.crt证书认证服务端个人证书,同时服务端也用InspurIMSCA.crt证书认证客户端个人证书,

而JavaInspurIMSCA与InspurIMSCA.crt是同一个ca证书,jdk 提供keytool导入InspurIMSCA.crt证书取了个别名JavaInspurIMSCA/

​ .loadTrustMaterial(new File("/home/cmsphttp/cert_tools/certs/JavaInspurIMSCA"), "123456".toCharArray(),

​ new TrustStrategy() {

​ //1.3信任所有

​ @Override

​ public boolean isTrusted(X509Certificate[] chain, String authType) throws CertificateException {

​ //System.out.println("isTrusted...........authType="+authType);

​ //1.4必须是fasle,ture 不对服务端用JavaInspurIMSCA证书对server个人证书进行验证

​ return false;

​ }

​ })

​ .build();

​ } catch (Exception e) {

​ // TODO Auto-generated catch block

​ e.printStackTrace();

​ }

​ //2. 指定 TLSv1 protocol

​ SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(

​ sslcontext,

​ new String[] { "TLSv1" },

​ null,

​ SSLConnectionSocketFactory.getDefaultHostnameVerifier());

​ http = HttpClients.custom().setSSLSocketFactory(sslsf).build();

​ HttpClientContext context = HttpClientContext.create();

​ //3.定义HTTPS 响应请求处理

​ ResponseHandler responseHandler = new ResponseHandler() {

​ @Override

​ public StatusLine handleResponse(HttpResponse response) throws ClientProtocolException, IOException {

​ HttpEntity entity = response.getEntity();

​ StatusLine sl = response.getStatusLine();

​ System.out.print(sl);

​ if (entity.getContentLength() < 200){

​ //3.1ContentLength为0代表,IMS Topic中没有消息

​ if(entity.getContentLength()==0)

​ System.out.print(", IMS server has no message");

​ else

​ System.out.print("," + EntityUtils.toString(entity,Charset.defaultCharset()));

​ }

​ System.out.println("");

​ return sl;

​ }

​ };

​ //4.指定REST URL,并发送请求

// String initPostURL = "https://"+IP_PORT+"/IMS/message?user=imqAdmin&pw=pw2017@GL!&topic="+argTopic;

// String postURL = "https://"+IP_PORT+"/IMS/message?user=imqAdmin&topic="+argTopic;

​ String initPostURL = "https://"+IP_PORT+"/IMS/message?token=MTUyNDYyNDM2My45MDMxNi45MzU1NDYyOTKEsGWEBK1s14BDkS4AWJMZUzpfoqIt7vp1BDBlH5NAZg&topic="+argTopic;

​ String postURL = "https://"+IP_PORT+"/IMS/message?token=MTUyNDYyNDM2My45MDMxNi45MzU1NDYyOTKEsGWEBK1s14BDkS4AWJMZUzpfoqIt7vp1BDBlH5NAZg&topic="+argTopic;

​ HttpGet httpGet;

​ StatusLine sl = null;

​ try {

​ for(int i=0;i<3;i++){

​ //4.1第一次建连接或者服务器端响应不是200成功码,要重新输入用户名和口令进行验证

​ if(i==0 || sl.getStatusCode()!=200)

​ httpGet = new HttpGet(initPostURL);

​ else

​ //4.2第二次可以不用输入用户名和密码验证

​ httpGet = new HttpGet(postURL);

​ //4.3接收消息

​ sl = http.execute(httpGet, responseHandler,context);

​ }

​ } catch (ClientProtocolException e) {

​ // TODO Auto-generated catch block

​ e.printStackTrace();

​ } catch (IOException e) {

​ // TODO Auto-generated catch block

​ e.printStackTrace();

​ }

​ //5.关掉HTTPS连接

​ finally{

​ try {

​ http.close();

​ } catch (IOException e) {

​ // TODO Auto-generated catch block

​ e.printStackTrace();

​ }

​ }

}

}

错误码表

本章描述了REST接口,在HTTP Body中的错误码(errcode=对应错误码),其他错误码请参考《常见问题》中错误码部分。

表 7-1错误码

错误码类别 错误码 错误码解释
IMS HTTP代理错误码 -10000 HTTP服务端内部错误
-10001 URL中没有传递用户名
-10002 URL中没有传递密码
-10003 URL没有发现Topic数
-10004 URL没有参数
-10007 在一个连接下不允许更改Topic
-10008 URL没有发现Token参数
-10009 Token验证失败

API手册(JAVA)

目的

IMS JAVA接口可以很方便的操作IMS的Topic,并进行收发消息操作。

本文档描述了IMS产品对外提供的所有API(JAVA)接口,方便开发者查询和二次开发。Windows下开发jni_cmsp_connect.dll和Linux下开发libjni_cmsp_connect.so的配置,参考《云消息服务平台IMS V7.0.0开发指南(JAVA).docx》。

使用对象

该文档是IMS产品的API(JAVA)手册。

该文档使用对象为:使用IMS的开发人员。

术语定义

IMS:IMS是云和大数据时代的一种高性能消息中间件,以云服务和集群方式对外提供高性能和高可靠的消息队列服务,支撑大数据采集、汇聚、交换,大数据实时处理和微服务处理架构。

Topic:Topic中文名称为主题,Topic是消息中间件里的一个重要的概念,每一个Topic代表了一类消息,有了多个Topic,就可以对消息进行归类与隔离。

CMS:CMS是Cloud Message Server的简称,中文名称为云消息服务器,是IMS的基础和核心组件,负责消息的存取和管理操作,狭义上说的IMS就是指云消息服务器CMS,其程序名称就叫IMS。

IMS LN:IMS LN是Cloud Message Service Platform Load Balance Node的简称,中文名称为云消息服务平台负载均衡节点,是IMS企业版的必须组件,通过它对外开放的IP和端口统一对外提供服务。

API**使用说明**

CMSP API(JAVA)使用包括网络调用和本地调用,以下章节将详细介绍这两种方式的使用。

网络调用

cmspClient**构造函数**

用途:

提供了网络方式访问IMS的所有方法。

函数原型:

cmspClient(String ip, int port, String userName, String passWord, String topic, int cloud, [String localIp])

参数说明:

​ ip:ip地址

​ port:端口号

​ userName:用户名

​ passWord:密码

​ topic:主题名

​ cloud:云模式,1-云模式,0-非云模式,默认非集群模式

​ localIp:在非局域网时,增加了传递localIp的构造函数,也可以通过环境变量进行设置。连接IMS时,客户端出口IP。

主题操作

接口1:创建主题

用途:

创建一个Topic。

函数原型:

public void createTopic(String topic)

参数说明:

topic - 创建CMS的主题

抛出:

CmspException - 如果创建CMS主题失败,会提示错误信息

接口2:删除主题

用途:

删除一个Topic。

函数原型:

public void dropTopic(String topic)

参数说明:

topic - 删除CMS的主题

抛出:

CmspException - 如果删除CMS主题失败,会提示错误信息

接口3:建立连接

用途:

与CMS建立连接。

函数原型:

public void connect( )

参数说明:

​ 无

抛出:

CmspException - 如果连接不上CMS,会提示连接不上CMS的错误信息

接口4:断开连接

用途:

与CMS断开连接。

函数原型:

public void disConnect( )

参数说明:

​ 无

抛出:

​ 无

代码示例:

//createTopic.java

package com.test;

import com.inspur.cmspClient.CmspClient;

public class CreateTopic {

public static void main (String[]args) throws Exception

{

​ CmspClient cmsp = null;

​ try {

​ cmsp = new CmspClient("10.16.2.3",9000,"imqAdmin", "pw2017@GL!" ,"", 0); //初始化连接CMSP的参数

​ cmsp.connect();//连接CMSP

​ cmsp.createTopic("t0");//创建t0主题

​ cmsp.disConnect();//断开连接CMSP

​ } catch (Exception e) {

​ e.printStackTrace();

​ }

​ }

}

//dropTopic.java

package com.test;

import com.inspur.cmspClient.CmspClient;

public class DropTopic {

​ public static void main (String[]args) throws Exception

​ {

​ CmspClient cmsp = null;

​ try {

​ cmsp = new CmspClient("10.16.2.3",9000,"imqAdmin", "pw2017@GL!" ,"", 0);//初始化连接CMSP的参数

​ cmsp.connect();//连接CMSP

​ cmsp.dropTopic("t0");//删除t0主题

​ cmsp.disConnect();//断开连接CMSP

​ } catch (Exception e) {

​ e.printStackTrace();

​ }

​ }

}

同步方式接收消息

接口1:接收消息

用途:

​ 从队列中获得二进制消息。

函数原型:

public byte[ ] getMq( )

参数说明:

返回:

​ 如果CMS消息队列中有消息,则返回的消息是二进制形式,否则返回值是null

抛出:

CmspException - 如果获取消息失败,会提示错误信息

接口2:从队列中获取消息

用途:

​ 从队列中获取字符串类型消息。

函数原型:

public String getMsg( )

参数说明:

返回:

如果CMS消息队列中有消息,则返回的消息是字符串形式,否则返回值是null

抛出:

CmspException - 如果获取消息失败,会提示错误信息

接口3:读取首条消息

用途:

读取队列的首条信息。

函数原型:

public byte[ ] readMqHead( )

参数说明:

返回:

获取消息队列中首条消息,返回的消息是二进制形式,否则返回值是null

抛出:

CmspException - 如果获取消息队列中首条消息失败,会提示错误信息

接口4:读取末尾消息

用途:

读取队列的最后一条信息。

函数原型:

public byte[ ] readMqTail( )

参数说明:

返回:

获取消息队列中最后一条消息,返回的消息是二进制形式,否则返回值是null

抛出:

CmspException - 如果获取消息队列中最后一条消息失败,会提示错误信息

代码示例:

//getMq.java

package com.test;

import com.inspur.cmspClient.CmspClient;

public class GetMq {

​ public static void main (String[]args) throws Exception

​ {

​ CmspClient cmsp = null;

​ try {

​ cmsp = new CmspClient("10.16.2.3",9000,"imqAdmin", "pw2017@GL!" ,"t0", 0);//初始化连接CMSP的参数

​ cmsp.connect();//连接CMSP

​ byte[] topicarr = cmsp.getMq();//向主题t0中取消息

​ if (topicarr == null)

​ {

​ System.out.println("Mq is null");

​ }

​ else

​ {

​ String topiclist = new String(topicarr,"UTF8");

​ System.out.println(topiclist);

​ }

​ cmsp.disConnect();//断开连接CMSP

​ } catch (Exception e) {

​ e.printStackTrace();

​ }

​ }

}

//readHead.java

package com.test;

import com.inspur.cmspClient.CmspClient;

public class ReadMqHead {

​ public static void main (String[]args) throws Exception

​ {

​ CmspClient cmsp = null;

​ try {

​ cmsp = new CmspClient("10.16.2.3",9000,"imqAdmin", "pw2017@GL!" ,"t0", 0);//初始化连接CMSP的参数

​ cmsp.connect();//连接CMSP

​ byte[] topicarr = cmsp.readMqHead();

​ if (topicarr == null)

​ {

​ System.out.println("Mq is null");

​ }

​ else

​ {

​ String topiclist = new String(topicarr);

​ System.out.println(topiclist);

​ }

​ cmsp.disConnect();//断开连接CMSP

​ } catch (Exception e) {

​ e.printStackTrace();

​ }

​ }

}

//readTail.java

package com.test;

import com.inspur.cmspClient.CmspClient;

public class ReadMqTail {

​ public static void main (String[]args) throws Exception

​ {

​ CmspClient cmsp = null;

​ try {

​ cmsp = new CmspClient("10.16.2.3",9000,"imqAdmin", "pw2017@GL!" ,"t0", 0);//初始化连接CMSP的参数

cmsp.connect();//连接CMSP

​ byte[] topicarr = cmsp.readMqTail();

​ if (topicarr == null)

​ {

​ System.out.println("Mq is null");

​ }

​ else

​ {

​ String topiclist = new String(topicarr);

​ System.out.println(topiclist);

​ }

​ cmsp.disConnect();//断开连接CMSP

​ } catch (Exception e) {

​ e.printStackTrace();

​ }

​ //cmsp.disconnect(socketfd);

​ }

}

同步方式发送消息

用途:

​ 向消息队列中存储一条消息。

函数原型:

public void putMq( String msg)

参数说明:

msg - 消息内容

返回:

​ 无

抛出:

CmspException - 如果发送消息失败,会提示错误信息

代码示例:

//putMq.java

package com.test;

import com.inspur.cmspClient.CmspClient;

public class PutMq {

​ public static void main (String[]args) throws Exception

​ {

​ CmspClient cmsp = null;

​ try {

​ cmsp = new CmspClient("10.16.2.3",9000,"imqAdmin", "pw2017@GL!" ,"t0", 0);//初始化连接CMSP的参数

​ cmsp.connect();//连接CMSP

​ cmsp.putMq("好");向主题t0中放消息

​ cmsp.disConnect();//断开连接CMSP

​ } catch (Exception e) {

​ e.printStackTrace();

​ }

​ }

}

异步方式接收消息

接口1:异步发送接收消息指令

用途:

​ 向云消息服务器发出获得一条消息指令。

函数原型:

public byte[ ] getMqAsync( )

参数说明:

返回:

如果CMS消息队列中有消息,则返回一条消息,消息是二进制形式,否则返回值是null

抛出:

CmspException - 如果异步获取一条消息失败,会提示错误信息

接口2:异步接收消息内容

用途:

​ 获取异步方式从消息队列中获得的一条消息。

函数原型:

public int getMqAsyncResult( )

参数说明:

返回:

如果CMS消息队列中有消息,则返回一条消息成功,则返回值是0,否则返回值是非0

抛出:

CmspException - 如果检验获取一条消息失败,会提示错误信息

代码示例:

package com.test;

import com.inspur.cmspClient.CmspClient;

public class GetMqAsync {

​ public static void main (String[]args) throws Exception

​ {

​ CmspClient cmsp = null;

​ try {

​ cmsp = new CmspClient("10.16.2.3",9000,"imqAdmin", "pw2017@GL!" , "", 0);//初始化连接CMSP的参数

​ cmsp.connect();//连接CMSP

​ int ret2 = -1;

​ byte[] mqArr = cmsp.getMqAsync();

​ if(mqArr != null)

​ {

​ ret2 = cmsp.getMqAsyncResult();

​ if(ret2 == 0)

​ {

​ //System.out.println("putMq sucess ret" + ret1);

​ System.out.println("getMqAsync sucess ret" + ret2);

​ String mqlist = new String(mqArr,"UTF8");

​ System.out.println(mqlist);

​ }

​ }

​ if(ret2 == -1)

​ {

​ //System.out.println("putMq full ret" + ret1);

​ System.out.println("getMqAsync is nul ret" + ret2);

​ }

​ cmsp.disConnect();//断开连接CMSP

​ } catch (Exception e) {

​ e.printStackTrace();

​ }

​ }

}

异步方式发送消息

用途:

​ 异步方式向消息队列中存储一条消息,函数执行后并不立即检查消息是否存储成功。

函数原型:

public void putMqAsync( String msg)

参数说明:

msg - 消息内容

返回:

​ 无

抛出:

CmspException - 如果发送消息失败,会提示错误信息

代码示例:

package com.test;

import com.inspur.cmspClient.CmspClient;

public class PutMqAsync {

​ public static void main (String[]args) throws Exception

​ {

​ CmspClient cmsp = null;

​ try {

​ cmsp = new CmspClient("10.16.2.3",9000,"imqAdmin", "pw2017@GL!" , "", 0);//初始化连接CMSP的参数

​ cmsp.connect();//连接CMSP

​ int ret2 = -1;

​ cmsp.putMqAsync("t0");

​ ret2 = cmsp.putMqAsyncResult();

​ if(ret2 == 0)

​ {

​ //System.out.println("putMq sucess ret" + ret1);

​ System.out.println("putMqAsync sucess ret" + ret2);

​ }

​ cmsp.disConnect();//断开连接CMSP

​ } catch (Exception e) {

​ e.printStackTrace();

​ }

​ }

}

消息事务操作

接口1:getMq)Commit

用途:

​ 提交操作消息的事务。

函数原型:

public byte[ ] getMqCommit( )

参数:

​ 无

抛出:

CmspException - 如果获取一条消息失败,会提示错误信息

返回:

如果CMS消息队列中有消息,则返回一条消息,消息是二进制形式,否则返回值是null

接口2: getMqRollback

用途:

​ 消息操作事务的回滚操作。

函数原型:

public byte[ ] getMqRollback( )

参数:

​ 无

抛出:

CmspException - 如果获取一条消息失败,会提示错误信息

返回:

如果CMS消息队列中有消息,则返回一条消息,消息是二进制形式,否则返回值是null

接口3:getMqTrans

用途:

​ 创建消息操作事务。

函数原型:

public byte[ ] getMqTrans( )

参数:

​ 无

抛出:

CmspException - 如果获取一条消息失败,会提示错误信息

返回:

如果CMS消息队列中有消息,则返回一条消息,消息是二进制形式,否则返回值是null

主题操作

接口1:获取主题信息

用途:

获取Topic主题的监控信息。

函数原型:

public byte[ ] getTopicInfo( String topic)

参数说明:

topic - CMS的主题

返回:

如果CMS消息队列中有消息,则返回一条消息,消息是二进制形式,否则返回值是null

抛出:

CmspException - 如果获取主题详情失败,会提示错误信息

接口2:获取所有主题

用途:

获取CMS的所有主题。

函数原型:

public byte[ ] getAllTopic( )

参数说明:

返回:

如果CMS中有主题topic,则返回所有主题topic,消息是二进制形式,否则返回值是null

抛出:

CmspException - 如果获取主题详情失败,会提示错误信息

接口3:获取主题文件名

用途:

获取CMS主题对应的文件名。

函数原型:

public byte[ ] getQueueFileName( String topic)

参数说明:

topic - CMS的主题

返回:

获取CMS主题对应的文件名,则返回CMS主题对应的文件名,消息是二进制形式,否则返回值是null

抛出:

CmspException - 如果获取主题对应的文件名失败,会提示错误信息

代码示例:

// getTopicInfo.java

//监控信息是json格式表示的字符串

package com.test;

import com.inspur.cmspClient.CmspClient;

public class GetTopicInfo {

​ public static void main (String[]args) throws Exception

​ {

​ CmspClient cmsp = null;

​ try {

​ cmsp = new CmspClient("10.16.2.3",9000,"imqAdmin", "pw2017@GL!" ,"", 0);//初始化连接CMSP的参数

​ cmsp.connect();//连接CMSP

​ byte[] topicarr = cmsp.getTopicInfo("t0");

​ String topiclist = new String(topicarr,"gbk");

​ System.out.println(topiclist);

​ } catch (Exception e) {

​ e.printStackTrace();

​ }finally{

​ cmsp.disConnect();

}

​ //cmsp.disconnect(socketfd);

​ }

}

//getAllTopic.java

package com.test;

import com.inspur.cmspClient.CmspClient;

public class GetAllTopic {

​ public static void main (String[]args) throws Exception

​ {

​ CmspClient cmsp = null;

​ try {

​ cmsp = new CmspClient("10.16.2.3",9000,"imqAdmin", "pw2017@GL!" ,"", 0);//初始化连接CMSP的参数

​ cmsp.connect();//连接CMSP

​ byte[] topicarr = cmsp.getAllTopic();//得到所有的主题

​ String topiclist = new String(topicarr,"gbk");

​ System.out.println(topiclist);

​ cmsp.disConnect();//断开连接CMSP

​ } catch (Exception e) {

​ e.printStackTrace();

​ }

​ //cmsp.disconnect(socketfd);

​ }

}

//getQueueFileName.java

package com.test;

import com.inspur.cmspClient.CmspClient;

public class GetQueueFileName {

​ public static void main (String[]args) throws Exception

​ {

​ CmspClient cmsp = null;

​ try {

​ cmsp = new CmspClient("10.16.2.3",9000,"imqAdmin", "pw2017@GL!" ,"", 0);//初始化连接CMSP的参数

​ cmsp.connect();//连接CMSP

​ byte[] topicarr = cmsp.getQueueFileName("t0");得到主题的队列名

​ String topiclist = new String(topicarr);

​ System.out.println(topiclist);

​ } catch (Exception e) {

​ e.printStackTrace();

​ }

​ cmsp.disConnect();;

​ }

}

操作主题用户

接口1:创建用户

用途:

为Topic主题创建用户。

函数原型:

public void mqUserAdd( String userName,String passWord)

参数说明:

userName - 用户名

passWord - 密码

抛出:

CmspException - 如果创建CMS用户失败,会提示错误信息

接口2:删除用户

用途:

删除Topic主题的用户。

函数原型:

public void mqUserDelete( String userName,String passWord)

参数说明:

userName - 用户名

passWord - 密码

抛出:

CmspException - 如果更新CMS用户失败,会提示错误信息

返回:

​ 无

接口3:更新用户信息

用途:

更新Topic主题用户的信息。

函数原型:

public void mqUserUpdate( String userName,String passWord)

参数说明:

userName - 用户名

passWord - 密码

抛出:

CmspException - 如果更新CMS用户失败,会提示错误信息

返回:

代码示例:

package com.test;

import com.inspur.cmspClient.CmspClient;

public class MqUserAdd {

​ public static void main (String[]args) throws Exception

​ {

​ CmspClient cmsp = null;

​ try {

​ cmsp = new CmspClient("10.16.2.3",9000,"imqAdmin", "pw2017@GL!" , "t0", 0);//初始化连接CMSP的参数

​ cmsp.connect();//连接CMSP

​ cmsp.mqUserAdd("aa", "aa");

​ cmsp.disConnect();//断开连接CMSP

​ } catch (Exception e) {

​ e.printStackTrace();

​ }

​ }

package com.test;

import com.inspur.cmspClient.CmspClient;

public class MqUserUpdate {

​ public static void main (String[]args) throws Exception

​ {

​ CmspClient cmsp = null;

​ try {

​ cmsp = new CmspClient("10.16.2.3",9000,"aa", "aa","", 0);//初始化连接CMSP的参数

​ cmsp.connect();//连接CMSP

​ cmsp.mqUserUpdate("aa", "cc");

​ cmsp.disConnect();//断开连接CMSP

​ } catch (Exception e) {

​ e.printStackTrace();

​ }

​ }

}

package com.test;

import com.inspur.cmspClient.CmspClient;

public class MqUserDelete {

​ public static void main (String[]args) throws Exception

​ {

​ CmspClient cmsp = null;

​ try {

​ cmsp = new CmspClient("10.16.2.3",9000,"aa", "aa","", 0);//初始化连接CMSP的参数

​ cmsp.connect();//连接CMSP

​ cmsp.mqUserDelete("aa");

​ } catch (Exception e) {

​ e.printStackTrace();

​ }

​ cmsp.disConnect();//断开连接CMSP

​ }

}

接收组消息

接口1:发送接收组消息指令

用途:

​ 从消息队列中获得一组(多条)消息。

函数原型:

public byte[ ] getMqGroup( )

参数说明:

返回:

如果CMS消息队列中有消息,则返回一组消息,消息是二进制形式,否则返回值是null

抛出:

CmspException - 如果获取一组消息失败,会提示错误信息

接口2:发送接收组消息内容

用途:

​ 从获得的一组消息中一次获得一条消息。

函数原型:

public byte[ ] getMsgFromGroup( )

参数说明:

返回:

如果CMS消息队列中有消息,则返回一组消息中的一条消息,消息是二进制形式,否则返回值是null

抛出:

CmspException - 如果获取一组消息中的一条消息失败,会提示错误信息

代码示例:

//GetMqGroup.java.

package com.test;

import com.inspur.cmspClient.CmspClient;

public class GetMqGroup {

​ public static void main (String[]args) throws Exception

​ {

​ CmspClient cmsp = null;

​ try {

​ cmsp = new CmspClient("10.16.2.3",9000,"imqAdmin", "pw2017@GL!" , "t0", 0);//初始化连接CMSP的参数

​ cmsp.connect();//连接CMSP

​ cmsp.getMqGroup();

​ byte[] topicarr = cmsp.getMsgFromGroup();

​ if (topicarr == null)

​ {

​ System.out.println("Mq is null");

​ }

​ else

​ {

​ String topiclist = new String(topicarr,"UTF8");

​ System.out.println(topiclist);

​ }

​ byte[] topicarr1 = cmsp.getMsgFromGroup();

​ if (topicarr1 == null)

​ {

​ System.out.println("Mq is null");

​ }

​ else

​ {

​ String topiclist1 = new String(topicarr1,"UTF8");

​ System.out.println(topiclist1);

​ }

​ cmsp.disConnect();//断开连接CMSP

​ } catch (Exception e) {

​ e.printStackTrace();

​ }

​ }

}

发送组消息

接口1:发送组消息指令

用途:

​ 向消息队列中存储一组(多条)消息。

函数原型:

public void putMqGroup( )

参数说明:

返回:

抛出:

CmspException - 如果发送消息失败,会提示错误信息

接口2:发送组消息内容

用途:

​ 向一组消息中追加一组消息。

函数原型:

public int putMsgToGroup( String msg)

参数:

msg - 消息内容

抛出:

CmspException - 如果发送消息失败,会提示错误信息

返回:

返回一组消息的长度

代码示例:

package com.test;

import com.inspur.cmspClient.CmspClient;

public class PutMqGroup {

​ public static void main (String[]args) throws Exception

​ {

​ CmspClient cmsp = null;

​ //int socketfd = 0;

​ try {

​ cmsp = new CmspClient("10.16.2.3",9000,"imqAdmin", "pw2017@GL!" , "t0", 0);//初始化连接CMSP的参数

​ cmsp.connect();//连接CMSP

​ String a = "好";

​ String b = "def";

​ cmsp.putMsgToGroup(a);

​ cmsp.putMsgToGroup(b);

​ cmsp.putMqGroup();

​ cmsp.disConnect();//断开连接CMSP

​ } catch (Exception e) {

​ e.printStackTrace();

​ }

​ }

}

调整消息队列大小

用途:

更改消息队列大小。

函数原型:

public void resizeTopic(String topic, int size)

参数说明:

topic - 主题名

size - 大小

抛出:

CmspException - 如果更改消息队列大小失败,会提示错误信息

代码示例:

//resizeTopic.java

package com.test;

import com.inspur.cmspClient.CmspClient;

public class ResizeTopic {

​ public static void main (String[]args) throws Exception

​ {

​ CmspClient cmsp = null;

​ try {

​ cmsp = new CmspClient("10.16.2.3",9000,"imqAdmin", "pw2017@GL!" ,"", 0);//初始化连接CMSP的参数

​ cmsp.connect();//连接CMSP

​ cmsp.resizeTopic("t0", 100);//更改t0主题的大小

​ cmsp.disConnect();//断开连接CMSP

​ } catch (Exception e) {

​ e.printStackTrace();

​ }

​ }

}

Topic组名连接

用途:

​ 主题Topic组名连接。

函数原型:

public TopicGroupClient(String ip, int port, String username, String password, String groupName, int mode,int autoConnectFlag);

参数说明:

ip – CmspLN IP地址

port – CmspLN 端口

userName – 连接cmspLN的用户名

passWord –连接cmspLN的密码

groupName-组名(加上imqAdmin.组名)

mode-连接模式,1表示往组内放消息,2表示从组内取消息

autoConnectFlag-自动重连

抛出:

CmspException - 如果更改消息队列大小失败,会提示错误信息

本地调用

同步方式接收消息

接口1:接收消息

用途:

​ 从消息队列中获得一条消息。

函数原型:

public byte[ ] getMq( )

参数说明:

返回:

​ 如果CMS消息队列中有消息,则返回的消息是二进制形式,否则返回值是null

抛出:

CmspException - 如果获取消息失败,会提示错误信息

接口2:接收字符串类型消息

用途:

​ 从消息队列中提取字符串类型消息。

函数原型:

public String getMsg( )

参数说明:

返回值:

如果CMS消息队列中有消息,则返回的消息是字符串形式,否则返回值是null

抛出:

CmspException - 如果获取消息失败,会提示错误信息

接口3:getMqByOffset

用途:

​ 根据偏移量从消息队列中提取消息。

函数原型:

public byte[ ] getMqByOffset( )

参数说明:

返回值:

如果CMS消息队列中有消息,则返回的消息是二进制形式,否则返回值是null

抛出:

CmspException - 如果获取消息失败,会提示错误信息

接口4:getNextOffsetByOffset

用途:

​ 根据偏移量从消息队列中提取下一条消息。

函数原型:

public int getNextOffsetByOffset( )

参数说明:

返回值:

如果CMS消息队列中有消息,则根据偏移量返回下一条消息偏移量,否则返回值是-1

抛出:

CmspException - 如果获取消息失败,会提示错误信息

代码示例:

//getMq.java

package com.test;

import com.inspur.cmspClient.CmspClient;

public class GetMq {

​ public static void main (String[]args) throws Exception

​ {

​ CmspClient cmsp = null;

​ try {

​ cmsp = new CmspClient("10.16.2.3",9000,"imqAdmin", "pw2017@GL!" ,"t0", 0);//初始化连接CMSP的参数

​ cmsp.connect();//连接CMSP

​ byte[] topicarr = cmsp.getMq();//向主题t0中取消息

​ if (topicarr == null)

​ {

​ System.out.println("Mq is null");

​ }

​ else

​ {

​ String topiclist = new String(topicarr,"UTF8");

​ System.out.println(topiclist);

​ }

​ cmsp.disConnect();//断开连接CMSP

​ } catch (Exception e) {

​ e.printStackTrace();

​ }

​ }

}

import com.inspur.cmspJni.CmspJni;

public class GetMqByOffsetTest {

​ public static void main (String[]args)

​ {

​ int ret = 0;

​ long rrt = 0L;

​ long startMili = System.currentTimeMillis (); // 当前时间对应的毫秒数

​ CmspJni q = new CmspJni ("topic-five");

​ q.openCmsp();

​ long endMili = System.currentTimeMillis ();

​ System.out.println ("ImqJni耗时为:" + (endMili - startMili) + "毫秒");

​ q.getTopicOrQueueName();

​ System.out.println ("开始 " + startMili);

​ /*byte[] msg;

​ msg = q.getMqByOffset();

​ String res = new String(msg);

​ System.out.println (res);

​ byte[] msg1;

​ msg1 = q.getMqByOffset();

​ String res1 = new String(msg1);

​ System.out.println (res1);

​ rrt = q.offsetAddr;*/

​ byte[] msg;

​ byte[] msg1;

​ msg = q.getMqByOffset();

​ msg1 = q.getMqByOffset();

​ if(q.offsetAddr == -1)

​ {

​ long rrtt1 = q.getNextOffsetByOffset();

​ if(rrtt1 == -1)

​ {

​ System.out.println ("msg is null");

​ }

​ }

​ endMili = System.currentTimeMillis ();

​ System.out.println ("结束 s" + endMili);

​ System.out.println ("总耗时为:" + (endMili - startMili) + "毫秒");

​ System.out.println ("总耗时为:" + (endMili - startMili) / 1000.0 + "秒");

​ }

}

发送消息

接口1:putMq

用途:

​ 向队列发送一条消息。

函数原型:

public void putMq( String msg)

参数说明:

msg - 消息内容

返回值:

抛出:

CmspException - 如果发送消息失败,会提示错误信息

接口2:openCmsp

用途:

​ 打开CMS主题。

函数原型:

public void openCmsp( )

参数说明:

返回值:

抛出:

CmspException - 如果打开主题失败,会提示错误信息

接口3:putMqLoop

用途:

​ 循环向队列放置一条消息。

函数原型:

public int putMqLoop( byte[ ] msg)

参数说明:

msg - 消息内容

返回值:

循环向消息队列中放置一条消息,返回0表示成功

抛出:

CmspException - 如果打开消息队列失败,会提示错误信息

代码示例:

import com.inspur.cmspJni.CmspJni;

public class PutMqTest {

​ public static void main (String[]args)

​ {

​ int ret = 0;

​ long startMili = System.currentTimeMillis (); // 当前时间对应的毫秒数

​ CmspJni q = new CmspJni ("topic-five");

​ q.openCmsp();

​ long endMili = System.currentTimeMillis ();

​ System.out.println ("ImqJni耗时为:" + (endMili - startMili) + "毫秒");

​ q.getTopicOrQueueName();

​ System.out.println ("开始 " + startMili);

​ int i = 0;

​ byte[] byBuffer = new byte[100];

​ java.util.Arrays.fill (byBuffer, (byte) 0); //二进制0

​ startMili = System.currentTimeMillis (); // 当前时间对应的毫秒数

​ for (i = 0; i < 10; i++)

​ {

​ //ret=q.putMq ("putmq.test!".getBytes());

​ ret = q.putMq (byBuffer);

​ if (ret != 0)

​ {

​ System.out.println ("putMq=" + ret);

​ i--;

​ }

​ }

​ endMili = System.currentTimeMillis ();

​ System.out.println ("结束 s" + endMili);

​ System.out.println ("总耗时为:" + (endMili - startMili) + "毫秒");

​ System.out.println ("总耗时为:" + (endMili - startMili) / 1000.0 + "秒");

​ }

}

消息事务操作

接口1:消息事务提交

用途:

​ 从队列获取消息事务提交。

函数原型:

public byte[ ] getMqCommit( )

参数说明:

返回值:

如果CMS消息队列中有消息,则返回一条消息,消息是二进制形式,否则返回值是null

抛出:

CmspException - 如果获取一条消息失败,会提示错误信息

接口2:消息事务回滚

用途:

​ 从队列获取消息事务回滚。

函数原型:

public byte[ ] getMqRollback( )

参数说明:

返回值:

如果CMS消息队列中有消息,则返回一条消息,消息是二进制形式,否则返回值是null

抛出:

CmspException - 如果获取一条消息失败,会提示错误信息

接口3:消息事务创建

用途:

​ 以事务的方式从消息队列中获取一条消息。

函数原型:

public byte[ ] getMqTrans( )

参数说明:

返回值:

如果CMS消息队列中有消息,则返回一条消息,消息是二进制形式,否则返回值是null

抛出:

CmspException - 如果获取一条消息失败,会提示错误信息

代码示例:

import com.inspur.cmspJni.CmspJni;

public class GetMqCommitJniTest {

​ public static void main (String[]args)

​ {

​ long startMili = System.currentTimeMillis (); // 当前时间对应的毫秒数

​ CmspJni q = new CmspJni ("topic-five");

​ q.openCmsp();

​ long endMili = System.currentTimeMillis ();

​ System.out.println ("ImqJni耗时为:" + (endMili - startMili) + "毫秒");

​ q.getTopicOrQueueName();

​ System.out.println ("开始 " + startMili);

​ int i = 0;

​ for (i = 0; i < 10; i++)

​ {

​ byte[]msg = q.getMqTrans ();

​ if (msg == null)

​ System.out.println ("msg is null!");

​ else

​ q.getMqCommit ();

​ System.out.println (i);

​ }

​ endMili = System.currentTimeMillis ();

​ System.out.println ("结束 s" + endMili);

​ System.out.println ("总耗时为:" + (endMili - startMili) + "毫秒");

​ System.out.println ("总耗时为:" + (endMili - startMili) / 1000.0 + "秒");

​ }

}

import com.inspur.cmspJni.CmspJni;

public class GetMqRollbackJniTest {

​ public static void main (String[]args)

​ {

​ long startMili = System.currentTimeMillis (); // 当前时间对应的毫秒数

​ CmspJni q = new CmspJni ("topic-five");

​ q.openCmsp();

​ long endMili = System.currentTimeMillis ();

​ System.out.println ("ImqJni耗时为:" + (endMili - startMili) + "毫秒");

​ q.getTopicOrQueueName();

​ System.out.println ("开始 " + startMili);

​ int i = 0;

​ for (i = 0; i < 10; i++)

​ {

​ byte[]msg = q.getMqTrans ();

​ if (msg == null)

​ System.out.println ("msg is null!");

​ else

​ q.getMqRollback();

​ System.out.println (i);

}

​ endMili = System.currentTimeMillis ();

​ System.out.println ("结束 s" + endMili);

​ System.out.println ("总耗时为:" + (endMili - startMili) + "毫秒");

​ System.out.println ("总耗时为:" + (endMili - startMili) / 1000.0 + "秒");

​ }

}

接收组消息

接口1:发送接收组消息指令

用途:

​ 从消息队列中获得一组(多条)消息。

函数原型:

public byte[ ] getMqGroup( )

参数说明:

返回值:

如果CMS消息队列中有消息,则返回一组消息,消息是二进制形式,否则返回值是null

抛出:

CmspException - 如果获取一组消息失败,会提示错误信息

接口2:发送接收组消息内容

用途:

​ 从获取的一组消息中一次获得一条消息。

函数原型:

public byte[ ] getMsgFromGroup( )

参数说明:

返回值:

如果CMS消息队列中有消息,则返回一组消息中的一条消息,消息是二进制形式,否则返回值是null

抛出:

CmspException - 如果获取一组消息中的一条消息失败,会提示错误信息

代码示例:

import com.inspur.cmspJni.CmspJni;

public class GetMqGroup {

​ public static void main (String[]args)

​ {

​ int ret = 0;

​ long startMili = System.currentTimeMillis (); // 当前时间对应的毫秒数

​ CmspJni q = new CmspJni ("topic-five");

​ q.openCmsp();

​ long endMili = System.currentTimeMillis ();

​ System.out.println ("ImqJni耗时为:" + (endMili - startMili) + "毫秒");

​ q.getTopicOrQueueName();

​ System.out.println ("开始 " + startMili);

​ int ret1 = q.getMqGroup();

​ System.out.println ("ret1" + ret1);

​ byte[] msg;

​ msg = q.getMsgFromGroup();

​ String res = new String(msg);

​ System.out.println (res);

​ byte[] msg1;

​ msg1 = q.getMsgFromGroup();

​ String res1 = new String(msg1);

​ System.out.println (res1);

​ endMili = System.currentTimeMillis ();

​ System.out.println ("结束 s" + endMili);

​ System.out.println ("总耗时为:" + (endMili - startMili) + "毫秒");

​ System.out.println ("总耗时为:" + (endMili - startMili) / 1000.0 + "秒");

​ }

}

发送组消息

接口1:发送组消息指令

用途:

​ 向消息队列中存储一组(多条)消息。

函数原型:

public void putMqGroup( )

参数说明:

返回值:

抛出:

CmspException - 如果发送消息失败,会提示错误信息

接口2:发送组消息内容

用途:

​ 向一组消息中追加一组消息。

函数原型:

public int putMsgToGroup( byte[ ] msg)

参数说明:

msg - 消息内容

返回值:

返回一组消息的长度

抛出:

CmspException - 如果发送消息失败,会提示错误信息

代码示例:

package com.test;

import com.inspur.cmspClient.CmspClient;

public class PutMqGroup {

​ public static void main (String[]args) throws Exception

​ {

​ CmspClient cmsp = null;

​ //int socketfd = 0;

​ try {

​ cmsp = new CmspClient("10.16.2.3",9000,"imqAdmin", "pw2017@GL!" , "t0", 0);//初始化连接CMSP的参数

​ cmsp.connect();//连接CMSP

​ String a = "好";

​ String b = "def";

​ cmsp.putMsgToGroup(a);

​ cmsp.putMsgToGroup(b);

​ cmsp.putMqGroup();

​ cmsp.disConnect();//断开连接CMSP

​ } catch (Exception e) {

​ e.printStackTrace();

​ }

​ }

}

openMq

用途:

​ 打开消息队列。

函数原型:

public void openMq( )

参数说明:

返回值:

抛出:

CmspException - 如果打开消息队列