Mq在項目中的利用

消息隊列MQ

經常使用的幾個消息隊列框架和術語

RPC模式:遠程調用過程的簡寫。A經過RPC調用B進行處理,能夠看做一次RPC。java

MQ:A和B之間的消息池。傳統A直接找B,使用MQ後,B將消息放入池子中,A在池子中找消息並處理,處理完畢後不返回結果。服務器

RabbitMQ:app

Redis:框架

ZeroMQ:異步

ActiveMQ:ide

Jafka/Kafka:.net

消息隊列的理解

消息從某一端發出後,首先進入一個容器進行臨時存儲,當達到某種條件後,再由這個容器發送給另外一端。 這個容器的一種具體實現就是==消息隊列==。code

應用場景

異步處理,應用解耦,流量削鋒和消息通信四個場景。對象

消息模式

P2P模式

消息隊列(Queue),發送者(Sender),接收者(Receiver)隊列

Pub/sub模式

主題(Topic),發佈者(Publisher),訂閱者(Subscriber)。

多個發佈者將消息發送到Topic,系統將這些消息傳遞給多個訂閱者。

項目中的mq消息隊列的應用

因爲本項目中須要申請mq服務資源。 經過wiki文檔,可知須要配置哪些資源。 經過Controller層中是這樣發送消息的

是==mqMessageSend()發送消息==。

@RequestMapping("/dept/update")
@ResponseBody
public Result update(UcarAbsDepartment dept) {
    // 參數校驗
    if(null == dept || null == dept.getId()) {
        LOGGER.error("請求數據對象中部門編號不能爲空! ");
        return Result.getBusinessException("請求數據對象中部門編號不能爲空! ", "-1");
    }
    try {
        dept.setModifyTime(new java.util.Date());
        UcarAbsDepMessageProducer.mqMessageSend(dept);
        return Result.getSuccessResult("更新成功");
    } catch (Exception e) {
        LOGGER.error("更新異常", e);
        return Result.getBusinessException("更新異常", "-2");
    }
}

配置metaConsumer.properties

配置好後接受者後,接收者接受消息並處理。

[@Override](https://my.oschina.net/u/1162528)
public void handlerMessage(MessageVO message) {
    try {
        byte[] messageByte = message.getData();
        if(null == messageByte) {
            LOGGER.error("消息Top-->[{}]數據爲空, 請檢查請求數據......", message.getTopic());
            return;
        }
        Object  obj = HessianSerializerUtils.deserialize(messageByte);
        if(obj instanceof UcarAbsDepartment){
            UcarAbsDepartment ucarAbsDepartment = (UcarAbsDepartment)obj;
            LOGGER.info("消息Top-->[{}]獲取消息信息: {}", ucarAbsDepartment.toString());
            // 參數校驗
            if(null == ucarAbsDepartment.getId() ) {
                LOGGER.error("隊列請求數據對象中部門編號不能爲空! ");
                return;
            }
            // 業務數據更新處理)
            UcarAbsDepartmentCacheServiceImpl carAbsDepartmentCacheService = SpringUtil.getBean(UcarAbsDepartmentCacheServiceImpl.class);
            carAbsDepartmentCacheService.putDepartmentToCache(ucarAbsDepartment);
        }
    }catch (Exception e){
        // 不拋出任何異常,避免服務器消息重發
        LOGGER.error("消息Top-->[{}]處理髮生異常......", message.getTopic(), e);
    }
}
相關文章
相關標籤/搜索