spring集成rabbitMQ配置

一 所需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" );
    }
}

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值