5.5. 管理消息存储

AMQ支持三种消息存贮方式,文件、Berkely DB和通过JDBC接口存放到关系数据库。可以在 APUSIC_MQ_HOME/config/mq.conf 配置文件中对其进行配置,指定服务器使用哪种消息存贮方式,但是不能同时配置服务器使用多种消息存储方式。也就是说,以下的配置方式中,只能选择其中一项进行配置。

以文件方式保存消息,配置非常简单并具有较高的性能,但是可靠性比较差。在可靠性要求不高但对性能要求很高的环境下可以使用这种消息存储方式。

要使用文件存贮方式,可以在mq.conf配置文件中指定com.apusic.jms.store.file.FileMessageStoreProvider服务,该服务仅有一个属性StoreDirectory,用于指定文件存储目录。

...
<SERVICE
    CLASS="com.apusic.jms.server.FileMessageStoreProvider"
    >
    <ATTRIBUTE NAME="StoreDirectory" VALUE="store/jms"/>
</SERVICE>
...

使用Berkely DB保存消息。Berkely DB的伸缩性和可靠性都较高,可以满足大多数应用的需要。Berkely DB同样具有配置简单的特点。由于Berkely DB的License限制商业使用,因此 AMQ 发行包中并不包含Berkely DB运行库,需要单独从www.sleepycat.com下载。

要使用Berkely DB消息存储方式,可以在mq.conf配置文件中指定com.apusic.jms.store.db.DBMessageStoreProvider服务,该服务有以下属性:

StoreDirectory 指定消息文件存放的目录

TransactionCommitNoSync 指定在提交事务时不使用sync,操作系统调用时数据完全保存到磁盘上。如果已设置了该属性为True,则JVM崩溃时数据仍可恢复,但操作系统崩溃时数据有可能无法恢复。对高可靠性应用应将该属性设置为False。

CacheSize 指定数据缓存大小,缺省为1M,最小不能低于96K。缓存大小不宜设置过大,因为 AMQ 本身已有消息缓存。

使用关系数据库保存消息。对可靠性要求很高的应用环境下建议使用这种消息存储方式。jdbc消息存储方式的缺点是配置较复杂。

1)、要使用关系数据库消息存储方式,必须在mq.conf配置文件中指定com.apusic.jms.store.jdbc.JdbcMessageStoreProvider服务,该服务具有以下属性:

DataSourceJNDIName 指定数据源的JNDI Name,该数据源最好能支持XADataSource,否则仅支持本地事务而无法支持XA事务。

...
<SERVICE
    CLASS="com.apusic.jms.store.jdbc.JdbcMessageStoreProvider"
    >
    <ATTRIBUTE NAME="DataSourceJNDIName" VALUE="jdbc/oracleDB"/>
</SERVICE>
...    
    

2)、需要在mq.conf配置文件中配置上数据源服务。

...
<SERVICE
    CLASS="com.apusic.jdbc.JDBCService"
    >
    <ATTRIBUTE NAME="EnableActiveConnTrace" VALUE="False"/>
    <ATTRIBUTE NAME="ServicePriority" VALUE="B"/>
</SERVICE>
...
    

3)、在datasources.xml中增加数据源。

 <datasource name="oracleDB"
     jndi-name="jdbc/oracleDB"
     driver-class="oracle.jdbc.driver.OracleDriver"
     url="jdbc:oracle:thin:@192.168.6.20:1521:ORCL"
    >
    <property name="user" value="user1"/>
    <property name="password" value="password1"/>
  </datasource>  
 

4)、采用这种配置时需要在数据源对应的数据库中需要建立以下三张表。

    
create table MQSEQ
(
MQSEQNAME VARCHAR(255) NOT NULL,
MQSEQNEXT INTEGER NOT NULL,
CONSTRAINT PK_MQSEQ PRIMARY KEY (MQSEQNAME)
);

create table MQDEST
(
DID INTEGER NOT NULL,
DROUTER VARCHAR(255) NOT NULL,
DTYPE VARCHAR(255) NOT NULL,
DNAME VARCHAR(255) NOT NULL,
CONSTRAINT PK_MQDEST PRIMARY KEY (DID)
);

create table MQMSG
(
MID INTEGER NOT NULL,
DID INTEGER NOT NULL,
MUIDH BIGINT NOT NULL,
MUIDL BIGINT NOT NULL,
MPRIORITY INTEGER NOT NULL,
MTIMESTAMP BIGINT NOT NULL,
MEXPIRATION BIGINT NOT NULL,
MPERSISTENT INTEGER NOT NULL,
MFRAGCOUNT INTEGER NOT NULL,
MFRAGSEQ INTEGER NOT NULL,
MSG IMAGE NOT NULL,
CONSTRAINT PK_MQMS PRIMARY KEY (MID)
);

create index MQMSG_KEY on MQMSG (DID, MUIDH, MUIDL, MFRAGSEQ);

以上表列的数据类型为支持Sql Server的示例,如果使用其它的数据库需要对字段类型做对应修改。支持Oracle的建表语句如下:

create table MQSEQ 
( 
MQSEQNAME VARCHAR(255) NOT NULL,
MQSEQNEXT INTEGER NOT NULL, 
CONSTRAINT PK_MQSEQ PRIMARY KEY (MQSEQNAME)
);

create table MQDEST 
(
DID INTEGER NOT NULL,
DROUTER VARCHAR(255) NOT NULL, 
DTYPE VARCHAR(255) NOT NULL, 
DNAME VARCHAR(255) NOT NULL, 
CONSTRAINT PK_MQDEST PRIMARY KEY (DID)
);

create table MQMSG 
( 
MID INTEGER NOT NULL, 
DID INTEGER NOT NULL, 
MUIDH int NOT NULL, 
MUIDL int NOT NULL, 
MPRIORITY INTEGER NOT NULL, 
MTIMESTAMP int NOT NULL, 
MEXPIRATION int NOT NULL, 
MPERSISTENT int NOT NULL, 
MFRAGCOUNT INTEGER NOT NULL, 
MFRAGSEQ INTEGER NOT NULL, 
MSG BLOB NOT NULL, 
CONSTRAINT PK_MQMS PRIMARY KEY (MID) 
);