WSO2项目RabbitMQ消息存储初始化失败:x-queue-type参数不匹配
解决WSO2 RabbitMQ消息存储初始化时x-queue-type参数不匹配问题
问题场景
在WSO2项目中,使用以下RabbitMQ消息存储配置:
<messageStore class="org.apache.synapse.message.store.impl.rabbitmq.RabbitMQStore" name="EmailErrorPendingMS" xmlns="http://ws.apache.org/ns/synapse"> <parameter name="store.rabbitmq.host.name">rabbitmq-staging</parameter> <parameter name="store.producer.guaranteed.delivery.enable">false</parameter> <parameter name="store.rabbitmq.host.port">5672</parameter> <parameter name="store.rabbitmq.route.key">email.key</parameter> <parameter name="store.rabbitmq.username">guest</parameter> <parameter name="store.rabbitmq.virtual.host">Email</parameter> <parameter name="rabbitmq.connection.ssl.enabled">false</parameter> <parameter name="store.rabbitmq.exchange.name">email.exchange</parameter> <parameter name="store.rabbitmq.queue.name">email.queue</parameter> <parameter name="store.rabbitmq.password">guest</parameter> </messageStore>
运行项目时出现初始化失败,核心错误提示:
虚拟主机'Email'中的队列'email.queue'的x-queue-type参数不匹配,收到的值为none,但当前队列该参数值为类型longstr的'quorum'
完整异常栈信息:
INFO {org.apache.synapse.config.xml.MessageStoreFactory} - Successfully added Message Store configuration of : [EmailMS]. INFO {org.apache.synapse.message.store.impl.rabbitmq.RabbitMQStore} - Store [EmailMS] Successfully connected to RabbitMQ Broker ERROR {org.apache.synapse.message.store.impl.rabbitmq.RabbitMQStore} - Store [EmailMS]. Initialization failed... java.io.IOException at com.rabbitmq.client.impl.AMQChannel.wrap(AMQChannel.java:129) at com.rabbitmq.client.impl.AMQChannel.wrap(AMQChannel.java:125) at com.rabbitmq.client.impl.AMQChannel.exnWrappingRpc(AMQChannel.java:147) at com.rabbitmq.client.impl.ChannelN.queueDeclare(ChannelN.java:968) at com.rabbitmq.client.impl.recovery.AutorecoveringChannel.queueDeclare(AutorecoveringChannel.java:333) at org.apache.synapse.message.store.impl.rabbitmq.RabbitMQStore.declareQueue(RabbitMQStore.java:308) at org.apache.synapse.message.store.impl.rabbitmq.RabbitMQStore.init(RabbitMQStore.java:125) ... Suppressed: com.rabbitmq.client.AlreadyClosedException: channel is already closed due to channel error; protocol method: #method<channel.close>(reply-code=406, reply-text=PRECONDITION_FAILED - inequivalent arg 'x-queue-type' for queue 'email.queue' in vhost 'Email': received none but current is the value 'quorum' of type 'longstr', class-id=50, method-id=10) ... Caused by: com.rabbitmq.client.ShutdownSignalException: channel error; protocol method: #method<channel.close>(reply-code=406, reply-text=PRECONDITION_FAILED - inequivalent arg 'x-queue-type' for queue 'email.queue' in vhost 'Email': received none but current is the value 'quorum' of type 'longstr', class-id=50, method-id=10) ...
解决方案
方法一:修改WSO2配置匹配已存在队列类型
在现有消息存储配置中添加队列类型参数,让WSO2初始化时使用与RabbitMQ中已存在队列一致的x-queue-type值,修改后的完整配置如下:
<messageStore class="org.apache.synapse.message.store.impl.rabbitmq.RabbitMQStore" name="EmailErrorPendingMS" xmlns="http://ws.apache.org/ns/synapse"> <parameter name="store.rabbitmq.host.name">rabbitmq-staging</parameter> <parameter name="store.producer.guaranteed.delivery.enable">false</parameter> <parameter name="store.rabbitmq.host.port">5672</parameter> <parameter name="store.rabbitmq.route.key">email.key</parameter> <parameter name="store.rabbitmq.username">guest</parameter> <parameter name="store.rabbitmq.virtual.host">Email</parameter> <parameter name="rabbitmq.connection.ssl.enabled">false</parameter> <parameter name="store.rabbitmq.exchange.name">email.exchange</parameter> <parameter name="store.rabbitmq.queue.name">email.queue</parameter> <parameter name="store.rabbitmq.password">guest</parameter> <!-- 添加队列类型参数,匹配已存在的quorum队列 --> <parameter name="store.rabbitmq.queue.x-queue-type">quorum</parameter> </messageStore>
方法二:删除RabbitMQ中已存在队列(注意数据风险)
若队列中的数据可丢弃或已完成备份,可通过RabbitMQ管理界面或命令行删除Email虚拟主机下的email.queue队列,之后重启WSO2服务。WSO2会自动创建符合当前配置的默认类型(classic)队列。
原因说明
WSO2的RabbitMQStore组件初始化时,会调用RabbitMQ客户端的queueDeclare方法声明队列,默认不指定x-queue-type参数;而RabbitMQ中已存在的email.queue队列是quorum类型,参数不匹配时RabbitMQ会返回406预条件失败错误,导致初始化失败。
内容的提问来源于stack exchange,提问作者Mahmoud Saleh
相关产品推荐
相关产品推荐

