RabbitMQ中间件配置和ActiveMQ中间件类似,也是对其专有属性的配置。看一个示例:
示例
<mqSource id="mq02" type="RabbitMQ"> <property name="Host" value="192.168.0.3" /> <property name="userName" value="tangyuan" /> <property name="password" value="123456" /> </mqSource>
RabbitMQ中间件属性说明
属性名 | 用途 | 取值 | 默认值 |
---|---|---|---|
host | 主机 | String | localhost |
port | 端口 | int | 5672 |
virtualHost | 虚拟主机 | String | / |
userName | 用户名 | String | guest |
password | 密码 | String | guest |
maxConnections | 最大可池化的连接数量 | int | 1 |
示例
<queue id="rq1" queueName="rq1" msKey="mq02"> <property name="rabbitmq.durable" value="true" /> <property name="rabbitmq.exclusive" value="false" /> <property name="rabbitmq.autoDelete" value="false" /> </queue>
专有属性说明
属性名 | 用途 | 取值 | 默认值 | 使用者 | 使用场景 |
---|---|---|---|---|---|
rabbitmq.durable | queue或exchange是否持久化 | boolean | true | 发送方/接收方 | queue |
rabbitmq.exclusive | 是否是排他队列 | boolean | false | 发送方/接收方 | queue |
rabbitmq.autoDelete | 是否自动删除 | boolean | false | 发送方/接收方 | queue |
rabbitmq.exchangeType | 交换机模式 | fanout direct topic |
fanout | 发送方/接收方 | topic |
rabbitmq.c.autoAck | 是否自动确认 | boolean | false | 接收方 | queue && topic |
rabbitmq.c.prefetchCount | 限制Queue每次发送给每个接收方的消息数 | int | 1 | 接收方 | queue |
rabbitmq.c.asynReceive | 接受方是否异步接收消息 | boolean | true | 接收方 | queue && topic |
RabbitMQ中的交换(exchange)在tangyuan-mq组件中用<topic>来进行声明,关于exchange的概念,具体可参考RabbitMQ官方教程。
示例
<topic id="rt1" topicName="rt1" msKey="mq02"> <property name="rabbitmq.exchangeType" value="direct"/> </topic>
声明exchange
<topic id="rt_fanout" topicName="rt_fanout" msKey="mq02"> <property name="rabbitmq.exchangeType" value="fanout"/> </topic>
消息发送
<mq-service id="sendFanout" channels="rt_fanout" />
消息监听
<mq-listener service="mqs/recv1" channel="rt_fanout" />
声明exchange
<topic id="rt_direct" topicName="rt_direct" msKey="mq02"> <property name="rabbitmq.exchangeType" value="direct"/> </topic>
消息发送
<!--动态routingKey--> <mq-service id="sendDirect" channels="rt_direct"> <routing channels="rt_direct" key="{x}" /> </mq-service> <!--静态routingKey--> <mq-service id="sendDirect" channels="rt_direct"> <routing channels="rt_direct" pattern="error"/> </mq-service>
注意:对于direct exchange,动态routingKey和静态routingKey在一个<mq-service>中只能选择一种模式使用,不能混合使用,比如下面这种使用方式就是错误的:
<mq-service id="sendDirect" channels="rt_direct"> <routing channels="rt_direct" key="{x}" pattern="error"/> </mq-service>
所以在使用<routing>的使用一定要注意channels属性中的队列或者主题的类型,那些可以一起使用,那些不能一起使用,可参考下面的列表:
比如:
正确的:
<routing channels="aq1,at1,rq1" key="{x}" pattern="error"/> <routing channels="rt1,rt2,rt3" key="{x}"/> <routing channels="rt1,rt2,rt3" pattern="error"/>
错误的:
<routing channels="aq1,rt1" key="{x}" pattern="error"/> <routing channels="at1,rt2" key="{x}" pattern="error"/> <routing channels="rq1,rt3" key="{x}" pattern="error"/>
总结: 1-3可以一起使用,4-6可以一起使用,1-3和4-6之中不能混合使用。
消息监听
<!--绑定单个routingKey--> <mq-listener service="mqs/recv1" channel="rt_direct"> <binding pattern="error" /> </mq-listener> <!--绑定多个routingKey,逗号分隔--> <mq-listener service="mqs/recv1" channel="rt_direct"> <binding pattern="debug, info, error" /> </mq-listener>
注意:对于direct exchange,只能使用静态绑定,也就是说<binding>中只能使用pattern属性,不能使用key属性。这是RabbitMQ对于条件绑定的特殊之处。