springboot 整合 rocketMQ

浅谈jms 现在在一些并发量比较高的接口 服务,很容易导致系统崩溃
jms 起到了很好的作用 ,

  1. 削峰平谷,将处理比较慢的逻辑分散开保证主程序不会奔溃
  2. 异步处理 将要处理的消息 丢到消息队列里面让另外一个程序去写复杂的逻辑 起到了异步处理,
  3. 还有一些消息队列进行日志处理
  4. 本文中的rocketMQ 在topic 下面还可以定义Tag 更细化了
    这篇文章讲的是rocketMQ,下面直接上代码

1.jar包引入

<dependency>
			<groupId>com.aliyun.openservices</groupId>
			<artifactId>ons-client</artifactId>
			<version>1.7.8.Final</version>
		</dependency>

2.yml 配置

aliyun :
  AccessKeyID : yourKEYID
  AccessKeySecret : yourSecret
  Cid : CID
  Pid : PID
  topic : topic

3.config配置

@Component
public class RocketMqConfig {
    @Value("${aliyun.AccessKeyID}")
    private String accessKeyID;

    @Value("${aliyun.AccessKeySecret}")
    private String accessKeySecret;

    @Value("${aliyun.Cid}")
    private String cid;

    @Value("${aliyun.Pid}")
    private String pid;

    @Value("${aliyun.topic}")
    private String topic;

    @Autowired
    private RocketMqListener myListener;

    @Bean(name="consumerBean",initMethod="start",destroyMethod="shutdown")
    public ConsumerBean createConsumerBean() {
        ConsumerBean consumerBean=new ConsumerBean();
        Properties properties=new Properties();
        properties.setProperty("ConsumerId", cid);
        properties.setProperty("AccessKey", accessKeyID);
        properties.setProperty("SecretKey", accessKeySecret);
        //线程数
        properties.setProperty("ConsumeThreadNums", "50");

        consumerBean.setProperties(properties);
        Map<Subscription, MessageListener> subscriptionTable=new HashMap<Subscription, MessageListener>();
        Subscription subscription=new Subscription();
        subscription.setTopic(topic);
        subscription.setExpression("*");

        subscriptionTable.put(subscription, myListener);
        consumerBean.setSubscriptionTable(subscriptionTable);
        System.out.println("启动成功");
        return consumerBean;
    }

    @Bean(name="producerBean",initMethod="start",destroyMethod="shutdown")
    public ProducerBean getProducerBean() {
        ProducerBean ProducerBean=new ProducerBean();
        Properties properties=new Properties();
        properties.setProperty("ConsumerId", pid);
        properties.setProperty("AccessKey", accessKeyID);
        properties.setProperty("SecretKey", accessKeySecret);
        ProducerBean.setProperties(properties);
        System.out.println("创建ben成功");
        return ProducerBean;
    }

}

4.定义监听类

package com.trilink.common.listenner;

import com.aliyun.openservices.ons.api.Action;
import com.aliyun.openservices.ons.api.ConsumeContext;
import com.aliyun.openservices.ons.api.Message;
import com.aliyun.openservices.ons.api.MessageListener;
import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;
import com.trilink.common.bean.GoodsOrder;
import com.trilink.common.bean.OrderBean;
import com.trilink.common.bean.ReceiveMessageBean;
import com.trilink.common.dao.ghzx.AppUserMapper;
import com.trilink.common.dao.ghzx.OrderPushRecoedMapper;
import com.trilink.common.dao.ghzx.SysCashRecordMapper;
import com.trilink.common.entity.AppUser;
import com.trilink.common.entity.AppUserExample;
import com.trilink.common.entity.OrderPushRecoed;
import com.trilink.common.entity.SysCashRecord;
import com.trilink.common.util.MyException;

import org.apache.commons.lang.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.HashOperations;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;

import java.text.DecimalFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.TimeUnit;

import javax.annotation.Resource;
@Component
public class RocketMqListener implements MessageListener {
	
	
    @Override
    public Action consume(Message message, ConsumeContext context) {
      String json = new String(message.getBody());
            Gson gson = new Gson();
            ReceiveMessageBean receiveMessageBean = gson.fromJson(json, new TypeToken<ReceiveMessageBean>() {
            }.getType());
            String content = receiveMessageBean.getContent();
            if (receiveMessageBean.getMsgType() == 1) {
            /***
            *      这里写逻辑
            */
            
            // return Action.CommitMessage; 这里会将信息消费掉
            //return Action.ReconsumeLater; 这个方法会把消息丢回去  慎用
            }
           }
  1. 消息类 封装消息的 可以自己定义
package com.trilink.common.bean;

import com.google.gson.annotations.SerializedName;

public class ReceiveMessageBean {

    @SerializedName(value = "msg_type")
    private Integer msgType;

    @SerializedName(value = "content")
    private String content;

    public Integer getMsgType() {
        return msgType;
    }

    public void setMsgType(Integer msgType) {
        this.msgType = msgType;
    }

    public String getContent() {
        return content;
    }

    public void setContent(String content) {
        this.content = content;
    }

    public ReceiveMessageBean(Integer msgType, String content) {
        this.msgType = msgType;
        this.content = content;
    }

    public ReceiveMessageBean() {
    }
}
  1. 生成者生产消息
package com.trilink.common.timer;

import java.util.List;

import javax.annotation.Resource;

import org.apache.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import com.aliyun.openservices.ons.api.Message;
import com.aliyun.openservices.ons.api.SendResult;
import com.aliyun.openservices.ons.api.bean.ProducerBean;
import com.aliyun.openservices.ons.api.exception.ONSClientException;
import com.trilink.common.bean.RegisterParamBean;
import com.trilink.common.bean.SendMessageBean;
import com.trilink.common.dao.ghzx.AppUserMapper;
import com.trilink.common.entity.AppUser;
import com.trilink.common.entity.AppUserExample;
import com.trilink.common.service.AppLoginService;
import com.trilink.common.service.SettlementOrderService;
import com.trilink.common.util.JsonUtil;

/**
 * 每天4点的任务
 * @author acer
 *
 */
@Component
public class MessageListen {
	@Autowired
	private SettlementOrderService settlementOrderService;
	@Autowired
	private AppUserMapper appUserMapper;
	private static final Logger logger = Logger.getLogger(AppLoginService.class);
	@Value("${aliyun.topic}")
	private String topic;
	@Resource(name="producerBean")
	private ProducerBean producerBean;
	//每天4点结算
//	@Scheduled(fixedRate = 1000 * 60*10 ,initialDelay = 10*1000)
	@Scheduled(cron="0 0 6 * * ?")
	public void dayTask() {
		AppUserExample example=new AppUserExample();
		AppUserExample.Criteria criteria=example.createCriteria();
		criteria.andActivitiesEqualTo(1);
		List<AppUser> selectByExample = appUserMapper.selectByExample(example);
		for(AppUser app:selectByExample) {
			RegisterParamBean paramBean = new RegisterParamBean(app.getId());
			SendMessageBean messageBean = new SendMessageBean(3, JsonUtil.toJson(paramBean));
			try {
				Thread.sleep(100000l);
			} catch (InterruptedException e1) {
				e1.printStackTrace();
			}
			Message msg=new Message(topic,"TagA", JsonUtil.toJson(messageBean).getBytes());
//				msg.setKey("ORDERID_100");
			try {
				SendResult sendResult =producerBean.send(msg);
				if(sendResult!=null) {
					logger.info(app.getId()+"订单id推送消息成功");
				}
			} catch (ONSClientException e) {
				logger.error(app.getId()+" 订单id推送消息失败");
				e.printStackTrace();
			}
		}
	}
}

猜你喜欢

转载自blog.csdn.net/qq_41684939/article/details/88123064