发送消息代码
EXCHANGE_NAME为通道
ROUTINGKEY_NAME+ objs.getString("templateName")为动态队列
Obj为消息内容
@Resource
private RabbitTemplate rabbitTemplate;
rabbitTemplate.convertAndSend(EXCHANGE_NAME, ROUTINGKEY_NAME
+ objs.getString("templateName"), objs);
接收消息代码
package com.iqb.eatep.house.rabbit.mq.data.mq;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.amqp.core.Message;
import org.springframework.amqp.rabbit.core.ChannelAwareMessageListener;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import com.iqb.eatep.house.rabbit.mq.data.service.IMessageService;
import com.rabbitmq.client.Channel;
@Component
public class MessageQueueListener implements ChannelAwareMessageListener{
public static Logger logger = LoggerFactory.getLogger(MailQueueListener.class);
@Autowired
private IMessageService messageServiceImpl;
@Override
public void onMessage(Message message, Channel channel) throws Exception {
String messageTemplateKey = message.getMessageProperties().getReceivedRoutingKey();
String messageNameKey = messageTemplateKey.substring(messageTemplateKey.indexOf(".")+1, messageTemplateKey.length());
String messageContents = new String(message.getBody(),"UTF-8");
try{
messageServiceImpl.callbackMessage(channel,messageNameKey, messageContents);
}catch(Exception e){
logger.error("消息发送失败:" + e.getMessage());
}
}
}
spring-mq.xml
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:rabbit="http://www.springframework.org/schema/rabbit"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/rabbit
http://www.springframework.org/schema/rabbit/spring-rabbit-1.0.xsd" >
<description>rabbitmq 连接服务配置</description>
<!-- 连接配置 -->
<rabbit:connection-factory id="connectionFactory" host="${mq.host}" username="${mq.username}" password="${mq.password}" port="${mq.port}" virtual-host="${mq.vhost}" connection-factory="refConnectionFactory"/>
<rabbit:admin connection-factory="connectionFactory"/>
<bean id="refConnectionFactory" class="com.rabbitmq.client.ConnectionFactory">
<property name="requestedHeartbeat" value="10000"></property>
<property name="connectionTimeout" value="10000"></property>
</bean>
<!-- spring template声明-->
<rabbit:template exchange="amqpExchange" id="amqpTemplate" reply-timeout="10000" connection-factory="connectionFactory" message-converter="jsonMessageConverter" />
<!-- queue 队列声明-->
<rabbit:queue id="kehujia_inquiry" durable="true" auto-delete="false" exclusive="false" name="kehujia_inquiry"/>
<rabbit:queue id="kehujia_mail" durable="true" auto-delete="true" exclusive="false" name="kehujia_mail"/>
<rabbit:queue id="kehujia_message" durable="true" auto-delete="true" exclusive="false" name="kehujia_message"/>
<rabbit:queue id="kehujia_sms" durable="true" auto-delete="true" exclusive="false" name="kehujia_sms"/>
<rabbit:queue id="kehujia_message_center" durable="true" auto-delete="true" exclusive="false" name="kehujia_message_center"/>
<rabbit:queue id="kehujia_delay" durable="true" auto-delete="true" exclusive="false" name="kehujia_delay">
<rabbit:queue-arguments>
<entry key="x-dead-letter-exchange" value="kehujia-delay-exchange"/>
<entry key="x-dead-letter-routing-key" value="kehujia_delay_consumer"/>
</rabbit:queue-arguments>
</rabbit:queue>
<rabbit:queue id="kehujia_delay_consumer" durable="true" auto-delete="true" exclusive="false" name="kehujia_delay_consumer"></rabbit:queue>
<!-- 消息对象json转换类 -->
<bean id="jsonMessageConverter" class="org.springframework.amqp.support.converter.Jackson2JsonMessageConverter" />
<!-- exchange queue binging key 绑定 -->
<rabbit:direct-exchange name="kehujia-mq-exchange" durable="true" auto-delete="false" id="kehujia-mq-exchange">
<rabbit:bindings>
<rabbit:binding queue="kehujia_inquiry" key="kehujia_inquiry_key"/>
</rabbit:bindings>
</rabbit:direct-exchange>
<rabbit:topic-exchange name="kehujia-msg-exchange">
<rabbit:bindings>
<rabbit:binding queue="kehujia_message" pattern="kehujia_message.*"/>
<rabbit:binding queue="kehujia_mail" pattern="kehujia_mail.*"/>
<rabbit:binding queue="kehujia_sms" pattern="kehujia_sms.*"/>
</rabbit:bindings>
</rabbit:topic-exchange>
<rabbit:topic-exchange name="kehujia-mc-exchange">
<rabbit:bindings>
<rabbit:binding queue="kehujia_message_center" pattern="kehujia_message_center.*"/>
</rabbit:bindings>
</rabbit:topic-exchange>
<rabbit:direct-exchange name="kehujia-delay-exchange" durable="true" auto-delete="false" id="kehujia-delay-exchange">
<rabbit:bindings>
<rabbit:binding queue="kehujia_delay_consumer" key="kehujia_delay_consumer"/>
</rabbit:bindings>
</rabbit:direct-exchange>
<!-- 监听器的bean -->
<bean id="queueListenter" class="com.iqb.eatep.house.rabbit.mq.data.mq.InquiryQueueListenter"/>
<bean id="mailQueueListenter" class="com.iqb.eatep.house.rabbit.mq.data.mq.MailQueueListener"/>
<bean id="messageQueueListenter" class="com.iqb.eatep.house.rabbit.mq.data.mq.MessageQueueListener"/>
<bean id="messageCenterQueueListenter" class="com.iqb.eatep.house.rabbit.mq.data.mq.MessageCenterQueueListener"/>
<bean id="smsQueueListenter" class="com.iqb.eatep.house.rabbit.mq.data.mq.SMSQueueListener"/>
<bean id="delayQueueListenter" class="com.iqb.eatep.house.rabbit.mq.data.mq.DelayQueueListener"/>
<!-- 配置监听queue-->
<rabbit:listener-container connection-factory="connectionFactory" acknowledge="auto">
<rabbit:listener queues="kehujia_inquiry" ref="queueListenter"/>
<rabbit:listener queues="kehujia_mail" ref="mailQueueListenter"/>
<rabbit:listener queues="kehujia_message" ref="messageQueueListenter"/>
<rabbit:listener queues="kehujia_message_center" ref="messageCenterQueueListenter"/>
<rabbit:listener queues="kehujia_sms" ref="smsQueueListenter"/>
<rabbit:listener queues="kehujia_delay_consumer" ref="delayQueueListenter"/>
</rabbit:listener-container>
</beans>