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
@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
@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
@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
@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 - 如果打开消息队列