FMQ API编程手册
(Java语言)
-- FMQ系列文档 --
目 录
第一章 FMQ API FOR JAVA 概述2
1.1.FMQ API FOR JAVA 概述2
1.2.FMQ API FOR JAVA 编程步骤2
第二章FMQ API FOR JAVA 参考3
2.1.FMQJAVAAPI(交换平台API类)3
2.1.1FMQJavaAPI.ConnectFMQ(连接交换管理平台)3
2.1.2FMQJavaAPI.DisconnectFMQ(断开与交换管理平台的连接)4
2.2.FMQEXCEPTION(交换平台异常类)4
2.2.1FMQGetLastError(取得错误描述信息)4
2.2.2FMQGetErrorTypeCode(取得错误类型码)4
2.2.3FMQGetErrorReasonCode(取得错误原因代码)4
2.3.FMQINTERFACE(交换操作API接口)5
2.3.1Commit(提交操作)5
2.3.2Rollback(回滚操作)5
2.3.3SendBuffer(发送内存缓冲)6
2.3.4SendFile(发送文件)7
2.3.5GetFile(收取文件)9
2.3.6CreateMessage(建立消息)10
2.3.7GetMessageInterface(取得消息)11
2.3.8DestoryMessageInterface (销毁消息接口)13
2.3.9DeleteMessage(删除消息)13
2.3.10LockQueue(锁队列)14
2.3.11UnlockQueue(解锁队列)15
2.3.12GetQueueCount(取得队列数量)15
2.3.13GetQueueName(取得队列的名称)15
2.3.14GetQueueDataTypeCount(取得队列中数据类型的数量)15
2.3.15GetQueueDataTypeName(取得数据类型的名称)16
2.3.16GetQueueDepth(取得队列的深度)16
2.4.FMQMESSAGEINTERFACE(消息操作API接口)18
2.4.1GetMessageLength(取得消息长度)18
2.4.2GetRemainMessageLength(取得剩余消息长度)18
2.4.3GetDataFromMessage(从消息中取得数据)18
2.4.4WriteDataFromMessage(在消息中写入数据)18
2.4.5SeekMessage(在消息中移动指针)19
附录:FMQ 代码信息参考20
3.1.原因码类型参考20
3.2.错误码参考20
第一章 FMQ API FOR Java 概述
1.1.FMQ API FOR Java 概述
FMQ API FOR Java 要求使用JDK1.2版本以上。
1.2.FMQ API FOR Java 编程步骤
1.在classpath 中增加FMQAPI.6.0.jar
2.在.java文件中引用包import FMQJavaAPI.*;
3.调用FMQJavaAPI.ConnectFMQ方法得到接口FMQInterface
4.使用接口FMQInterface 提供的方法进行操作,如发送文件、接收文件、提交操作、回滚操作等。当调用的方法返回失败的时候,函数会抛出异常FMQException,通过异常类提供的FMQGetLastError方法查看错误信息、调用异常类提供的FMQGetErrorTypeCode方法查看错误类型、调用异常类提供的FMQGetErrorReasonCode方法查看错误原因代码。
5.最后调用FMQJavaAPI.DisconnectFMQ方法 关闭与数据交换管理平台之间的连接通道。
第二章FMQ API FOR Java 参考
2.1.FMQJavaAPI(交换平台API类)
2.1.1FMQJavaAPI.ConnectFMQ(连接交换管理平台)
方法说明:FMQJavaAPI.ConnectFMQ方法用来连接交换管理平台,在客户端与服务器之间建立连接通道,如果成功返回FMQInterface接口,以后对平台的所有操作均通过FMQInterface接口完成;如果调用失败方法会抛出异常FMQException,通过异常类提供的FMQGetLastError方法查看错误信息、调用异常类提供的FMQGetErrorTypeCode方法查看错误类型、调用异常类提供的FMQGetErrorReasonCode方法查看错误原因代码。
输入参数:String szQueueManagerName 队列管理器名称
int usListenerPort 队列服务监听端口
输出参数:函数本身输出FMQInterface接口
备注信息:szQueueManagerName 输入NULL表示连接缺省队列管理器,usListenerPort输入0表示连接默认的监听端口
例子程序:
import FMQJavaAPI.*;
public class SendFile {
public static void main(String[] args) {
FMQInterface m_FMQInterface = null;
try {
//连接交换平台
m_FMQInterface = FMQJavaAPI.ConnectFMQ("", 1223);
//处理
//…………………..
//断开与交换平台的连接
FMQJavaAPI.DisconnectFMQ(m_FMQInterface);
}
catch (FMQException e) {
System.out.print(e.FMQGetLastError);
System.out.print(e. FMQGetErrorTypeCode());
System.out.print(e. FMQGetErrorReasonCode ());
return;
}
}
}
2.1.2FMQJavaAPI.DisconnectFMQ(断开与交换管理平台的连接)
方法说明:FMQJavaAPI.DisconnectFMQ() 用来断开与交换管理平台之间的连接,并释放所有申请的内存。
输入参数:pFMQPlat FMQInterface接口
输出参数:无
备注信息:无
例子程序:参考2.1.1的例子程序
2.2.FMQException(交换平台异常类)
2.2.1FMQGetLastError(取得错误描述信息)
方法说明:FMQGetLastError 用来取得错误的描述信息,当方法抛出异常后可以通过这个函数取得异常的描述信息。
输入参数:无
输出参数:函数本身返回String 指向错误的描述信息
备注信息:无
例子程序:参考2.2.1的例子程序
2.2.2FMQGetErrorTypeCode(取得错误类型码)
方法说明:FMQGetErrorTypeCode() 用来取得错误的类型码,当方法抛出异常后可以通过这个函数取得错误的类型码,来确定下一步应用程序如何进行处理。
输入参数:无
输出参数:函数本身返回long 为错误类型码
备注信息:错误类型码 0 表示没有错误
错误类型码10000表示函数调用的时候输入的参数出现错误
错误类型码20000表示服务器返回错误,需查看错误原因码
错误类型码40000表示磁盘IO方面出现错误
错误类型码80000表示与服务器连接方面出现错误
例子程序:参考2.1.1的例子程序
2.2.3FMQGetErrorReasonCode(取得错误原因代码)
方法说明:FMQGetErrorReasonCode() 用来取得错误的原因代码,当方法抛出异常后可以通过这个函数取得错误的原因代码。
输入参数:无
输出参数:函数本身返回long 为错误原因代码
备注信息:请参考本文档中FMQ代码信息参考章节获得详细的信息
例子程序:参考2.1.1的例子程序
2.3.FMQInterface(交换操作API接口)
2.3.1Commit(提交操作)
方法说明:Commit() 用来提交操作,当进行消息操作(取出、建立)时,需要要进行提交才能真正的生效。如果调用失败函数会抛出异常FMQException,通过异常类提供的FMQGetLastError方法查看错误信息、调用异常类提供的FMQGetErrorTypeCode方法查看错误类型、调用异常类提供的FMQGetErrorReasonCode方法查看错误原因代码。
输入参数:无
输出参数:无
备注信息:支持无限级提交
例子程序:无
2.3.2Rollback(回滚操作)
方法说明:Rollback() 用来回滚操作,当进行消息操作(取出、建立)时,为了保证事务的一致性可以通过回滚来撤销之前的所有操作。如果调用失败函数会抛出异常FMQException,通过异常类提供的FMQGetLastError方法查看错误信息、调用异常类提供的FMQGetErrorTypeCode方法查看错误类型、调用异常类提供的FMQGetErrorReasonCode方法查看错误原因代码。
输入参数:无
输出参数:无
备注信息:支持无限级回滚,注意当客户端断开与服务器的连接时,所有未提交的操作会被自动回滚。
例子程序:无
2.3.3DTCommit(二次提交)
函数说明:DTCommit() 用来提交操作,DTCommit与Commit的功能相同,当进行消息操作(取出、建立)时,需要要进行提交才能真正的生效。DTCommit支持二次提交操作,应用程序将提交的接口传入DTCommit,DTCommit在内部调用接口进行应用层的提交,并保证两个事务的一致性。如果调用失败函数会抛出异常FMQException,通过异常类提供的FMQGetLastError方法查看错误信息、调用异常类提供的FMQGetErrorTypeCode方法查看错误类型、调用异常类提供的FMQGetErrorReasonCode方法查看错误原因代码。
输入参数:FMQCallbackInterface Callback
输出参数:无
备注信息:支持无限级提交
例子程序:无
2.3.4SendBuffer(发送内存缓冲)
方法说明:SendBuffer() 用来向交换管理平台发送一段缓冲,如果调用失败函数会抛出异常FMQException,通过异常类提供的FMQGetLastError方法查看错误信息、调用异常类提供的FMQGetErrorTypeCode方法查看错误类型、调用异常类提供的FMQGetErrorReasonCode方法查看错误原因代码。
输入参数:szTargetID目的地地址列表
usTargetIDCount目的地地址个数
szTargetQueueName目的地接收队列名称
szDataType数据类型
cPriority优先级别 0 ~ 9
cEncrypt加密算法 0 为没有加密 保留字段
cCompress 压缩算法 0 为没有压缩 保留字段
cSendType 发送类型 0 保留字段
cReply 是否回执 保留字段
ulTimeOut 超时时间 0 为此标记无效 单位秒
szBuffer 要发送的缓存
ulBufferLen 缓存的大小
szDataQueueName数据队列名称
输出参数:无
备注信息:目的地地址是一个String数组,目的地的最大长度为10个字节;数据类型最大长度为10个字节。
szTargetQueueName 目的地接收队列的名称,输入null或者””表示默认cEncrypt、cCompress、cSendType、cReply为保留字段,在传输过程中全程保留输入的值,应用程序可以根据需要自行填写。
ulTimeOut 为超时时间单位是秒,输入0表示这个数据不会因为超时而被数据交换平台抛弃,存活时间的算法从建立消息开始计时,超过存活时间,消息会被交换平台删除,且这种删除是不可恢复的。
数据队列名称表示这段buffer发向哪一个队列,输入null表示默认的发送队列,输入其他队列的名称会被放置到相应的队列中,注意只有发送队列中的数据才能够被交换管理平台发送走。
例子程序:
import FMQJavaAPI.*;
public class SendFile {
public static void main(String[] args) {
FMQInterface m_FMQInterface = null;
try {
//连接交换平台
m_FMQInterface = FMQJavaAPI.ConnectFMQ("", 1223);
FMQInterface->SendBufferToPlat(“targetid”,//目的地
1,//目的地地址个数
“”,//目的地队列
“datatype”,//数据类型
5,//优先级别(0~9)
0,0,0,0,//4个保留字段
0,//超时时间 0为永远不超时
“Hello World!”,//Buffer
Sizeof(“Hello World!”)+1,//BufferLen
0);//发送到默认队列中
//提交到操作系统
m_FMQInterface.Commit();
//断开与交换平台的连接
FMQJavaAPI.DisconnectFMQ(m_FMQInterface);
}
catch (FMQException e) {
System.out.print(e.FMQGetLastError);
System.out.print(e. FMQGetErrorTypeCode());
System.out.print(e. FMQGetErrorReasonCode ());
return;
}
}
}
2.3.5SendFile(发送文件)
方法说明:SendFile()用来向交换管理平台发送一个文件,如果调用失败方法会抛出异常FMQException,通过异常类提供的FMQGetLastError方法查看错误信息、调用异常类提供的FMQGetErrorTypeCode方法查看错误类型、调用异常类提供的FMQGetErrorReasonCode方法查看错误原因代码。
输入参数:szTargetID目的地地址列表
usTargetIDCount目的地地址个数
szTargetQueueName目的地接收队列名称
szDataType数据类型
cPriority优先级别 0 ~ 9
cEncrypt加密算法 0 为没有加密 保留字段
cCompress 压缩算法 0 为没有压缩 保留字段
cSendType 发送类型 0 保留字段
cReply 是否回执 保留字段
ulTimeOut 超时时间 0 为此标记无效 单位秒
szFileDir 发送文件所在的目录
szFileName 发送文件的名称
szDataQueueName数据队列名称
输出参数:无
备注信息:目的地地址是一个String数组,目的地的最大长度为10个字节;数据类型最大长度为10个字节。
szTargetQueueName 目的地接收队列的名称,输入null或者””表示默认cEncrypt、cCompress、cSendType、cReply为保留字段,在传输过程中全程保留输入的值,应用程序可以根据需要自行填写。
ulTimeOut 为超时时间单位是秒,输入0表示这个数据不会因为超时而被数据交换平台抛弃,存活时间的算法从建立消息开始计时,超过存活时间,消息会被交换平台删除,且这种删除是不可恢复的。数据队列名称表示文件发向哪一个队列,输入null表示默认的发送队列,输入其他队列的名称会被放置到相应的队列中,注意只有发送队列中的数据才能够别交换管理平台发送走,发送文件名称的最大长度为75字节。
例子程序:
import FMQJavaAPI.*;
public class SendFile {
public static void main(String[] args) {
FMQInterface m_FMQInterface = null;
try {
//连接交换平台
m_FMQInterface = FMQJavaAPI.ConnectFMQ("", 1223);
m_FMQInterface->SendFileToPlat(“targetid”,//目的地
1,//目的地个数
“”,//目的地队列
“datatype”,//数据类型
5,//优先级别(0~9)
0,0,0,0,//4个保留字段
0,//超时时间 0为永远不超时
“/fmq/senddir”,//发送文件所在的目录
“hello word.txt”,//文件名称
0);//发送到默认队列中
//提交到操作系统
m_FMQInterface.Commit();
//断开与交换平台的连接
FMQJavaAPI.DisconnectFMQ(m_FMQInterface);
}
catch (FMQException e) {
System.out.print(e.FMQGetLastError);
System.out.print(e. FMQGetErrorTypeCode());
System.out.print(e. FMQGetErrorReasonCode ());
return;
}
}
}
2.3.6GetFile(收取文件)
方法说明:GetFile() 用来从交换管理平台中收取一个文件,如果调用失败方法会抛出异常FMQException,通过异常类提供的FMQGetLastError方法查看错误信息、调用异常类提供的FMQGetErrorTypeCode方法查看错误类型、调用异常类提供的FMQGetErrorReasonCode方法查看错误原因代码。
输入参数:szDatatype数据类型
szFileDir文件所在的目录
szDataQueueName数据队列名称
bOverWrite如果有同名文件已经存在是否覆盖
输出参数:函数返回收取文件的结果
szFileName输出文件名称
pGWHead输出网关头信息
备注信息:如果接收的消息文件名称为空(发送的时候以消息方式发送),则系统会自动为这个消息生成一个文件名称。
例子程序:
import FMQJavaAPI.*;
public class SendFile {
public static void main(String[] args) {
FMQInterface m_FMQInterface = null;
try {
//连接交换平台
m_FMQInterface = FMQJavaAPI.ConnectFMQ("", 1223);
m_FMQInterface ->GetFile(“xxxxx”,//! 数据类型
“/rcvdir”,//! 文件所在的目录
szFileName,//! 输出文件名 最长75字节
0,//! 数据队列名称 (如果填写,数据将从本地数据队列中取出)
0,//! 输出数据的网关头(输入NULL的时候,就不输出网关头)
true);//! 重名是否覆盖
//提交到操作系统
m_FMQInterface.Commit();
//断开与交换平台的连接
FMQJavaAPI.DisconnectFMQ(m_FMQInterface);
}
catch (FMQException e) {
System.out.print(e.FMQGetLastError);
System.out.print(e. FMQGetErrorTypeCode());
System.out.print(e. FMQGetErrorReasonCode ());
return;
}
}
}
2.3.7CreateMessage(建立消息)
方法说明:CreateMessage()用来在交换管理平台中建立一个消息,这是一个低级函数,使用起来非常灵活,SendBuffer方法和SendFile方法也是通过本方法编写而成。如果调用失败方法会抛出异常FMQException,通过异常类提供的FMQGetLastError方法查看错误信息、调用异常类提供的FMQGetErrorTypeCode方法查看错误类型、调用异常类提供的FMQGetErrorReasonCode方法查看错误原因代码。
输入参数:szTargetID目的地
szTargetQueueName目的地接收队列名称
szDataType数据类型
cPriority优先级别 0 ~ 9
cEncrypt加密算法 0 为没有加密 保留字段
cCompress 压缩算法 0 为没有压缩 保留字段
cSendType 发送类型 0 保留字段
cReply 是否回执 保留字段
ulTimeOut 超时时间 0 为此标记无效 单位秒
ulMessageLength消息长度
szFileName文件名称
szDataQueueName数据队列名称
bClone是否要建立一个消息的克隆消息
ulMsgNO克隆消息的编号
ulMsgOffset克隆消息的偏移量
szDataQueueName数据队列名称
输出参数:函数本身返回消息访问接口ImessageInterface
ulMsgNO返回消息的编号
ulMsgOffset返回消息的偏移量
备注信息:关于消息的克隆,克隆可以使多条消息共用同一个数据块,例如同一个消息需要发送给若干个目的地,可以让多个目的地共同使用同一个数据块,数据交换管理平台会分别为每一个消息块进行计数,这样做可以节省大量的IO操作,这个特性对于广播发送尤其有效。克隆的使用方法也很简单,在建立第一个消息的时候bClone = false ,并传入两个CmessageHandle对象,如果方法调用成功,ulMsgNO, ulMsgOffset会返回所建消息的消息编号以及偏移量,以后再建立消息的时候,bClone = true,并传入ulMsgNO, ulMsgOffset即可。关于其他备注信息请参考SendBuffer 和 SendFile 中的说明。
例子程序:
import FMQJavaAPI.*;
public class SendFile {
public static void main(String[] args) {
FMQInterface m_FMQInterface = null;
try {
//连接交换平台
m_FMQInterface = FMQJavaAPI.ConnectFMQ("", 1223);
FMQMessageInterface* pMessageInterface = m_FMQInterface->CreateMessage(
“targetid”,//目的地
1,//目的地个数
“”,//目的地队列
“datatype”,//数据类型
5,//优先级别(0~9)
0,0,0,0,//4个保留字段
0,//超时时间 0为永远不超时
12,//消息长度
“”//文件名称
);
pMessageInterface-> WriteDataToMessage(“hello word !”,12);
//提交到操作系统
m_FMQInterface.Commit();
//断开与交换平台的连接
FMQJavaAPI.DisconnectFMQ(m_FMQInterface);
}
catch (FMQException e) {
System.out.print(e.FMQGetLastError);
System.out.print(e. FMQGetErrorTypeCode());
System.out.print(e. FMQGetErrorReasonCode ());
return;
}
}
}
2.3.8GetMessageInterface(取得消息)
方法说明:GetMessageInterface()用来从交换平台中取得消息。这是一个低级函数,提供给用户一种更为灵活的方式取得消息,GetFile方法也是调用这个函数编写而成。如果调用失败方法会抛出异常FMQException,通过异常类提供的FMQGetLastError方法查看错误信息、调用异常类提供的FMQGetErrorTypeCode方法查看错误类型、调用异常类提供的FMQGetErrorReasonCode方法查看错误原因代码。
输入参数:szDatatype数据类型
szDataQueueName数据队列名称
bBrowseQueue是否遍历队列
pMsgHandle消息句柄(遍历的时候使用)
bDeleteFromQueue取出消息后是否删除
输出参数:无
pGWHead输出网关头信息
pMsgHandle输出消息句柄
备注信息:使用GetMessageInterface取得消息,返回消息操作接口,使用得当的话可以减少磁盘IO,尤其是带有数据头的消息。GetMessageInterface可以遍历整个队列,在一些特殊的应用中可以利用这个特性进行消息处理。遍历队列的方法为:首先找到第一条消息,输入bBrowseQueue =false bDeleteFromQueue= false第一条消息不是浏览消息且取出消息后不要删除这条消息,这时pMsgHandle会返回该消息的句柄,取下一条消息的时候,输入bBrowseQueue = true bDeleteFromQueue= false 以及第一条消息的返回的pMsgHandle,即可得到下一条消息了,如果下一条消息存在pMsgHandle变成了该消息的句柄,这样就可以循环调用本函数达到遍历整个队列的目的了。
例子程序:
import FMQJavaAPI.*;
public class SendFile {
public static void main(String[] args) {
FMQInterface m_FMQInterface = null;
try {
//连接交换平台
m_FMQInterface = FMQJavaAPI.ConnectFMQ("", 1223);
FMQMessageInterface* pMessageInterface = pFMQI-> FMQGetLastErrorInterface (
“szDataType”,//数据类型
“”,//队列名称
“datatype”,//数据类型
false,//是否遍历队列
&m_GWHead,//网关头
&lMsgHandle,//消息句柄
12,//消息长度
false//取出消息后是否删除
);
long lMsgLen = pMessageInterface-> BHGetMessageLength();
if (lMsgLen != pMessageInterface-> GetDataFromMessage (pData, lMsgLen))
{
System.out.print(e.FMQGetLastError);
System.out.print(e. FMQGetErrorTypeCode());
System.out.print(e. FMQGetErrorReasonCode ());
return;
}
//提交到操作系统
m_FMQInterface.Commit();
//断开与交换平台的连接
FMQJavaAPI.DisconnectFMQ(m_FMQInterface);
}
catch (FMQException e) {
System.out.print(e.FMQGetLastError);
System.out.print(e. FMQGetErrorTypeCode());
System.out.print(e. FMQGetErrorReasonCode ());
return;
}
}
}
2.3.9DestoryMessageInterface (销毁消息接口)
方法说明:DestoryMessageInterface()用来关闭CreateMessage() 或者BHGetMessageInterface()取得消息接口。
输入参数:pMessageInterface消息接口
输出参数:无
备注信息:无
例子程序:无
2.3.10DeleteMessage(删除消息)
方法说明:DeleteMessage()用来删除一个消息,本方法删除以浏览方式取得的消息,BHGetMessageInterface得到该消息的GWHead与pMsgHandle,输入这两个参数和该消息的数据类型就可以删除该消息了。如果调用失败方法会抛出异常FMQException,通过异常类提供的FMQGetLastError方法查看错误信息、调用异常类提供的FMQGetErrorTypeCode方法查看错误类型、调用异常类提供的FMQGetErrorReasonCode方法查看错误原因代码。
输入参数:szDatatype数据类型
szDataQueueName数据队列名称
pGWHead输出网关头信息
lMsgHandle消息句柄
输出参数:无
备注信息:删除消息前一定要先关闭该消息的访问接口
例子程序:参考2.9的例子程序
2.3.11LockQueue(锁队列)
方法说明:LockQueue()用来锁定队列,对于多线程、多进程同时操作队列时提供一个锁的机制。如果调用失败方法会抛出异常FMQException,通过异常类提供的FMQGetLastError方法查看错误信息、调用异常类提供的FMQGetErrorTypeCode方法查看错误类型、调用异常类提供的FMQGetErrorReasonCode方法查看错误原因代码。
输入参数:szDatatype数据类型
szDataQueueName数据队列名称
输出参数:无
备注信息:该锁是逻辑锁不是物理锁
例子程序:
import FMQJavaAPI.*;
public class SendFile {
public static void main(String[] args) {
FMQInterface m_FMQInterface = null;
try {
//连接交换平台
m_FMQInterface = FMQJavaAPI.ConnectFMQ("", 1223);
//锁队列
m_FMQInterface ->LockQueue(“XXXXX”,//数据类型
“”//数据队列名称);
m_FMQInterface ->UnlockQueue(“XXXXX”,//数据类型
“”//数据队列名称);
//断开与交换平台的连接
FMQJavaAPI.DisconnectFMQ(m_FMQInterface);
}
catch (FMQException e) {
System.out.print(e.FMQGetLastError);
System.out.print(e. FMQGetErrorTypeCode());
System.out.print(e. FMQGetErrorReasonCode ());
return;
}
}
}
2.3.12UnlockQueue(解锁队列)
方法说明:UnlockQueue()用来解锁队列,如果调用失败方法会抛出异常FMQException,通过异常类提供的FMQGetLastError方法查看错误信息、调用异常类提供的FMQGetErrorTypeCode方法查看错误类型、调用异常类提供的FMQGetErrorReasonCode方法查看错误原因代码。
输入参数:szDatatype数据类型
szDataQueueName数据队列名称
输出参数:无
备注信息:无
例子程序:参考2.3.10的例子程序
2.3.13GetQueueCount(取得队列数量)
方法说明:GetQueueCount()用来取得队列管理器中管理的队列数量。如果调用失败方法会抛出异常FMQException,通过异常类提供的FMQGetLastError方法查看错误信息、调用异常类提供的FMQGetErrorTypeCode方法查看错误类型、调用异常类提供的FMQGetErrorReasonCode方法查看错误原因代码。
输入参数:无
输出参数:函数本身返回队列的数量
备注信息:队列管理器中至少含有两个队列发送队列和接收队列,0为发送队列、1为接收队列
例子程序:请参考2.3.16
2.3.14GetQueueName(取得队列的名称)
方法说明:GetQueueName()用来取得队列的名称。如果调用失败方法会抛出异常FMQException,通过异常类提供的FMQGetLastError方法查看错误信息、调用异常类提供的FMQGetErrorTypeCode方法查看错误类型、调用异常类提供的FMQGetErrorReasonCode方法查看错误原因代码。
输入参数:lQueueNO队列的编号
输出参数:无
szQueueName数据队列名称
备注信息:发送队列 sendqueue 接收队列rcvqueue
例子程序:请参考2.3.16
2.3.15GetQueueDataTypeCount(取得队列中数据类型的数量)
方法说明:GetQueueDataTypeCount()用来取得队列中数据类型的数量。如果调用失败方法会抛出异常FMQException,通过异常类提供的FMQGetLastError方法查看错误信息、调用异常类提供的FMQGetErrorTypeCode方法查看错误类型、调用异常类提供的FMQGetErrorReasonCode方法查看错误原因代码。
输入参数:szDataQueueName数据队列名称
输出参数:函数本身返回队列中含有的数据类型数量
备注信息:发送队列返回的是队列中的方向数
例子程序:请参考2.3.16
2.3.16GetQueueDataTypeName(取得数据类型的名称)
方法说明:GetQueueDataTypeName()用来取得队列中某一数据类型的名称。如果调用失败方法会抛出异常FMQException,通过异常类提供的FMQGetLastError方法查看错误信息、调用异常类提供的FMQGetErrorTypeCode方法查看错误类型、调用异常类提供的FMQGetErrorReasonCode方法查看错误原因代码。
输入参数:szDataQueueName数据队列名称
lDataTypeNO数据类型编号
输出参数:无
szDataTypeName 数据类型名称
备注信息:无
例子程序:请参考2.3.16
2.3.17GetQueueDepth(取得队列的深度)
方法说明:GetQueueDepth()用来取得队列的深度,深度即队列中含有的消息数量,如果调用失败方法会抛出异常FMQException,通过异常类提供的FMQGetLastError方法查看错误信息、调用异常类提供的FMQGetErrorTypeCode方法查看错误类型、调用异常类提供的FMQGetErrorReasonCode方法查看错误原因代码。
输入参数:szDatatype数据类型
szDataQueueName数据队列名称
ucPriority优先级别
输出参数:函数本身返回队列的深度
备注信息:优先级别输入’*’ (47)表示优先级全部
例子程序:
import FMQJavaAPI.*;
public class ViewQueue {
public static void main(String[] args) {
FMQInterface m_FMQInterface = null;
try {
//连接交换平台
m_FMQInterface = FMQJavaAPI.ConnectFMQ("", 1223);
StringBuffer sbQueueName = new StringBuffer();
StringBuffer sbDataType = new StringBuffer();
int iQueueCount = m_FMQInterface.GetQueueCount();
System.out.println("共有队列:" + iQueueCount + "个");
for (int i = 0; i < iQueueCount; i++) {
m_FMQInterface.GetQueueName(i, sbQueueName);
System.out.println("队列[" + sbQueueName + "]:");
int iDatatypeCount = m_FMQInterface.GetQueueDataTypeCount(
sbQueueName.toString());
for (int m = 0; m < iDatatypeCount; m++) {
m_FMQInterface.GetQueueDataTypeName(sbQueueName.toString(),
m, sbDataType);
int iDepth = m_FMQInterface.GetQueueDepth(sbDataType.
toString(), sbQueueName.toString(), (byte) '*');
System.out.println("[" + sbDataType + "]: 深度[" + iDepth +
"]");
}
}
} catch (ExplatException e) {
System.out.print(e.FMQGetLastError);
System.out.print(e. FMQGetErrorTypeCode());
System.out.print(e. FMQGetErrorReasonCode ());
return;
}
}
}
2.4.FMQMessageInterface(消息操作API接口)
2.4.1GetMessageLength(取得消息长度)
方法说明:GetMessageLength()用来取得消息长度。
输入参数:无
输出参数:函数本身返回消息长度
备注信息:无
例子程序:无
2.4.2GetRemainMessageLength(取得剩余消息长度)
方法说明:GetRemainMessageLength()用来取得剩余的消息长度。
输入参数:无
备注信息:取消息、写入消息以及移动消息指针会对这个值产生影响
例子程序:无
2.4.3GetDataFromMessage(从消息中取得数据)
方法说明:GetDataFromMessage()用来从消息中取得数据。如果调用失败方法会抛出异常FMQException,通过异常类提供的FMQGetLastError方法查看错误信息、调用异常类提供的FMQGetErrorTypeCode方法查看错误类型、调用异常类提供的FMQGetErrorReasonCode方法查看错误原因代码。
输入参数:pData数据缓冲
ulDataLength要取得的长度
输出参数:函数本身返回取得的字节数
备注信息:取得的数据的同时会向后移动消息指针
例子程序:无
2.4.4WriteDataFromMessage(在消息中写入数据)
方法说明:WriteDataToMessage()用来在消息中写入数据。如果调用失败方法会抛出异常FMQException,通过异常类提供的FMQGetLastError方法查看错误信息、调用异常类提供的FMQGetErrorTypeCode方法查看错误类型、调用异常类提供的FMQGetErrorReasonCode方法查看错误原因代码。
输入参数:pData数据缓冲
ulDataLength要写入的长度
输出参数:函数本身返回执行结果
备注信息:写入数据的同时会向后移动消息指针
例子程序:无
2.4.5SeekMessage(在消息中移动指针)
方法说明:SeekMessage()通过FMQMessageInterface用来在消息中移动指针,如果调用失败方法会抛出异常FMQException,通过异常类提供的FMQGetLastError方法查看错误信息、调用异常类提供的FMQGetErrorTypeCode方法查看错误类型、调用异常类提供的FMQGetErrorReasonCode方法查看错误原因代码。
输入参数:ulOffset数据的相对位置
iSeekMode移动的模式
输出参数:函数本身返回执行结果
备注信息:iSeekMode ImessageInterface::SEEK_SET = 0 从开始计算相对位置ImessageInterface::SEEK_CUR = 1 从当前位置计算相对位置ImessageInterface::SEEK_END = 2从最后计算相对位置
例子程序:无
附录:FMQ 代码信息参考
3.1.原因码类型参考
原因码原因标识原因描述
0FMQERROR_NOERROR没有错误
10000FMQERROR_PARAMETERERROR参数输入错误
20000FMQERROR_SERVERERROR运行期错误
40000FMQERROR_IOERROR磁盘IO错误
80000FMQERROR_NETERROR网络层错误
3.2.错误码参考
错误码错误类型错误描述
10001参数输入错误目的地不能为空
10002参数输入错误目的地长度范围错误
10003参数输入错误目的地队列名称长度
10004参数输入错误不能直接将消息发送到目的地的发送队列中
10005参数输入错误数据类型不能为空
10006参数输入错误数据类型长度范围错误
10007参数输入错误文件名称长度范围错误
10008参数输入错误数据队列名称长度范围错误
10009参数输入错误队列管理器名称长度范围错误
10010参数输入错误优先级别取值范围错误
10011参数输入错误以浏览的方式取得消息必须输入网关头
10012参数输入错误以浏览的方式取得消息必须输入消息句柄
10013参数输入错误以浏览的方式取得消息不能直接删除
10014参数输入错误要发送的文件不存在
10015参数输入错误接收目录不存在
10016参数输入错误GB2312字符集不存在(Java API 使用)
10017参数输入错误文件名称不能为空
10018参数输入错误要发送的缓存不能为空
20001运行期错误没有消息
20002运行期错误服务器返回信息错误
20003运行期错误文件已经存在
40001磁盘IO错误打开文件失败
40002磁盘IO错误读取文件失败
40003磁盘IO错误写入文件失败
40004磁盘IO错误移动文件指针失败
40005磁盘IO错误关闭文件失败
40006磁盘IO错误队列文件的大小错误
80001网络层错误向服务器发送请求出错
80002网络层错误服务器响应超时
80003网络层错误等待服务器应答出错
80004网络层错误读取服务器发应答出错
80005网络层错误建立SOCKET失败
80006网络层错误连接服务器监听端口失败