一 所需jar包
<dependency>
<groupId>com.rabbitmq</groupId>
<artifactId>amqp-client</artifactId>
<version>4.0.1</version>
</dependency>
<dependency>
<groupId>org.springframework.amqp</groupId>
<artifactId>spring-rabbit</artifactId>
<version>1.6.6.RELEASE</version>
</dependency>
二 rabbitmq.properties配置
rabbitmq.host=localhost
rabbitmq.port=5672
rabbitmq.username=guest
#rabbitmq.password=At@6Tf-6Cb*6
rabbitmq.password=guest
三 消息发送端producer(spring-rabbitmq-producer.xml)配置
<?xml version="1.0" encoding="UTF-8"?>
<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-4.0.xsd
http://www.springframework.org/schema/rabbit
http://www.springframework.org/schema/rabbit/spring-rabbit.xsd">
•
<!--配置connection-factory,指定连接rabbit server参数 -->
<rabbit:connection-factory id="connectionFactory"
username="${rabbitmq.username}"
password="${rabbitmq.password}"
host="${rabbitmq.host}"
port="${rabbitmq.port}" />
<!-- spring amqp默认的是jackson 的一个插件,目的将生产者生产的数据转换为json存入消息队列 -->
<bean id="jsonMessageConverter" class="org.springframework.amqp.support.converter.Jackson2JsonMessageConverter"></bean>
•
<!--定义rabbit template用于数据的接收和发送 -->
<rabbit:template id="amqpTemplate"
connection-factory="connectionFactory"
exchange="amq.direct"
message-converter="jsonMessageConverter"
/>
•
<!--通过指定下面的admin信息,当前producer中的exchange和queue会在rabbitmq服务器上自动生成 -->
<rabbit:admin connection-factory="connectionFactory" />
•
<!--定义queue队列 -->
<!--
durable:是否持久化
exclusive: 仅创建者可以使用的私有队列,断开后自动删除
auto_delete: 当所有消费客户端连接断开后,是否自动删除队列
-->
<rabbit:queue name="routeKey_message" durable="true" auto-delete="false" exclusive="false" />
<rabbit:queue name="routeKey_email" durable="true" auto-delete="false" exclusive="false" />
<rabbit:queue name="routeKey_wechat" durable="true" auto-delete="false" exclusive="false" />
<rabbit:queue name="routeKey_analysisLogInfo" durable="true" auto-delete="true" exclusive="false" >
<rabbit:queue-arguments>
<entry key="x-message-ttl">
<value type="java.lang.Integer">60000</value> <!--保留60s内的数据-->
</entry>
<entry key="x-max-priority"> <!--设置消息队列优先级-->
<value type="java.lang.Integer">10</value>
</entry>
</rabbit:queue-arguments>
• </rabbit:queue>
<!-- 定义direct exchange,绑定routeKey_one -->
<!--
rabbit:direct-exchange:定义exchange模式为direct,意思就是消息与一个特定的路由键完全匹配,才会转发。
rabbit:binding:设置消息queue匹配的key
-->
<rabbit:direct-exchange name="amq.direct" durable="true" >
<rabbit:bindings>
<rabbit:binding queue="routeKey_message" key="routeKey_message"></rabbit:binding>
<rabbit:binding queue="routeKey_email" key="routeKey_email"></rabbit:binding>
<rabbit:binding queue="routeKey_wechat" key="routeKey_wechat"></rabbit:binding>
<rabbit:binding queue="routeKey_analysisLogInfo" key="routeKey_analysisLogInfo"></rabbit:binding>
</rabbit:bindings>
</rabbit:direct-exchange>
•
<!-- 消息生产者 -->
<bean id="messageMqProducer" class="com.suninfo.rabbitmq.message.MessageMqProducer">
<property name="amqpTemplate" ref="amqpTemplate"></property>
<property name="routekey" value="routeKey_message" ></property>
</bean>
<bean id="emailMqProducer" class="com.suninfo.rabbitmq.email.EmailMqProducer">
<property name="amqpTemplate" ref="amqpTemplate"></property>
<property name="routekey" value="routeKey_email" ></property>
</bean>
<bean id="wechatMqProducer" class="com.suninfo.rabbitmq.wechat.WechatMqProducer">
<property name="amqpTemplate" ref="amqpTemplate"></property>
<property name="routekey" value="routeKey_wechat" ></property>
</bean>
<bean id="analysisLogInfoMqProducer" class="com.suninfo.rabbitmq.analysisloginfo.AnalysisLogInfoMqProducer">
<property name="amqpTemplate" ref="amqpTemplate"></property>
<property name="routekey" value="routeKey_analysisLogInfo" ></property>
</bean>
•
</beans>
四 消息接收端consumer(spring-rabbitmq-consumer.xml)配置
<?xml version="1.0" encoding="UTF-8"?>
<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-4.0.xsd
http://www.springframework.org/schema/rabbit
http://www.springframework.org/schema/rabbit/spring-rabbit.xsd">
•
<!--配置connection-factory,指定连接rabbit server参数 -->
<rabbit:connection-factory id="connectionFactory"
username="${rabbitmq.username}"
password="${rabbitmq.password}"
host="${rabbitmq.host}"
port="${rabbitmq.port}" />
•
<!--通过指定下面的admin信息,当前producer中的exchange和queue会在rabbitmq服务器上自动生成 -->
<rabbit:queue name="routeKey_message" durable="true" auto-delete="false" exclusive="false" />
<rabbit:queue name="routeKey_email" durable="true" auto-delete="false" exclusive="false" />
<rabbit:queue name="routeKey_wechat" durable="true" auto-delete="false" exclusive="false" />
<rabbit:queue name="routeKey_loginfo" durable="true" auto-delete="false" exclusive="false" />
<!-- 防止生产数据过大,导致消息队列积压,造成磁盘爆满,配置清除策略 -->
<rabbit:queue name="routeKey_analysisLogInfo" durable="true" auto-delete="true" exclusive="false" >
<rabbit:queue-arguments>
<entry key="x-message-ttl">
<value type="java.lang.Integer">60000</value> <!--保留60s内的数据-->
</entry>
<entry key="x-max-priority"> <!--设置消息队列优先级-->
<value type="java.lang.Integer">10</value>
</entry>
</rabbit:queue-arguments>
</rabbit:queue>
•
<!-- 消息接收者 -->
<bean id="messageMqConsumer" class="com.suninfo.rabbitmq.message.MessageMqConsumer"></bean>
<bean id="emailMqConsumer" class="com.suninfo.rabbitmq.email.EmailMqConsumer"></bean>
<bean id="wechatMqConsumer" class="com.suninfo.rabbitmq.wechat.WechatMqConsumer"></bean>
<bean id="loginfoMqConsumer" class="com.suninfo.rabbitmq.loginfo.LoginfoMqConsumer"></bean>
<bean id="analysisLogInfoMqConsumer" class="com.suninfo.rabbitmq.analysisloginfo.AnalysisLogInfoMqConsumer"></bean>
•
<!-- queue litener 观察 监听模式 当有消息到达时会通知监听在对应的队列上的监听对象-->
<rabbit:listener-container connection-factory="connectionFactory" concurrency="1" prefetch="5" acknowledge="none">
<rabbit:listener queues="routeKey_message" ref="messageMqConsumer"/>
<rabbit:listener queues="routeKey_email" ref="emailMqConsumer"/>
<rabbit:listener queues="routeKey_wechat" ref="wechatMqConsumer"/>
<rabbit:listener queues="routeKey_socketio" ref="socketioMqConsumer"/>
</rabbit:listener-container>
•
<rabbit:listener-container connection-factory="connectionFactory" concurrency="20" prefetch="5" acknowledge="none">
<rabbit:listener queues="routeKey_loginfo" ref="loginfoMqConsumer"/>
<rabbit:listener queues="routeKey_analysisLogInfo" ref="analysisLogInfoMqConsumer"/>
</rabbit:listener-container>
</beans>
五 spring整合consumer和producer(spring-rabbitmq-context.xml)
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-4.0.xsd"
default-lazy-init="true">
<!-- 引入属性文件 -->
<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="locations">
<list>
<value>classpath:jdbc.properties</value>
<value>classpath:rabbitmq.properties</value>
</list>
</property>
</bean>
<import resource="spring-mybatis.xml" />
<import resource="spring-rabbitmq-consumer.xml" />
<import resource="spring-rabbitmq-producer.xml" />
•
</beans>
六 producer生产类示例
com.wutongyu.rabbitmq.message;
import org.springframework.amqp.core.AmqpTemplate;
import org.springframework.stereotype.Service;
import java.util.List;
@Service("messageMqProducer")
public class MessageMqProducer {
private AmqpTemplate amqpTemplate;
private String routekey;
public void sendMessage(final List<ShortMessage> messages){
amqpTemplate.convertAndSend(routekey,messages);
}
public AmqpTemplate getAmqpTemplate() { return amqpTemplate; }
public void setAmqpTemplate( AmqpTemplate amqpTemplate ) {this.amqpTemplate = amqpTemplate;}
public String getRoutekey() {return routekey; }
public void setRoutekey( String routekey ) {this.routekey = routekey;}
}
•
public class ShortMessage {
private String accounts;//多个帐号用 | 分隔
private String content;//内容
private LogInfo logInfo;//日志源
private String userName;//接受者uuid
public Integer alarmType;
public String eventUuid;
public String strategyUuid;
//get set方法
}
七 consumer消费类示例
com.wutongyu.rabbitmq.message;
import org.springframework.amqp.core.MessageListener;
public class MessageMqConsumer implements MessageListener {
private static Logger log = LoggerFactory.getLogger( MessageMqConsumer.class );
private static SysConfigService sysConfigService;;
/**
* 接收内容,发送短信
* @param message
*/
@Override
public void onMessage(Message message) {
byte[] body = message.getBody();
String json = new String ( body );
log.debug("接收到消息:"+json);
//获得短信对象
List<ShortMessage> shortMessages = null;
try{
shortMessages = JsonUtil.jsonToList(json, ShortMessage.class);
//处理逻辑
}
}
}
八 通过spring-rabbitmq-context.xml配置文件启动
class RabbitmqTestMain {
private static final Logger log = LoggerFactory.getLogger( ElasticsearchTaskMain.class );
private static LogSourceService logSourceService;
public static void main(String[] args) {
ApplicationContext context =
new ClassPathXmlApplicationContext( "classpath:spring-rabbitmq-context.xml" );
//初始化,封装消费点需要的bean
logSourceService = (LogSourceService)context.getBean( "logSourceService" );
}
}