
在传统消息队列(MQ)消费处理场景中,我们通常采用大量 if-else 或 switch-case 结构来根据不同的消息类型执行不同的业务逻辑。
public enum EvaluationEnum {
SURVEY_DATA_GENERATE("XXX", EvaluationUtil::surveyDataGenerate),
PERSONNEL_DATA_GENERATE("XXX", EvaluationUtil::personnelDataGenerate);
private final String desc;
private final Consumer<EvaluationDto> setter;
EvaluationEnum(String desc, Consumer<EvaluationDto> setter) {
this.desc = desc;
this.setter = setter;
}
public Consumer<EvaluationDto> getSetter() {
return setter;
}
}Consumer<EvaluationDto> 函数式接口传入对应处理方法desc 用于前端展示或日志用途@Service("evaluationListener")
public class EvaluationListener implements ChannelAwareMessageListener {
private static final Logger log = LogManager.getLogger(EvaluationListener.class);
@Override
public void onMessage(Message message, Channel channel) throws Exception {
try {
BasQueueTask basQueueTask = JSONObject.parseObject(new String(message.getBody()), BasQueueTask.class);
EvaluationDto evaluationDto = JsonUtil.fromJsonToBean(basQueueTask.getMsgBody().toString(), EvaluationDto.class);
EvaluationEnum.valueOf(basQueueTask.getScene()).getSetter().accept(evaluationDto);
channel.basicAck(message.getMessageProperties().getDeliveryTag(), false);
} catch (Exception e) {
log.error("[EvaluationListener]消息发送异常,已入死信队列。消息内容:{},e:", JsonUtil.toJson(message), e);
channel.basicNack(message.getMessageProperties().getDeliveryTag(), false, false);
}
}
}BasQueueTask basQueueTask = new BasQueueTask();
basQueueTask.setMsgBody(evaluationDto);
basQueueTask.setScene(
evaluationDto.getReportType().equals(ReportManageTypeEnum.SURVEY.getId())
? EvaluationEnum.SURVEY_DATA_GENERATE.name()
: EvaluationEnum.PERSONNEL_DATA_GENERATE.name()
);
rabbitTemplate.convertAndSend(
MsgQueueEnum.RPT_EVALUATION.getExchangeName(),
MsgQueueEnum.RPT_EVALUATION.getQueueName(),
basQueueTask
);接口名 | 参数数量 | 返回值 | 用途 |
|---|---|---|---|
| 1 | 无 | 消费一个输入参数 |
| 2 | 无 | 消费两个输入参数(例如带条件处理) |
Consumer<String> log = System.out::println;
log.accept("Hello World");
BiConsumer<String, Integer> printer = (label, value) ->
System.out.println(label + ": " + value);
printer.accept("数量", 10);✅ 使用枚举组织策略,语义明确
✅ Java 8 函数式接口传递行为,代码更简洁
✅ 解耦发送者与处理者,符合设计原则
✅ 扩展简单,只需添加新的枚举值
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。