消息队列及java for循环异常捕捉处理
1.定时任务查询需要的数据,减少处理的时间,通过消息队列的方式发送出来。
2.接收端接收到数据,然后查询相关的es等,封装数据入库
3.视图层直接查询入库的数据表,供后台管理界面显示
#DEMO CODE
import org.springframework.amqp.core.Message;
import org.springframework.amqp.rabbit.annotation.Exchange;
import org.springframework.amqp.rabbit.annotation.Queue;
import org.springframework.amqp.rabbit.annotation.QueueBinding;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.List;
import java.util.Objects;
@Component
public class DebtListener {
private static final Logger logger = LoggerFactory.getLogger(DebtListener.class);
/**
* MQ接收到的欠款消息同步到ES
* @param message
*/
@RabbitListener(bindings = {@QueueBinding(value = @Queue(value ="队列名称", durable = "true"),
exchange = @Exchange(value = "交换器名称", durable = "true", type = "topic"), key = "路由键名称")
})
public void process(Message message){
try {
String body = new String(message.getBody());
List<DebtMq> DebtMqList = JSONArray.parseArray(body, DebtMq.class);
logger.info("MQ接收到的欠款消息,MessageBody:[{}]", JSON.toJSONString(DebtMqList));
for (DebtMq DebtMq : DebtMqList) {
try {
//查询ES,根据会员号查询ES中的会员信息
//然后将欠款对象封装,入库
//如果在循环中出现某个会员号查询es报错的时候,会导致该批次的循环下面的其他的会员的欠款都会中断。
//所以需要将for循环中的业务处理逻辑块异常捕捉,相互之间互不影响。
} catch (Exception e) {
logger.error("DebtListener处理异常,会员号为:"+DebtMq.getMemNo(),e);
}
}
} catch (Exception e) {
logger.info("MQ接收到的欠款消息存入ES失败:[{}]", e);
}
}
}