1.mysql,怎么删除表中重复的数据(保留一条,并对某字段加上唯一索引
alert ignore table user add UNIQUE index(‘user_id’)
2.rabbitMQ,消费者报异常了该怎么办,如何重试、重发
RabbitMQ默认是自动确认的,也就是消费者消费到消息之后,MQ自动帮我们ACK,然后把队列里的消息删除
所以需要开启手动ACK机制,在你的监听方法上,加入AMQP 信道(Channel),在消费端处理完之后手动去确认。
/**
* 接收消息.
* @param message 代理商信息.
*/
@RabbitHandler
@RabbitListener(queues = {QUEUE})
public void initTemplate(Message message, Channel channel) throws IOException {
try {
InitTemplateConsumer
.AgencyChangeDTO msg =
objectMapper.readValue(message.getBody(), InitTemplateConsumer.AgencyChangeDTO.class);
//操作类型
Integer operateType = msg.getOperateType();
Long parentAgencyId = msg.getParentAgencyId();
//初始化外勤模板条件:一级代理商新增或者二级代理商审核通过
if ((OperateTypeEnum.Add.getValue().equals(operateType)
&& (parentAgencyId == null || parentAgencyId == 0))
|| (OperateTypeEnum.Audit.getValue().equals(operateType) && parentAgencyId != null)) {
templateBiz.init(msg.getAgencyId());
}
} catch (Exception e) {
logger.error("int template error exception is {}", e);
channel.basicReject(message.getMessageProperties().getDeliveryTag(), false);
}
//手动确认
channel.basicAck(message.getMessageProperties().getDeliveryTag(), false);
}
channel.basicAck(deliveryTag, multiple);
consumer处理成功后,通知broker删除队列中的消息,如果设置multiple=true,表示支持批量确认机制以减少网络流量。
例如:有值为5,6,7,8 deliveryTag的投递
如果此时channel.basicAck(8, true);则表示前面未确认的5,6,7投递也一起确认处理完毕。
如果此时channel.basicAck(8, false);则仅表示deliveryTag=8的消息已经成功处理。
channel.basicNack(deliveryTag, multiple, requeue);
consumer处理失败后,例如:有值为5,6,7,8 deliveryTag的投递。
如果channel.basicNack(8, true, true);表示deliveryTag=8之前未确认的消息都处理失败且将这些消息重新放回队列中。
如果channel.basicNack(8, true, false);表示deliveryTag=8之前未确认的消息都处理失败且将这些消息直接丢弃。
如果channel.basicNack(8, false, true);表示deliveryTag=8的消息处理失败且将该消息重新放回队列。
如果channel.basicNack(8, false, false);表示deliveryTag=8的消息处理失败且将该消息直接丢弃。
channel.basicReject(deliveryTag, requeue);
相比channel.basicNack,除了没有multiple批量确认机制之外,其他语义完全一样。
如果channel.basicReject(8, true);表示deliveryTag=8的消息处理失败且将该消息重新放回队列。
如果channel.basicReject(8, false);表示deliveryTag=8的消息处理失败且将该消息直接丢弃。
3.MQ顺序消费问题
4. 为什么阿里不推荐用FixedThreadPool