chinese直男口爆体育生外卖, 99久久er热在这里只有精品99, 又色又爽又黄18禁美女裸身无遮挡, gogogo高清免费观看日本电视,私密按摩师高清版在线,人妻视频毛茸茸,91论坛 兴趣闲谈,欧美 亚洲 精品 8区,国产精品久久久久精品免费

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

記錄一次RPC服務(wù)有損上線的分析過程

京東云 ? 來源:jf_75140285 ? 作者:jf_75140285 ? 2024-07-30 09:58 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

1. 問題背景

某應(yīng)用在啟動完提供JSF服務(wù)后,短時間內(nèi)出現(xiàn)了大量的空指針異常。

分析日志,發(fā)現(xiàn)是服務(wù)依賴的藏經(jīng)閣配置數(shù)據(jù)未加載完成導(dǎo)致。即所謂的有損上線或者是直接發(fā)布,當(dāng)應(yīng)用啟動時,service還沒加載完,就開始對外提供服務(wù),導(dǎo)致失敗調(diào)用

關(guān)鍵代碼如下

數(shù)據(jù)的初始化加載是通過實現(xiàn)CommandLineRunner接口完成的

@Component
public class LoadSystemArgsListener implements CommandLineRunner {

    @Resource
    private CacheLoader cjgConfigCacheLoader;

    @Override
    public void run(String... args) {
        // 加載藏經(jīng)閣配置
        cjgConfigCacheLoader.refresh();

    }
}


cjgConfigCacheLoader.refresh()方法內(nèi)部會將數(shù)據(jù)加載到內(nèi)存中

/** 藏經(jīng)閣配置數(shù)據(jù) key:租戶 value:配置數(shù)據(jù) */
public static Map cjgRuleConfigMap = new HashMap();

如果此時還未加載完數(shù)據(jù),調(diào)用cjgRuleConfigMap.get("301").getXX(),則會報空指針異常

總結(jié)根因:JSF Provider發(fā)布早于服務(wù)依賴的初始化數(shù)據(jù)加載,導(dǎo)致失敗調(diào)用

2. 問題解決

在解決此問題前,我們需要先回憶并熟悉下Spring Boot的啟動過程、JSF服務(wù)的發(fā)布過程

1)Spring Boot的啟動過程(版本2.0.7.RELEASE)

run方法,主要關(guān)注refreshContext(context)刷新上下文

public ConfigurableApplicationContext run(String... args) {
    // 創(chuàng)建 StopWatch 實例:用于計算啟動時間
    StopWatch stopWatch = new StopWatch();
    stopWatch.start();
    ConfigurableApplicationContext context = null;
    Collection exceptionReporters = new ArrayList();
    configureHeadlessProperty();

    // 獲取SpringApplicationRunListeners:這些監(jiān)聽器會在啟動過程的各個階段發(fā)送對應(yīng)的事件
    SpringApplicationRunListeners listeners = getRunListeners(args);
    listeners.starting();
    try {
        ApplicationArguments applicationArguments = new DefaultApplicationArguments(
                args);

        // 創(chuàng)建并配置Environment:包括準(zhǔn)備好對應(yīng)的`Environment`,以及將`application.properties`或`application.yml`中的配置項加載到`Environment`中
        ConfigurableEnvironment environment = prepareEnvironment(listeners,
                applicationArguments);
        configureIgnoreBeanInfo(environment);

        // 打印Banner:如果 spring.main.banner-mode 不為 off,則打印 banner
        Banner printedBanner = printBanner(environment);

        // 創(chuàng)建應(yīng)用上下文:根據(jù)用戶的配置和classpath下的配置,創(chuàng)建合適的`ApplicationContext`
        context = createApplicationContext();
        exceptionReporters = getSpringFactoriesInstances(
                SpringBootExceptionReporter.class,
                new Class[] { ConfigurableApplicationContext.class }, context);

        // 準(zhǔn)備上下文:主要是將`Environment`、`ApplicationArguments`等關(guān)鍵屬性設(shè)置到`ApplicationContext`中,以及加載`ApplicationListener`、`ApplicationRunner`、`CommandLineRunner`等。
        prepareContext(context, environment, listeners, applicationArguments,
                printedBanner);

        // 刷新上下文:這是Spring IoC容器啟動的關(guān)鍵,包括Bean的創(chuàng)建、依賴注入、初始化,發(fā)布事件等
        refreshContext(context);
        afterRefresh(context, applicationArguments);
        stopWatch.stop();
        // 打印啟動信息:如果 spring.main.log-startup-info 為 true,則打印啟動信息
        if (this.logStartupInfo) {
            new StartupInfoLogger(this.mainApplicationClass)
                    .logStarted(getApplicationLog(), stopWatch);
        }
        // 發(fā)布 ApplicationStartedEvent:通知所有的 SpringApplicationRunListeners 應(yīng)用已經(jīng)啟動
        listeners.started(context);
        
        // 調(diào)用 Runner:調(diào)用所有的ApplicationRunner和CommandLineRunner
        callRunners(context, applicationArguments);
    }
    catch (Throwable ex) {
        handleRunFailure(context, ex, exceptionReporters, listeners);
        throw new IllegalStateException(ex);
    }

    try {
        // 運行中:通知所有的 SpringApplicationRunListeners 應(yīng)用正在運行
        listeners.running(context);
    }
    catch (Throwable ex) {
        handleRunFailure(context, ex, exceptionReporters, null);
        throw new IllegalStateException(ex);
    }
    return context;
}

refreshContext(context)內(nèi)部調(diào)用refresh()方法,此方法主要關(guān)注
finishBeanFactoryInitialization(beanFactory) 實例化Bean 早于 finishRefresh() 發(fā)生

public void refresh() throws BeansException, IllegalStateException {
    synchronized (this.startupShutdownMonitor) {
        // 準(zhǔn)備刷新的上下文環(huán)境:設(shè)置啟動日期,激活上下文,清除原有的屬性源
        prepareRefresh();

        // 告訴子類啟動 'refreshBeanFactory()' 方法,創(chuàng)建一個新的bean工廠。
        ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory();

        // 為 BeanFactory 設(shè)置上下文特定的后處理器:主要用于支持@Autowired和@Value注解
        prepareBeanFactory(beanFactory);

        try {
            // 為 BeanFactory 的處理提供在子類中的后處理器。
            postProcessBeanFactory(beanFactory);

            // 調(diào)用所有注冊的 BeanFactoryPostProcessor Bean 的處理方法。
            invokeBeanFactoryPostProcessors(beanFactory);

            // 注冊 BeanPostProcessor 的處理器,攔截 Bean 創(chuàng)建。
            registerBeanPostProcessors(beanFactory);

            // 為此上下文初始化消息源。
            initMessageSource();

            // 為此上下文初始化事件多播器。
            initApplicationEventMulticaster();

            // 在特定的上下文子類中刷新之前的進一步初始化。
            onRefresh();

            // 檢查監(jiān)聽器 Bean 并注冊它們:注冊所有的ApplicationListenerbeans
            registerListeners();

            // 實例化所有剩余的(非延遲初始化)單例。
            finishBeanFactoryInitialization(beanFactory);

            // 完成刷新:發(fā)布ContextRefreshedEvent,啟動所有Lifecyclebeans,初始化所有剩余的單例(lazy-init 單例和非延遲初始化的工廠 beans)。
            finishRefresh();
        }
        ...
    }


實例化Bean中,需熟悉Bean的生命周期(重要)

wKgZomanddCAEkqGAAMW50WLXmA889.jpg

??

2)JSF Provider的發(fā)布過程(版本1.7.5-HOTFIX-T6)


com.jd.jsf.gd.config.spring.ProviderBean調(diào)用方法com.jd.jsf.gd.config.ProviderConfig#export進行發(fā)布

JSF源碼地址:
http://xingyun.jd.com/codingRoot/jsf/jsf-sdk?

public class ProviderBean extends ProviderConfig implements InitializingBean, DisposableBean, ApplicationContextAware, ApplicationListener, BeanNameAware {
    
    // 此處代碼省略...

    public void onApplicationEvent(ApplicationEvent event) {
        if (event instanceof ContextRefreshedEvent && this.isDelay() && !this.exported && !CommonUtils.isUnitTestMode()) {
            LOGGER.info("JSF export provider with beanName {} after spring context refreshed.", this.beanName);
            if (this.delay < -1) {
                Thread thread = new Thread(new Runnable() {
                    public void run() {
                        try {
                            Thread.sleep((long)(-ProviderBean.this.delay));
                        } catch (Throwable var2) {
                        }

                        ProviderBean.this.export();
                    }
                });
                thread.setDaemon(true);
                thread.setName("DelayExportThread");
                thread.start();
            } else {
                this.export();
            }
        }

    }

    private boolean isDelay() {
        return this.supportedApplicationListener && this.delay < 0;
    }

    public void afterPropertiesSet() throws Exception {
        // 此處代碼省略...

        if (!this.isDelay() && !CommonUtils.isUnitTestMode()) {
            LOGGER.info("JSF export provider with beanName {} after properties set.", this.beanName);
            this.export();
        }

    }
}

public synchronized void export() throws InitErrorException {
    if (this.delay > 0) {
        Thread thread = new Thread(new Runnable() {
            public void run() {
                try {
                    Thread.sleep((long)ProviderConfig.this.delay);
                } catch (Throwable var2) {
                }

                ProviderConfig.this.doExport();
            }
        });
        thread.setDaemon(true);
        thread.setName("DelayExportThread");
        thread.start();
    } else {
        this.doExport();
    }

}

可以看出Provider發(fā)布有兩個地方

Ⅰ、Bean的初始化過程(delay>=0)

實現(xiàn)InitializingBean接口,重寫afterPropertiesSet方法。這里會判斷是否延遲發(fā)布,如果大于等于0,則會此處進行發(fā)布。具體在export方法中,當(dāng)delay>0,則會延遲發(fā)布,如配置5000,表示延遲5秒發(fā)布;當(dāng)delay=0,則立即發(fā)布。

Ⅱ、監(jiān)聽ContextRefreshedEvent事件觸發(fā)(delay<0)

實現(xiàn)ApplicationListener接口,重寫onApplicationEvent方法。屬于事件ContextRefreshedEvent,當(dāng)delay<-1,則會延遲發(fā)布,如配置-5000,表示延遲5秒發(fā)布;反之,則立即發(fā)布。

3)解決方案

場景1:XML方式自動發(fā)布Provider(常用)

由上面的介紹,了解到執(zhí)行順序1.Bean初始化 > 2.ContextRefreshedEvent事件觸發(fā) > 3.調(diào)用ApplicationRunner或CommandLineRunner;

上面已經(jīng)知道Provider發(fā)布處于1、2過程,需避免使用方式3進行數(shù)據(jù)的初始化。

前提建議:delay默認(rèn)配置為-1,可以不配置,或者配置負(fù)數(shù)。則JSF Provider發(fā)布則處于過程2,即監(jiān)聽ContextRefreshedEvent事件觸發(fā)

方式1:Bean的初始化過程中

解決方法:使用@PostConstruct注解、實現(xiàn)InitializingBean接口、配置init-method方法均可

@Component
public class DataLoader {

    @PostConstruct
    @Scheduled(cron = "${cron.config}")
    public void loadData() {
        // 數(shù)據(jù)加載
        System.out.println("數(shù)據(jù)加載工作");
    }

}

注意:該Bean如果依賴了其他Bean,需確保依賴Bean已實例化,否則會報空指針異常。

方式2:ContextRefreshedEvent事件觸發(fā)

ContextRefreshedEvent事件是如何發(fā)布的

調(diào)用過程
AbstractApplicationContext#finishRefresh -> AbstractApplicationContext#publishEvent-> SimpleApplicationEventMulticaster#multicastEvent

public void multicastEvent(final ApplicationEvent event, @Nullable ResolvableType eventType) {
   ResolvableType type = (eventType != null ? eventType : resolveDefaultEventType(event));
   for (final ApplicationListener listener : getApplicationListeners(event, type)) {
      Executor executor = getTaskExecutor();
      if (executor != null) {
         executor.execute(() -> invokeListener(listener, event));
      }
      else {
         invokeListener(listener, event);
      }
   }
}


SimpleApplicationEventMulticaster的multicastEvent方法中調(diào)用invokeListener()進行事件發(fā)布getTaskExecutor()默認(rèn)值是null(除自定義設(shè)置Executor對象),所有ApplicationListener實現(xiàn)類串行執(zhí)行onApplicationEvent方法。

getApplicationListeners(event, type)獲取所有的實現(xiàn)類,繼續(xù)向下看內(nèi)部會調(diào)用
AnnotationAwareOrderComparator.sort(allListeners)對所有ApplicationListener進行排序,allListeners 是待排序的對象列表。該方法將根據(jù)對象上的排序注解或接口來確定排序順序,并返回一個按照指定順序排序的對象列表。具體來說,排序的規(guī)則如下:

1.首先,根據(jù)對象上的 @Order 注解的值進行排序。@Order 注解的值越小,排序優(yōu)先級越高

2.如果對象上沒有 @Order 注解,或者多個對象的 @Order 注解值相同,則根據(jù)對象是否實現(xiàn)了 Ordered 接口進行排序。實現(xiàn)了 Ordered 接口的對象,可以通過 getOrder() 方法返回一個排序值。

3.如果對象既沒有 @Order 注解,也沒有實現(xiàn) Ordered 接口,則使用默認(rèn)的排序值 LOWEST_PRECEDENCE(Integer.MAX_VALUE)。特別的:如果BeanA和BeanB排序值都是默認(rèn)值,則保持原順序,即Bean的加載順序

總結(jié):默認(rèn)情況所有ApplicationListener實現(xiàn)類串行執(zhí)行onApplicationEvent方法,而順序取決于
AnnotationAwareOrderComparator.sort(allListeners),@Order 注解的值越小,排序優(yōu)先級越高

解決方法:使用@Order注解保證執(zhí)行順序早于ProviderBean

@Component
@Order(1)
public class DataLoader implements ApplicationListener {
    @Override
    public void onApplicationEvent(ContextRefreshedEvent event) {
        // 數(shù)據(jù)準(zhǔn)備
        System.out.println("初始化工作");
        
    }
}

此外帶有@SpringBootApplication的啟動類中實現(xiàn)也是可以的(在Spring Boot中默認(rèn)使用基于注解的方式進行配置和管理Bean,所以注解定義的Bean會在XML定義的Bean之前被加載)

@SpringBootApplication
public class DemoApplication implements ApplicationListener {

    public static void main(String[] args) {
        SpringApplication.run(DemoApplication.class, args);
    }

    @Override
    public void onApplicationEvent(ContextRefreshedEvent event) {
        System.out.println("初始化工作");
    }
}

場景2:API方式發(fā)布Provider(較少使用)

應(yīng)用啟動完成后,先做初始化動作,完成后再手動發(fā)布Provider。這種就可以通過實現(xiàn)接口ApplicationRunner或接口CommandLineRunner去執(zhí)行初始化。

@Component
public class DataLoader implements ApplicationRunner {

    @Override
    public void run(ApplicationArguments args) throws Exception {
        // 數(shù)據(jù)準(zhǔn)備
        System.out.println("初始化工作");

        // 發(fā)布provider
        // 參考:https://cf.jd.com/pages/viewpage.action?pageId=296129902
    }
}

場景3:XML方式手動發(fā)布(不常用)

provider的dynamic屬性設(shè)置為false

標(biāo)簽

屬性

類型

是否必填

默認(rèn)值

描述

provider

dynamic

boolean

true

是否動態(tài)注冊Provider,默認(rèn)為true,配置為false代表不主動發(fā)布,需要到管理端進行上線操作

3. 總結(jié)

RPC服務(wù)(如JSF、Dubbo)進行優(yōu)雅上線,常用的兩種方式:1、延遲發(fā)布 2、手動發(fā)動

如果你的服務(wù)需要一些初始化操作后才能對外提供服務(wù),如初始化緩存(不限與藏經(jīng)閣、ducc、mysql、甚至調(diào)用其他jsf服務(wù))、redis連接池等相關(guān)資源就位,可以參考本文中介紹的幾種方式。

此文是筆者通過讀取源碼+本地驗證得出的結(jié)論,如有錯誤遺漏或者更好的方案還煩請各位指出共同進步!

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 接口
    +關(guān)注

    關(guān)注

    33

    文章

    9491

    瀏覽量

    156589
  • RPC
    RPC
    +關(guān)注

    關(guān)注

    0

    文章

    113

    瀏覽量

    12227
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關(guān)推薦
    熱點推薦

    如何判斷一次消諧器是否工作正常?

    判斷一次消諧器是否正常,其實就看它有沒有“扛住”系統(tǒng)電壓、及時“泄放”諧振能量,同時自己保持“健康”狀態(tài)。核心方法是?外觀檢查、電氣參數(shù)測試和運行狀態(tài)觀察?三管齊下。
    的頭像 發(fā)表于 01-22 10:27 ?104次閱讀
    如何判斷<b class='flag-5'>一次</b>消諧器是否工作正常?

    光伏一次調(diào)頻設(shè)備/一次調(diào)頻裝置|光伏一次調(diào)頻涉網(wǎng)試驗/光伏電站一次調(diào)頻建設(shè)改造方案

    2025年以來能源局下發(fā)通知要求10KV以上的新能源廠站要具備一次調(diào)頻能力,并遞交涉網(wǎng)試驗報告。對于投資規(guī)模不大的工商業(yè)分布式光伏電站,又要面臨改造投資問題,壓力較大。如何選擇質(zhì)優(yōu)價廉的一次調(diào)頻產(chǎn)品
    的頭像 發(fā)表于 01-17 08:54 ?921次閱讀
    光伏<b class='flag-5'>一次</b>調(diào)頻設(shè)備/<b class='flag-5'>一次</b>調(diào)頻裝置|光伏<b class='flag-5'>一次</b>調(diào)頻涉網(wǎng)試驗/光伏電站<b class='flag-5'>一次</b>調(diào)頻建設(shè)改造方案

    光伏一次調(diào)頻設(shè)備,光伏電站一次調(diào)頻建設(shè)改造方案

    地控制機組有功功率的增減,限制電網(wǎng)頻率變化,使電網(wǎng)頻率維持穩(wěn)定的自動控制過程。當(dāng)電網(wǎng)頻率升高時,一次調(diào)頻功能要求機組快速減少有功功率的輸出,反之,當(dāng)電網(wǎng)頻率下降時,一次調(diào)頻裝置就會減少發(fā)電機組有功功率
    發(fā)表于 01-16 20:06

    一次消諧器對電力系統(tǒng)的核心貢獻

    一次消諧器(又稱 PT 一次消諧裝置)是安裝在電壓互感器一次側(cè)中性點與地之間的非線性電阻設(shè)備,主要應(yīng)用于3-66kV 中性點不接地或經(jīng)消弧線圈接地的中壓配電網(wǎng),對保障電力系統(tǒng)安全穩(wěn)定運行具有不可替代
    的頭像 發(fā)表于 01-07 06:40 ?207次閱讀
    <b class='flag-5'>一次</b>消諧器對電力系統(tǒng)的核心貢獻

    解析一次消諧和二消諧的差異與應(yīng)用場景

    在電力系統(tǒng)中,消諧裝置是保障系統(tǒng)穩(wěn)定運行的關(guān)鍵設(shè)備,它可以有效消除諧振過電壓,避免因諧振引發(fā)的設(shè)備損壞和停電事故。一次消諧器和微機消諧裝置,都可以用于PT柜,保護電壓互感器。 一次消諧器和微機消諧
    的頭像 發(fā)表于 12-11 11:33 ?426次閱讀

    SAA認(rèn)證常見被拒原因分析:如何一次通過審核順利清關(guān)?

    設(shè)計不符合標(biāo)準(zhǔn),最終導(dǎo)致認(rèn)證被駁回或市場抽查不合格。本文結(jié)合2025年最新監(jiān)管趨勢,深入剖析SAA認(rèn)證過程中最常見的被拒原因,并提供針對性解決方案,助您一次通過審
    的頭像 發(fā)表于 11-24 10:46 ?571次閱讀
    SAA認(rèn)證常見被拒原因<b class='flag-5'>分析</b>:如何<b class='flag-5'>一次</b>通過審核順利清關(guān)?

    濕法去膠第一次去不干凈會怎么樣

    在半導(dǎo)體制造過程中,若濕法去膠第一次未能完全去除干凈,可能引發(fā)系列連鎖反應(yīng),對后續(xù)工藝和產(chǎn)品質(zhì)量造成顯著影響。以下是具體后果及分析:殘留物導(dǎo)致后續(xù)工藝缺陷薄膜沉積異常:未清除的光刻膠
    的頭像 發(fā)表于 09-16 13:42 ?510次閱讀
    濕法去膠第<b class='flag-5'>一次</b>去不干凈會怎么樣

    固定式測斜儀多久需要校準(zhǔn)一次?

    在結(jié)構(gòu)物安全監(jiān)測領(lǐng)域,固定式測斜儀的校準(zhǔn)頻率直接影響數(shù)據(jù)可靠性。根據(jù)工程實踐與設(shè)備特性,科學(xué)制定校準(zhǔn)計劃需綜合考量環(huán)境條件、使用強度及工程風(fēng)險等級。那么固定式測斜儀多久需要校準(zhǔn)一次?常規(guī)校準(zhǔn)周期建議
    的頭像 發(fā)表于 08-13 14:47 ?701次閱讀
    固定式測斜儀多久需要校準(zhǔn)<b class='flag-5'>一次</b>?

    智能客服驅(qū)動效率和體驗升級,上海電信+昇騰AI的一次民生應(yīng)用實踐

    上海電信+昇騰AI的一次民生應(yīng)用實踐
    的頭像 發(fā)表于 07-30 23:44 ?2850次閱讀
    智能客服驅(qū)動效率和體驗升級,上海電信+昇騰AI的<b class='flag-5'>一次</b>民生應(yīng)用實踐

    電壓互感器用一次消諧器損壞后更換注意事項及操作步驟

    電壓互感器用一次消諧器損壞后更換注意事項及操作步驟準(zhǔn)備好合適的工具,如扳手、螺絲刀、萬用表等,以及新的消諧器。確保新消諧器的型號、參數(shù)與原設(shè)備匹配。確保消諧器及相關(guān)設(shè)備已經(jīng)停止運行并斷電,以保障操作人員的安全。在更換前,仔細(xì)檢查新消諧器的外觀是否有損壞、變形等情況,確認(rèn)其
    的頭像 發(fā)表于 05-27 10:08 ?823次閱讀
    電壓互感器用<b class='flag-5'>一次</b>消諧器損壞后更換注意事項及操作步驟

    移動電源EMC整改:認(rèn)證失敗到一次通過的實戰(zhàn)經(jīng)驗

    深圳南柯電子|移動電源EMC整改:認(rèn)證失敗到一次通過的實戰(zhàn)經(jīng)驗
    的頭像 發(fā)表于 05-26 11:25 ?698次閱讀
    移動電源EMC整改:認(rèn)證失敗到<b class='flag-5'>一次</b>通過的實戰(zhàn)經(jīng)驗

    充電樁EMC整改:測試失敗到一次過檢的標(biāo)準(zhǔn)化流程設(shè)計

    南柯電子|充電樁EMC整改:測試失敗到一次過檢的標(biāo)準(zhǔn)化流程設(shè)計
    的頭像 發(fā)表于 05-09 11:19 ?918次閱讀

    一次消諧裝置與二消諧裝置區(qū)別、一次消諧器與二消諧器的區(qū)別

    一次消諧器與二消諧器是電力系統(tǒng)中用于抑制諧振過電壓的不同裝置,主要區(qū)別如下: 安裝位置:一次消諧器串聯(lián)于電壓互感器(PT)一次側(cè)中性點與地之間,直接承受高電壓;二
    的頭像 發(fā)表于 05-07 09:58 ?3896次閱讀
    <b class='flag-5'>一次</b>消諧裝置與二<b class='flag-5'>次</b>消諧裝置區(qū)別、<b class='flag-5'>一次</b>消諧器與二<b class='flag-5'>次</b>消諧器的區(qū)別

    請問init_ipc_shm() 是否只初始化一次?

    通過在 S32G A 核上使用 C(或 C)創(chuàng)建多個項目來開發(fā) IPCF 功能時,是init_ipc_shm()允許初始化已配置的共享資源的函數(shù)僅一次在運行時?如果是,系統(tǒng)級別的最佳架構(gòu)建議是什么?我的想法是實現(xiàn)個自啟動服務(wù)
    發(fā)表于 03-25 08:05

    歐度MEDI-SNAP一次性醫(yī)用插頭發(fā)布

    歐度MEDI-SNAP一次性醫(yī)用插頭產(chǎn)品組加入新成員啦!為滿足一次性內(nèi)窺鏡、一次性手術(shù)消融刀等設(shè)備中的耗材需求,歐度將ODU MEDI-SNAP一次性醫(yī)用插頭的鎖定方式擴展為插拔自鎖和
    的頭像 發(fā)表于 02-21 16:00 ?993次閱讀