浅谈jms 现在在一些并发量比较高的接口 服务,很容易导致系统崩溃
jms 起到了很好的作用 ,
- 削峰平谷,将处理比较慢的逻辑分散开保证主程序不会奔溃
- 异步处理 将要处理的消息 丢到消息队列里面让另外一个程序去写复杂的逻辑 起到了异步处理,
- 还有一些消息队列进行日志处理
- 本文中的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; 这个方法会把消息丢回去 慎用
}
}
- 消息类 封装消息的 可以自己定义
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() {
}
}
- 生成者生产消息
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();
}
}
}
}