【Spring云原生】Spring Batch:海量數據高并發任務處理!數據處理縱享新絲滑!事務管理機制+并行處理+實例應用講解

?🎉🎉歡迎光臨🎉🎉

🏅我是蘇澤,一位對技術充滿熱情的探索者和分享者。🚀🚀

🌟特別推薦給大家我的最新專欄《Spring 狂野之旅:從入門到入魔》 🚀

本專欄帶你從Spring入門到入魔!

這是蘇澤的個人主頁可以看到我其他的內容哦👇👇

努力的蘇澤icon-default.png?t=N7T8http://suzee.blog.csdn.net/

本文重點講解原理!如要看批量數據處理的實戰請關注下文(后續補充敬請關注):

實例應用:數據清洗和轉換

使用Spring Batch清洗和轉換數據

實例應用:數據導入和導出

使用Spring Batch導入和導出數據

實例應用:批處理定時任務

使用Spring Batch實現定時任務

目錄

實例應用:數據清洗和轉換

使用Spring Batch清洗和轉換數據

實例應用:數據導入和導出

使用Spring Batch導入和導出數據

實例應用:批處理定時任務

使用Spring Batch實現定時任務

介紹Spring Batch

Spring Batch入門

解析

需求締造:假設我們有一個需求,需要從一個CSV文件中讀取學生信息,對每個學生的成績進行轉換和校驗,并將處理后的學生信息寫入到一個數據庫表中。

數據處理

擴展Spring Batch

自定義讀取器、寫入器和處理器

?與其他Spring項目的集成

與Spring Integration的集成:

與Spring Cloud Task的集成:


介紹Spring Batch

Spring Batch是一個基于Java的開源批處理框架,用于處理大規模、重復性和高可靠性的任務。它提供了一種簡單而強大的方式來處理批處理作業,如數據導入/導出、報表生成、批量處理等。

什么是Spring Batch?

Spring Batch旨在簡化批處理作業的開發和管理。它提供了一種可擴展的模型來定義和執行批處理作業,將作業劃分為多個步驟(Step),每個步驟又由一個或多個任務塊(Chunk)組成。通過使用Spring Batch,可以輕松處理大量的數據和復雜的業務邏輯。

Spring Batch的特點和優勢

  1. 可擴展性和可重用性:Spring Batch采用模塊化的設計,提供了豐富的可擴展性和可重用性。可以根據具體需求自定義作業流程,添加或刪除步驟,靈活地適應不同的批處理場景。

  2. 事務管理:Spring Batch提供了強大的事務管理機制,確保批處理作業的數據一致性和完整性。可以配置事務邊界,使每個步驟或任務塊在單獨的事務中執行,保證了作業的可靠性。

  3. 監控和錯誤處理:Spring Batch提供了全面的監控和錯誤處理機制。可以通過監聽器和回調函數來監控作業的執行情況,處理錯誤和異常情況,以及記錄和報告作業的狀態和指標。

  4. 并行處理:Spring Batch支持并行處理,可以將作業劃分為多個獨立的線程或進程來執行,提高作業的處理速度和效率。

Spring Batch入門

1. 安裝和配置Spring Batch

首先,確保你的Java開發環境已經安裝并配置好。然后,可以使用Maven或Gradle等構建工具來添加Spring Batch的依賴項到你的項目中。詳細的安裝和配置可以參考Spring Batch的官方文檔。

2. 創建第一個批處理作業

在Spring Batch中,一個批處理作業由一個或多個步驟組成,每個步驟又由一個或多個任務塊組成。下面是一個簡單的示例,演示如何創建一個簡單的批處理作業:

@Configuration
@EnableBatchProcessing
public class BatchConfiguration {@Autowiredprivate JobBuilderFactory jobBuilderFactory;@Autowiredprivate StepBuilderFactory stepBuilderFactory;@Beanpublic Step step1() {return stepBuilderFactory.get("step1").tasklet((contribution, chunkContext) -> {System.out.println("Hello, Spring Batch!");return RepeatStatus.FINISHED;}).build();}@Beanpublic Job job(Step step1) {return jobBuilderFactory.get("job").start(step1).build();}
}

解析

首先使用@Configuration@EnableBatchProcessing注解將類標記為Spring Batch的配置類。然后,使用JobBuilderFactoryStepBuilderFactory創建作業和步驟的構建器。在step1方法中,定義了一個簡單的任務塊,打印"Hello, Spring Batch!"并返回RepeatStatus.FINISHED。最后,在job方法中,使用jobBuilderFactory創建一個作業,并將step1作為作業的起始步驟。

3. 理解Job、Step和任務塊

  • Job(作業):作業是一個獨立的批處理任務,由一個或多個步驟組成。它描述了整個批處理過程的流程和順序,并可以有自己的參數和配置。

  • Step(步驟塊):步驟是作業的組成部分,用于執行特定的任務。一個作業可以包含一個或多個步驟,每個步驟都可以定義自己的任務和處理邏輯。

  • 任務塊(Chunk):任務塊是步驟的最小執行單元,用于處理一定量的數據。任務塊將數據分為一塊一塊進行處理,可以定義讀取數據、處理數據和寫入數據的邏輯。

需求締造:
假設我們有一個需求,需要從一個CSV文件中讀取學生信息,對每個學生的成績進行轉換和校驗,并將處理后的學生信息寫入到一個數據庫表中。

數據處理

  • 數據讀取和寫入:Spring Batch提供了多種讀取和寫入數據的方式。可以使用ItemReader讀取數據,例如從數據庫、文件或消息隊列中讀取數據。然后使用ItemWriter將處理后的數據寫入目標,如數據庫表、文件或消息隊列。
    首先,我們需要定義一個數據模型來表示學生信息,例如
    public class Student {private String name;private int score;// Getters and setters// ...
    }

    接下來,我們可以使用Spring Batch提供的FlatFileItemReader來讀取CSV文件中的數據:

    @Bean
    public FlatFileItemReader<Student> studentItemReader() {FlatFileItemReader<Student> reader = new FlatFileItemReader<>();reader.setResource(new ClassPathResource("students.csv"));reader.setLineMapper(new DefaultLineMapper<Student>() {{setLineTokenizer(new DelimitedLineTokenizer() {{setNames(new String[] { "name", "score" });}});setFieldSetMapper(new BeanWrapperFieldSetMapper<Student>() {{setTargetType(Student.class);}});}});return reader;
    }

支持的數據格式和數據源

  • Spring Batch支持各種數據格式和數據源。可以使用適配器和讀寫器來處理不同的數據格式,如CSV、XML、JSON等。同時,可以通過自定義的數據讀取器和寫入器來處理不同的數據源,如關系型數據庫、NoSQL數據庫等。

數據轉換和校驗

  • Spring Batch提供了數據轉換和校驗的機制。可以使用ItemProcessor對讀取的數據進行轉換、過濾和校驗。ItemProcessor可以應用自定義的業務邏輯來處理每個數據項。

    ??我們配置了一個FlatFileItemReader,設置了CSV文件的位置和行映射器,指定了字段分隔符和字段到模型屬性的映射關系。

    接下來,我們可以定義一個ItemProcessor來對讀取的學生信息進行轉換和校驗:

    @Bean
    public ItemProcessor<Student, Student> studentItemProcessor() {return new ItemProcessor<Student, Student>() {@Overridepublic Student process(Student student) throws Exception {// 進行轉換和校驗if (student.getScore() < 0) {// 校驗不通過,拋出異常throw new IllegalArgumentException("Invalid score for student: " + student.getName());}// 轉換操作,例如將分數轉換為百分制int percentage = student.getScore() * 10;student.setScore(percentage);return student;}};
    }
    ?

    ?在上述代碼中,我們定義了一個ItemProcessor,對學生信息進行校驗和轉換。如果學生的分數小于0,則拋出異常;否則,將分數轉換為百分制。

    最后,我們可以使用Spring Batch提供的JdbcBatchItemWriter將處理后的學生信息寫入數據庫:

    @Bean
    public JdbcBatchItemWriter<Student> studentItemWriter(DataSource dataSource) {JdbcBatchItemWriter<Student> writer = new JdbcBatchItemWriter<>();writer.setItemSqlParameterSourceProvider(new BeanPropertyItemSqlParameterSourceProvider<>());writer.setSql("INSERT INTO students (name, score) VALUES (:name, :score)");writer.setDataSource(dataSource);return writer;
    }

作業調度和監控

  • 作業調度器的配置:Spring Batch提供了作業調度器來配置和管理批處理作業的執行。可以使用Spring的調度框架(如Quartz)或操作系統的調度工具(如cron)來調度作業。通過配置作業調度器,可以設置作業的觸發時間、頻率和其他調度參數。
    ?

    在上述代碼中,我們配置了一個JdbcBatchItemWriter,設置了SQL語句和數據源,將處理后的學生信息批量插入數據庫表中。

    最后,我們需要配置一個作業步驟來組裝數據讀取、處理和寫入的過程:

    @Bean
    public Step processStudentStep(ItemReader<Student> reader, ItemProcessor<Student, Student> processor, ItemWriter<Student> writer) {return stepBuilderFactory.get("processStudentStep").<Student, Student>chunk(10).reader(reader).processor(processor).writer(writer).build();
    }

    在上述代碼中,我們使用stepBuilderFactory創建了一個步驟,并指定了數據讀取器、處理器和寫入器。

  • 作業執行的監控和管理:Spring Batch提供了豐富的監控和管理功能。可以使用Spring Batch的管理接口和API來監控作業的執行狀態、進度和性能指標。還可以使用日志記錄、通知和報警機制來及時獲取作業執行的狀態和異常信息。
    ?

    最后,我們可以配置一個作業來調度執行該步驟:

    @Bean
    public Job processStudentJob(JobBuilderFactory jobBuilderFactory, Step processStudentStep) {return jobBuilderFactory.get("processStudentJob").flow(processStudentStep).end().build();
    }

    我們使用jobBuilderFactory創建了一個作業,并指定了步驟來執行。

    通過以上的示例,我們演示了Spring Batch中數據讀取和寫入的方式,使用了FlatFileItemReader讀取CSV文件,使用了JdbcBatchItemWriter將處理后的學生信息寫入數據庫。同時,我們使用了ItemProcessor對讀取的學生信息進行轉換和校驗。這個例子還展示了Spring Batch對不同數據源和數據格式的支持,以及如何配置和組裝作業步驟來完成整個批處理任務。

錯誤處理和重試機制

  • Spring Batch提供了錯誤處理和重試機制,以確保批處理作業的穩定性和可靠性。可以配置策略來處理讀取、處理和寫入過程中的錯誤和異常情況。可以設置重試次數、重試間隔和錯誤處理策略,以適應不同的錯誤場景和需求。
    首先,我們可以在步驟配置中設置錯誤處理策略。例如,我們可以使用SkipPolicy來跳過某些異常,或者使用RetryPolicy來進行重試。
    @Bean
    public Step processStudentStep(ItemReader<Student> reader, ItemProcessor<Student, Student> processor, ItemWriter<Student> writer) {return stepBuilderFactory.get("processStudentStep").<Student, Student>chunk(10).reader(reader).processor(processor).writer(writer).faultTolerant().skip(Exception.class).skipLimit(10).retry(Exception.class).retryLimit(3).build();
    }

    我們使用faultTolerant()方法來啟用錯誤處理策略。然后,使用skip(Exception.class)指定跳過某些異常,使用skipLimit(10)設置跳過的最大次數為10次。同時,使用retry(Exception.class)指定重試某些異常,使用retryLimit(3)設置重試的最大次數為3次。

    在默認情況下,如果發生讀取、處理或寫入過程中的異常,Spring Batch將標記該項為錯誤項,并嘗試跳過或重試,直到達到跳過或重試的次數上限為止。

    此外,您還可以為每個步驟配置錯誤處理器,以定制化處理錯誤項的邏輯。例如,可以使用SkipListener來處理跳過的項,使用RetryListener來處理重試的項。
    ?

    @Bean
    public SkipListener<Student, Student> studentSkipListener() {return new SkipListener<Student, Student>() {@Overridepublic void onSkipInRead(Throwable throwable) {// 處理讀取過程中發生的異常}@Overridepublic void onSkipInWrite(Student student, Throwable throwable) {// 處理寫入過程中發生的異常}@Overridepublic void onSkipInProcess(Student student, Throwable throwable) {// 處理處理過程中發生的異常}};
    }@Bean
    public RetryListener studentRetryListener() {return new RetryListener() {@Overridepublic <T, E extends Throwable> boolean open(RetryContext retryContext, RetryCallback<T, E> retryCallback) {// 在重試之前執行的邏輯return true;}@Overridepublic <T, E extends Throwable> void onError(RetryContext retryContext, RetryCallback<T, E> retryCallback, Throwable throwable) {// 處理重試過程中發生的異常}@Overridepublic <T, E extends Throwable> void close(RetryContext retryContext, RetryCallback<T, E> retryCallback, Throwable throwable) {// 在重試之后執行的邏輯}};
    }@Bean
    public Step processStudentStep(ItemReader<Student> reader, ItemProcessor<Student, Student> processor, ItemWriter<Student> writer,SkipListener<Student, Student> skipListener, RetryListener retryListener) {return stepBuilderFactory.get("processStudentStep").<Student, Student>chunk(10).reader(reader).processor(processor).writer(writer).faultTolerant().skip(Exception.class).skipLimit(10).retry(Exception.class).retryLimit(3).listener(skipListener).listener(retryListener).build();
    }

批處理最佳實踐

  • 數據量控制:在批處理作業中,應注意控制數據量的大小,以避免內存溢出或處理速度過慢的問題。可以通過分塊(Chunk)處理和分頁讀取的方式來控制數據量。

  • 事務管理:在批處理作業中,對于需要保證數據一致性和完整性的操作,應使用適當的事務管理機制。可以配置事務邊界,確保每個步驟或任務塊在獨立的事務中執行。

  • 錯誤處理和日志記錄:合理處理錯誤和異常情況是批處理作業的重要部分。應使用適當的錯誤處理策略、日志記錄和報警機制,以便及時發現和處理問題。

  • 性能調優:在批處理作業中,應關注性能調優的問題。可以通過合理的并行處理、合理配置的線程池和適當的數據讀取和寫入策略來提高作業的處理速度和效率。

  • 監控和管理:對于長時間運行的批處理作業,應設置適當的監控和管理機制。可以使用監控工具、警報系統和自動化任務管理工具來監控作業的執行情況和性能指標。

擴展Spring Batch

自定義讀取器、寫入器和處理器

Spring Batch提供了許多擴展點,可以通過自定義讀取器、寫入器和處理器以及其他組件來擴展和定制批處理作業的功能。

public class MyItemReader implements ItemReader<String> {private List<String> data = Arrays.asList("item1", "item2", "item3");private Iterator<String> iterator = data.iterator();@Overridepublic String read() throws Exception {if (iterator.hasNext()) {return iterator.next();} else {return null;}}
}

自定義寫入器:

public class MyItemWriter implements ItemWriter<String> {@Overridepublic void write(List<? extends String> items) throws Exception {for (String item : items) {// 自定義寫入邏輯}}
}

自定義處理器:

public class MyItemProcessor implements ItemProcessor<String, String> {@Overridepublic String process(String item) throws Exception {// 自定義處理邏輯return item.toUpperCase();}
}

批處理作業的并行處理:

Spring Batch支持將批處理作業劃分為多個獨立的步驟,并通過多線程或分布式處理來實現并行處理。

  1. 多線程處理:可以通過配置TaskExecutor來實現多線程處理。通過使用TaskExecutor,每個步驟可以在獨立的線程中執行,從而實現并行處理。
    @Bean
    public TaskExecutor taskExecutor() {ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();executor.setCorePoolSize(5);executor.setMaxPoolSize(10);executor.setQueueCapacity(25);return executor;
    }@Bean
    public Step myStep(ItemReader<String> reader, ItemProcessor<String, String> processor, ItemWriter<String> writer) {return stepBuilderFactory.get("myStep").<String, String>chunk(10).reader(reader).processor(processor).writer(writer).taskExecutor(taskExecutor()).build();
    }

    在上述代碼中,我們通過taskExecutor()方法定義了一個線程池任務執行器,并將其配置到步驟中的taskExecutor()方法中。

  2. 分布式處理:如果需要更高的并行性和可伸縮性,可以考慮使用分布式處理。Spring Batch提供了與Spring Integration和Spring Cloud Task等項目的集成,以實現分布式部署和處理。

?與其他Spring項目的集成

  1. 與Spring Integration的集成:

首先,需要在Spring Batch作業中配置Spring Integration的消息通道和適配器。可以使用消息通道來發送和接收作業的輸入和輸出數據,使用適配器來與外部系統進行交互。

@Configuration
@EnableBatchProcessing
@EnableIntegration
public class BatchConfiguration {@Autowiredprivate JobBuilderFactory jobBuilderFactory;@Autowiredprivate StepBuilderFactory stepBuilderFactory;@Autowiredprivate MyItemReader reader;@Autowiredprivate MyItemProcessor processor;@Autowiredprivate MyItemWriter writer;@Beanpublic IntegrationFlow myJobFlow() {return IntegrationFlows.from("jobInputChannel").handle(jobLaunchingGateway()).get();}@Beanpublic MessageChannel jobInputChannel() {return new DirectChannel();}@Beanpublic MessageChannel jobOutputChannel() {return new DirectChannel();}@Beanpublic MessageChannel stepInputChannel() {return new DirectChannel();}@Beanpublic MessageChannel stepOutputChannel() {return new DirectChannel();}@Beanpublic JobLaunchingGateway jobLaunchingGateway() {SimpleJobLauncher jobLauncher = new SimpleJobLauncher();jobLauncher.setJobRepository(jobRepository());return new JobLaunchingGateway(jobLauncher);}@Beanpublic JobRepository jobRepository() {// 配置作業存儲庫}@Beanpublic Job myJob() {return jobBuilderFactory.get("myJob").start(step1()).build();}@Beanpublic Step step1() {return stepBuilderFactory.get("step1").<String, String>chunk(10).reader(reader).processor(processor).writer(writer).inputChannel(stepInputChannel()).outputChannel(stepOutputChannel()).build();}
}

在上述代碼中,我們配置了Spring Batch作業的消息通道和適配器。myJobFlow()方法定義了一個整合流程,它從名為jobInputChannel的消息通道接收作業請求,并通過jobLaunchingGateway()方法啟動作業。jobLaunchingGateway()方法創建一個JobLaunchingGateway實例,用于啟動作業。

與Spring Cloud Task的集成:

首先,需要在Spring Batch作業中配置Spring Cloud Task的任務啟動器和任務監聽器。任務啟動器用于啟動和管理分布式任務,任務監聽器用于在任務執行期間執行一些操作。

@Configuration
@EnableBatchProcessing
@EnableTask
public class BatchConfiguration {@Autowiredprivate JobBuilderFactory jobBuilderFactory;@Autowiredprivate StepBuilderFactory stepBuilderFactory;@Autowiredprivate MyItemReader reader;@Autowiredprivate MyItemProcessor processor;@Autowiredprivate MyItemWriter writer;@Beanpublic TaskConfigurer taskConfigurer() {return new DefaultTaskConfigurer();}@Beanpublic TaskExecutor taskExecutor() {return new SimpleAsyncTaskExecutor();}@Beanpublic Job myJob() {return jobBuilderFactory.get("myJob").start(step1()).build();}@Beanpublic Step step1() {return stepBuilderFactory.get("step1").<String, String>chunk(10).reader(reader).processor(processor).writer(writer).taskExecutor(taskExecutor()).build();}@Beanpublic TaskListener myTaskListener() {return new MyTaskListener();}@Beanpublic TaskExecutionListener myTaskExecutionListener() {return new MyTaskExecutionListener();}
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/718795.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/718795.shtml
英文地址,請注明出處:http://en.pswp.cn/news/718795.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

不知道RAID/SAN/NAS的小可愛來看看這個吧!

RAID RAID&#xff08;冗余陣列的獨立磁盤&#xff0c;Redundant Array of Independent Disks&#xff09;是一種將多個磁盤驅動器組合成一個或多個單元的技術&#xff0c;目的是在提高數據可靠性和/或提升性能的同時&#xff0c;對操作系統隱藏底層的復雜性。簡而言之&#x…

Windows Server 2012 R2 安裝 OpenSSH

1.下載OpenSSH https://github.com/PowerShell/Win32-OpenSSH/releases 2.解壓到路徑 &#xff08;一定解壓到這個路徑&#xff09;&#xff1a;C:\Program Files\OpenSSH 3.OpenSSH安裝 使用管理員身份打開命令提示符&#xff0c;使用cd命令到步驟2中OpenSSH文件夾的位置&am…

數據庫之間數據遷移工具datax

簡介 DataX 是阿里云 DataWorks數據集成 的開源版本&#xff0c;在阿里巴巴集團內被廣泛使用的離線數據同步工具/平臺。DataX 實現了包括 MySQL、Oracle、OceanBase、SqlServer、Postgre、HDFS、Hive、ADS、HBase、TableStore(OTS)、MaxCompute(ODPS)、Hologres、DRDS, databe…

解決ODOO12 恢復數據庫提示內存不夠報錯

1. 現象 點擊 ‘restore database’ 控制臺報錯&#xff1a; 2. 解決措施 a. 進入啟動腳本的文件夾 cd odoo/odoo-12.0/輸入命令 ./odoo-bin --addons-pathaddons --databaseodoo --db_userodoo --db_passwordodoo --db_hostlocalhost --db_port5432 -i INITb. 刷新頁面…

達夢數據庫基礎操作(五): 索引操作

達夢數據庫基礎操作(五)&#xff1a; 索引操作 1. 索引操作 1.1 創建索引 # 使用 CREATE INDEX 語句創建普通索引。 CREATE INDEX ind_emp_salary ON employee(salary);1.2 查看創建的索引 # 通過字典表 user_indexes 查看已創建索引的名稱、類型。SELECT table_name, index…

CentOS部署FastDFS+Nginx并實現遠程訪問本地服務器中文件

文章目錄 前言1. 本地搭建FastDFS文件系統1.1 環境安裝1.2 安裝libfastcommon1.3 安裝FastDFS1.4 配置Tracker1.5 配置Storage1.6 測試上傳下載1.7 與Nginx整合1.8 安裝Nginx1.9 配置Nginx 2. 局域網測試訪問FastDFS3. 安裝cpolar內網穿透4. 配置公網訪問地址5. 固定公網地址5.…

CHI協議學習

原始文檔&#xff1a;https://developer.arm.com/documentation/102407/0100/?langen CHI 總線拓撲結構 CHI總線拓撲是實現自定義的&#xff0c;可以是RING/MESH/CROSSBAR的類型&#xff1b; RING 一般適用于中等規模芯片MESH 一般適用于大規模芯片CROSSBAR 一般適用于小規模…

中科數安 | 公司文檔數據如何才能防止他人泄密?

為了防止公司文檔數據被他人泄密&#xff0c;中科數安提供了一系列綜合性的解決方案和服務。 www.weaem.com 以下是一些關鍵策略和措施&#xff1a; 訪問控制&#xff1a;首先&#xff0c;實施嚴格的文件訪問控制是至關重要的。中科數安提供身份驗證和權限管理系統&#xff0c…

hnust 湖南科技大學 2022 數據挖掘課設 完整代碼+報告+圖源文件+指導書

hnust 湖南科技大學 2022 數據挖掘課設 完整代碼報告圖源文件指導書 目錄 實驗一 Apriori算法設計與應用 - 1 - 一、 背景介紹 - 1 - 二、 實驗內容 - 1 - 三、 實驗結果與分析 - 2 - 四、 小結與心得體會 - 3 - 實驗二 KNN算法設計與應用 - 4 - 一、 背景介紹 - 4 - 二、 實…

解鎖智慧之門:自然語言處理與神奇的語言模型

在數字化浪潮席卷全球的今天,自然語言處理(NLP)已成為人工智能領域最璀璨的明珠之一。而在這顆明珠中,語言模型(LM)更是閃耀著奪目的光芒。它們不僅讓機器能夠理解和生成人類的語言,更在智能助手、搜索引擎、翻譯工具等眾多應用中發揮著不可或缺的作用。今天,就讓我們一…

SAP VT01N創建Shipment Number

調用BAPI:BAPI_SHIPMENT_CREATE創建裝運單本身很簡單&#xff0c;但是如果是第一次使用的話&#xff0c;可能會對抬頭的一些日期感到困惑 BAPI_SHIPMENT_CREATE抬頭日期字段處理代碼&#xff1a;Include程序&#xff1a;LV56I_BAPIHEA&#xff0c;子程序&#xff1a;set_heade…

論如何采用神秘顧客工具提升營業廳的服務質量?

神秘顧客工具能進一步提升營業廳的服務質量&#xff0c;對于這方面深圳神秘顧客&#xff08;SMS&#xff09;公司有以下建議&#xff1a; 1、建立顧客反饋機制&#xff1a;除了神秘顧客的反饋外&#xff0c;營業廳還可以建立其他顧客反饋渠道&#xff0c;如在線調查、顧客滿意…

大數據面試經驗分享

隨著大數據技術的快速發展&#xff0c;大數據相關職位的需求也日益增長。對于想要進入大數據領域的求職者來說&#xff0c;面試是通往理想職位的重要一關。下面我將分享一些大數據面試的經驗&#xff0c;希望能夠幫助大家在面試中脫穎而出。 一、面試前準備 了解公司背景和業…

(已解決)emoji及其特殊符號在vue中的使用

問題敘述 使用問題&#xff1a;在表情庫中點擊后無法展示對應的emoji表情&#xff0c;僅僅顯示Unicode代碼編號&#xff0c;按照vue eslint規則更改添加分號后&#xff0c;沒有報錯但是依舊無法正確渲染。 問題源碼&#xff1a; <template><div><!-- 被點擊的…

Git Bash中安裝tree

文章目錄 問題描述解決辦法A備選辦法BRef 問題描述 在Git Bash中使用tree報錯&#xff1a; tree # bash: tree: command not found解決辦法A 下載二進制文件&#xff1a; https://gnuwin32.sourceforge.net/packages/tree.htm -> 選binary。下載后解壓.zip 把解壓后的tre…

全新攻擊面管理平臺

首頁大屏 內測階段&#xff0c;免費試用一個月 有興趣體驗的師傅&#xff0c;來長亭云圖極速版群里找我 py

AI通識教育:可能是我們領先于世界AI的關鍵

在人工智能時代&#xff0c;要想在全球AI競爭中占據一席之地&#xff0c;擺脫對外部先進機構如OpenAI的依賴&#xff0c;減少對英偉達等公司在GPU等硬件技術上的制約&#xff0c;以及盡快縮小與世界最前沿AI技術水平之間的差距&#xff0c;這是一項艱巨而又緊迫的任務。 實現這…

如何保證 HTTPS 證書的有效性?

隨著互聯網的蓬勃發展&#xff0c;保障用戶在網絡上的隱私和安全成為至關重要的任務。HTTPS證書&#xff0c;作為一種安全套接字層協議&#xff0c;扮演著網站安全的守護者。 1. 什么是HTTPS 證書&#xff1f; HTTPS&#xff08;HyperText Transfer Protocol Secure&#xff…

vue 安裝各種問題

新下載了個項目模板&#xff0c;安裝包就遇到了各種各樣問題 電腦&#xff1a;mac 使用npm i 等命令一直安裝項目&#xff0c;然后一直報錯 2534 info run canvas2.11.2 install node_modules/canvas node-pre-gyp install --fallback-to-build --update-binary 2535 info r…

vscode + visual studio keymap插件

備注&#xff1a;主要推薦代碼遞歸折疊代碼展開單個函數折疊單個代碼展開。原因&#xff1a;vscode中的visual studio keymap插件對于代碼折疊支持不充分&#xff0c;查看大型項目時不方便。 一、個人快捷鍵推薦 1、前進&#xff1a;ctrl shift - 2、回退&#xff1a;ctrl…