ActiveMQ持久化消息到数据库的坑——Table 'activemq.ACTIVEMQ_ACKS' doesn't exist.

问题描述

  想使用数据库持久化ActiveMQ消息,在activemq.xml中配置如下:

<persistenceAdapter>
            <!--<kahaDB directory="${activemq.data}/kahadb"/>-->
            <jdbcPersistenceAdapter dataSource="#Mysql-DS" createTablesOnStartup="true"/>
</persistenceAdapter>

  createTablesOnStartup="true"的配置表明在启动时,ActiveMq会自动在数据库中建表。
  启动AcitiveMq(下面的操作都是在activemq根目录下进行):

sh /bin/activemq start

  查看日志文件

tail -f /data/activemq.log

  报错如下
ActiveMQ持久化消息到数据库的坑——Table 'activemq.ACTIVEMQ_ACKS' doesn't exist._第1张图片  并且在数据库中只创建了两张表(正常需要创建三张表:ACTIVEMQ_ACKS、ACTIVEMQ_LOCK、ACTIVEMQ_MSGS)

分析问题

  查看ActiveMQ官网发现这样的解释:

Specified key was too long; max key length is 1000 bytes is the error not allowing the creation of ACTIVEMQ_ACKS

You are probably using utf8/some other multibyte encoding as the collation in your database…

Switch it to latin1 or ASCII… The varchar fields that the key is composed of add up to less than 1000 characters but with a multibyte encoding the key length is over 1000 bytes.

  意思是key最多只能1000个字符,utf8等中文编码会占用过多的字符,所以要采用latin1 或者ASCII编码。

  查看mysql数据库编码:
ActiveMQ持久化消息到数据库的坑——Table 'activemq.ACTIVEMQ_ACKS' doesn't exist._第2张图片

解决问题

  果然需要调整编码方式,我试着采用

set character_set_database=latin1;
set character_set_server=latin1;

  发现虽然数据库的编码方式改变了,可是启动ActiveMQ依旧报同样的错误。暂时没想到原因,只能重新建一个库,并在建库的时候指定默认编码方式。

mysql> create databases activemq default character set latin1;

  查看数据库编码方式:
ActiveMQ持久化消息到数据库的坑——Table 'activemq.ACTIVEMQ_ACKS' doesn't exist._第3张图片
  再次启动ActiveMQ,发现不在报错,成功启动,并且数据库中自动创建了如下三张表。
ActiveMQ持久化消息到数据库的坑——Table 'activemq.ACTIVEMQ_ACKS' doesn't exist._第4张图片

你可能感兴趣的:(踩过的坑)