监听mq消息(用于监听DTO获取请求参数,结合spring配置)

监听mq消息(用于监听DTO获取请求参数,结合spring配置)

【spring-rabbitmq.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.xsd
        http://www.springframework.org/schema/rabbit http://www.springframework.org/schema/rabbit/spring-rabbit.xsd">

	<!-- 连接服务配置 -->
    <rabbit:connection-factory id="rabbitmqConnectionFactory" host="${rabbitmq.address}" port="${rabbitmq.port}"
                               username="${rabbitmq.username}" password="${rabbitmq.password}"
                               virtual-host="${rabbitmq.vhost}" connection-factory="refConnectionFactory" />

	<bean id="refConnectionFactory" class="com.rabbitmq.client.ConnectionFactory">
		<!-- 设置心跳时间,防止长时间未活动被防火墙杀死,默认600秒,单位:秒 -->
		<property name="requestedHeartbeat" value="240" />
		<!-- 连接超时时间,单位:毫秒 -->
		<property name="connectionTimeout" value="2000" />
	</bean>

	<rabbit:admin connection-factory="rabbitmqConnectionFactory" />

	<!-- queue 队列声明 下发会员交易明细补充信息队列 -->
	<rabbit:queue id="message_receive_mq" name="com.caox.model.mq.ParamsDTO"
				  durable="true" auto-delete="false" exclusive="false" />
	<!-- queue litener 观察监听模式,当有消息到达时会通知监听在对应的队列上的监听对象 -->
	<rabbit:listener-container connection-factory="rabbitmqConnectionFactory" acknowledge="manual"
							   prefetch="0" concurrency="5" max-concurrency="5">

	<rabbit:listener queues="message_receive_mq" ref="messageListener" />
	</rabbit:listener-container>

</beans>

【监听实例,处理逻辑】: 

package com.caox.rabbitmq.listener;

import com.alibaba.fastjson.JSON;
import com.caox.model.mq.ParamsDTO;
import com.caox.rabbitmq.MqManualUtil;
import com.rabbitmq.client.Channel;
import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.core.Message;
import org.springframework.amqp.rabbit.core.ChannelAwareMessageListener;
import org.springframework.stereotype.Component;

/**
 * 监听获取mq消息
 *
 * @author : nazi 2019/01/07
 */
@Slf4j
@Component
public class MessageListener implements ChannelAwareMessageListener {

    @Override
    public void onMessage(Message message, Channel channel) {
        try {
            long startTime = System.currentTimeMillis();
            String msg = new String(message.getBody(), "UTF-8");
            log.info("mq消息队列刷新接受消息 | PARAMS:{}", msg);
            
            // msg 格式必须是jsonStr格式 如:{"message":"javaBean To jsonStr"} 否则 JSON.parseObject报错

            ParamsDTO paramsDTO = JSON.parseObject(msg, ParamsDTO.class);

            log.info("mq消息队列刷新接受消息 | RESULT :{}" ,paramsDTO.getMessage());

            // 手动移除消息
            MqManualUtil.manualRemoveMS(message, channel);
            log.info("mq消息队列刷新接受消息,执行成功,耗时:{}", System.currentTimeMillis()-startTime);
        } catch (Throwable e){
            log.error("mq消息队列刷新接受消息,异常信息:", e);
            // 手动移除消息
            MqManualUtil.manualRemoveMS(message, channel);
        }
    }

}

【javaBean对象】: 

package com.caox.model.mq;

import lombok.Getter;
import lombok.Setter;
import lombok.ToString;

import java.io.Serializable;

/**
 * @author : nazi
 * @version : 1.0
 * @date : 2019/1/7 16:57
 */
@Setter
@Getter
@ToString
public class ParamsDTO implements Serializable {
    /** 消息 */
    private String message;
}

【mq手动工具类】:

package com.caox.rabbitmq;

import com.rabbitmq.client.Channel;
import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.core.Message;

/**
 * MQ手动工具类
 *
 * @author : nazi 2019/01/07
 */
@Slf4j
public class MqManualUtil {

    /**
     * 手动移除消息
     *
     * @param message MQ消息对象
     * @param channel MQ通道对象
     */
    public static void manualRemoveMS(Message message, Channel channel){
        try {
            long startTime = System.currentTimeMillis();
            log.info("手动移除MQ消息开始");
            channel.basicAck(message.getMessageProperties().getDeliveryTag(), false);
            log.info("手动移除MQ消息结束,耗时:{}", System.currentTimeMillis()-startTime);
        } catch (Throwable e) {
            log.error("手动移除MQ消息异常,异常信息:", e);
        }
    }

}

【rabbitmq发送消息 javaBean转jsonStr】:【参考文献】:json与javabean之间的转化

 ParamsDTO paramsDTO = new ParamsDTO();
 paramsDTO.setMessage("javaBean To jsonStr");
 //1、使用JSONObject
 Object json = JSONObject.toJSON(paramsDTO);
 json.toString ==> {"message":"javaBean To jsonStr"}

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值