intellij 提示 java-numbers.iml does not exist Please correct the file content。 如何解决这个问题? 最简单的办法就是删除 .idea 和 target 文件后,重新导入就可以了。 https://www.cwiki.us/questions/57934173/answers/57934176?flashId=-1458442626
intellij 提示 java-numbers.iml does not exist Please correct the file content。 如何解决这个问题? 最简单的办法就是删除 .idea 和 target 文件后,重新导入就可以了。 https://www.cwiki.us/questions/57934173/answers/57934176?flashId=-1458442626
在 UI 界面中,选择 Settings > General。 在弹出的界面中,选择 Visibility, project features, permissions 后面的 Expand 按钮。 然后在弹出的界面中,将 Project Visibility 下面从 Private 选择为 Public。 你的项目就可以被 Public 访问到了。 最后,不要忘记将你的修改保存以便于生效。 https://www.cwiki.us/display/RevisionControl/questions/57934160/gitlab-%e5%a6%82%e4%bd%95%e4%bf%ae%e6%94%b9%e9%a1%b9%e7%9b%ae%e4%bb%8e%e7%a7%81%e6%9c%89%e5%88%b0%e5%85%ac%e6%9c%89
如我们在 域语言(Domain Language)章节中讨论的内容一致,一个 步骤(Step)是一个独立封装了执行顺序的批量作业(Job),并且包含有用于定义和控制一个批量作业的所有独立信息。 针对这个 Step 的定义必然是非常模糊的,因为任何一个给定步骤的内容都会被要求开发人员在编写一个作业(job)的时候被描述。 一个步骤(Step)可以根据开发人员的需求被开发为简单或者复杂。 一个简单的步骤可能就仅仅是从文件中载入数据然后写入到数据库中,可能并不需要太多的代码或者甚至都不需要代码(这个取决你需要的实现)。一个步骤(Step)也可能会比较复杂,这是因为你将要在数据处理的过程中实现一些复杂的业务规则,如下图所示: 图片 1. 步骤(Step) https://www.cwiki.us/display/SpringBatchZH/Configuring+a+Step
在默认情况,如果你对 Spring Batch 不进行配置的话。 Spring Batch 将会对所有存在的作业(Job)进行执行。 考察项目:https://github.com/cwiki-us-spring/cwiki-us-spring-batch-examples 你可以 Check out 到本地后运行: gradlew :service:bootJar 将会对项目进行编译,程序将会输出: C:\WorkDir\Repository\Spring\cwiki-us-spring-guides\cwiki-us-spring-batch-examples>gradlew :service:bootJar > Configure project : You are using one or more deprecated Asciidoctor Gradle plugin features. To help with migration run with --warning-mode=all. Repository https://jcenter.bintray.com/ replaced by https://maven.ossez.com/repository/internal. BUILD SUCCESSFUL in 10s 6 actionable tasks: 2 executed, 4 up-to-date C:\WorkDir\Repository\Spring\cwiki-us-spring-guides\cwiki-us-spring-batch-examples> 然后你可以运行 java -jar service/build/libs/service.jar 你会发现没有作业被执行 程序输出如下: C:\WorkDir\Repository\Spring\cwiki-us-spring-guides\cwiki-us-spring-batch-examples>java -jar service/build/libs/service.jar . ____ _ __ _ _ /\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \ ( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \ \\/ ___)| |_)| | | | | || (_| | ) ) ) ) ' |____| .__|_| |_|_| |_\__, | / / / / =========|_|==============|___/=/_/_/_/ :: Spring Boot :: (v2.1.4.RELEASE) 2020-02-18 15:32:38.016 INFO 28560 --- [ main] com.ossez.batch.service.Application : Starting Application on USWTWNB47141 with PID 28560 (C:\WorkDir\Repository\Spring\cwiki-us-spring-guides\cwiki-us-spring-batch-exam ples\service\build\libs\service.jar started by yhu in C:\WorkDir\Repository\Spring\cwiki-us-spring-guides\cwiki-us-spring-batch-examples) 2020-02-18 15:32:38.023 INFO 28560 --- [ main] com.ossez.batch.service.Application : No active profile set, falling back to default profiles: default 2020-02-18 15:32:40.344 INFO 28560 --- [ main] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Starting... 2020-02-18 15:32:40.353 WARN 28560 --- [ main] com.zaxxer.hikari.util.DriverDataSource : Registered driver with driverClassName=org.hsqldb.jdbcDriver was not found, trying direct instantiation. 2020-02-18 15:32:40.854 INFO 28560 --- [ main] com.zaxxer.hikari.pool.PoolBase : HikariPool-1 - Driver does not support get/set network timeout for connections. (feature not supported) 2020-02-18 15:32:40.866 INFO 28560 --- [ main] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Start completed. 2020-02-18 15:32:42.711 INFO 28560 --- [ main] o.s.b.c.r.s.JobRepositoryFactoryBean : No database type set, using meta data indicating: HSQL 2020-02-18 15:32:43.137 INFO…
Chunk-Oriented Processing不是处理 step 的唯一方法。 考虑下面的一个场景,如果你仅仅需要调用一个存储过程,你可以在 ItemReader 中实现这个调用,然后在存储过程完成调用后返回 null。这种设计看起来不是那么自然也不是非常优美,因为你的批量设计中甚至都不需要实现 ItemWriter。针对这种情况,Spring Batch 为你提供了 TaskletStep 选项。 TaskletStep 是一个简单的接口,这个接口只需要实现一个方法execute,这个方法将会被TaskletStep多次重复的调用,直到这个方法返回 RepeatStatus.FINISHED 或者抛出异常来表示调用失败。 Tasklet 的每一次调用都会包含在事务中(Transaction)。Tasklet 的实现(implementors)可以调用一个存储过程,一个脚本或者一个简单的 SQL 更新脚本。 针对我们的实践中,我们可以使用 Tasklet 来执行一个 FTP 的任务。 将我们产生的中间文件上传到不同的 FTP 服务器上,你可以在实现中指定不同的服务器配置参数,这样更加有利于代码的重用。 为了能够创建一个 TaskletStep,Bean 需要传递一个 tasklet 方法到构造器(builder),这个 tasklet 方法需要实现 Tasklet 接口。 当你构建 TaskletStep 的时候不要调用 chunk。 下面的示例代码显示了一个在 Step build 中构建一个简单的 tasklet。 @Bean public Step step1() { return this.stepBuilderFactory.get("step1") .tasklet(myTasklet()) .build(); } 如果你的 tasklet 实现了 StepListener 接口的话,TaskletStep 将会自动将 tasklet 注册成为一个 StepListener。 TaskletAdapter 与 ItemReader 和 ItemWriter 接口的 adapters一样。Tasklet 接口包含的实现也允许能够通过已经存在的类使用 TaskletAdapter 来将自己进行注册。 例如,你希望使用一个已经存在的 DAO 来更新记录集上的标记的时候,你可以使用 TaskletAdapter 来进行实现。 使用 TaskletAdapter 能够让你的 DAO 可以被 Spring Batch 的 TaskletStep 调用而不需要让你的 DAO 都实现 Tasklet 的接口。 如下面的示例代码: @Bean public MethodInvokingTaskletAdapter myTasklet() { MethodInvokingTaskletAdapter adapter = new MethodInvokingTaskletAdapter(); adapter.setTargetObject(fooDao()); adapter.setTargetMethod("updateFoo"); return adapter; } Tasklet 实现(Implementation)示例 在主批量作业开始之前,可能需要很多其他的批量作业必须完成,这样以便于主批量作业能够获得必要的资源和在完成后释放资源或者进行清理。 例如我们遇到下面的使用场景,一个批量作业需要大量的对文件进行交互和使用,通常来说需要在文件被上传到其他服务器上后删除本地产生的临时文件。 下面的示例就是一个 Tasklet 的实现,这个Tasklet 的实现能够完成上面的交互要求(文件来自 Spring Batch samples project 示例程序)。 public class FileDeletingTasklet implements Tasklet, InitializingBean { private Resource directory; public RepeatStatus execute(StepContribution contribution, ChunkContext chunkContext) throws Exception { File dir = directory.getFile(); Assert.state(dir.isDirectory()); File[] files = dir.listFiles(); for (int i = 0; i < files.length; i++) { boolean deleted = files[i].delete(); if (!deleted) { throw new UnexpectedJobExecutionException("Could not delete file " + files[i].getPath()); } } return RepeatStatus.FINISHED; } public void setDirectoryResource(Resource directory) { this.directory = directory; } public void afterPropertiesSet() throws Exception { Assert.notNull(directory, "directory must be set"); } } Tasklet 处理程序实现了将给定目录中的所有文件进行删除。我们应该通知 execute 方法,这个 Tasklet 应该只被执行一次。 所有相关执行的操作需要在 Step 中进行设置,请参考下面有关这个 Tasklet 的设置: Java 配置 @Bean public Job taskletJob() { return this.jobBuilderFactory.get("taskletJob") .start(deleteFilesInDir()) .build(); } @Bean public Step deleteFilesInDir() { return this.stepBuilderFactory.get("deleteFilesInDir") .tasklet(fileDeletingTasklet()) .build(); } @Bean public FileDeletingTasklet fileDeletingTasklet() { FileDeletingTasklet tasklet = new FileDeletingTasklet(); tasklet.setDirectoryResource(new FileSystemResource("target/test-outputs/test-dir")); return tasklet; } https://www.cwiki.us/display/SpringBatchZH/TaskletStep
Spring 全家桶有没有很方便?啥都给你了。 Java 中的框架用的多的就那么几个,很多框架一般上来说不管有多牛X ,基本上你不一定会用到你的项目中。主要原因是技术选型和可维护,可扩展。 现在开发老的 J2EE 基本上不怎么搞了,多是搞微服务这种的,因为好部署,好延伸,好扩展。 就 Spring 全家桶,吃透了什么都能做好。 数据层:Hibernate 和 Mybatis,Mybatis 感觉比较有优势,Hibernate 有点老,有点笨重了。 持续构建:Maven, Gradle 其他的什么框架呀,日志呀,缓存呀,啥的,你用哪个顺手就用哪个,都差不多。
Java1.5 提供了一个叫varargs的新功能,就是可变长度的参数。 "Varargs"是 “variable number of arguments”的意思。有时候也被简单的称为 “variable arguments”。 定义实参个数可变的方法:只要在一个形参的"类型"与"参数名"之间加上三个连续的"."(即"...",英文里的句中省略号),就可以让它和不确定个实参相匹配。 以下实例创建了 sumvarargs() 方法来统计所有数字的值。 我们在这里的 Main 方法中添加了 new int[]{10, 12, 33, 7} 4 个参数,实际上你可以在这里持续添加不同的参数,在计算 sum 的方法中都可以根据你添加的参数来进行处理。 GIT 请参考 GitHub 上的源码代码: https://github.com/cwiki-us/java-tutorial/blob/master/src/main/java/com/ossez/lang/tutorial/usecases/VarargsCase.java SRC package com.ossez.lang.tutorial.usecases; import org.slf4j.Logger; import org.slf4j.LoggerFactory; /** * variable arguments use case */ public class VarargsCase { private static final Logger logger = LoggerFactory.getLogger(VarargsCase.class); /** * sumVarargs * * @param intArrays * @return */ static int sumVarargs(int... intArrays) { int sum, i; sum = 0; for (i = 0; i < intArrays.length; i++) { sum += intArrays[i]; } return (sum); } /** * Main Function * * @param args */ public static void main(String args[]) { int sum = 0; sum = sumVarargs(new int[]{10, 12, 33, 7}); logger.debug("The Sum of the arrays: {}", sum); } } OUTPUT 程序运行的输出结果为: 2020/01/27 14:33:52 DEBUG [com.ossez.lang.tutorial.usecases.VarargsCase] - The Sum of the arrays: 62
在 GitLab 中有 Forked from。 如何删除这个? 在 Settings 中选择 General 然后选择 Advanced 高级选项 然后单击移除 fork 关系的选项,你就可以将这个关系删除了。 请注意,当你删除这个 Fork 关系后,你将不能继续将你的修改 Merge 到你原来 fork 来的项目中了。 确认你需要删除这个关系。 访问前台页面,确认关系已经从项目中进行删除了。
在默认的情况下 archiva 只分配了 512MB 的内存。 如何增加 archiva 运行的内存大小? Archiva 的配置文件在 Archiva 安装目录下的 conf 目录中的 wrapper.conf 文件 例如路径 : /opt/archiva/conf/wrapper.conf 编辑这个文件的: # Maximum Java Heap Size (in MB) #wrapper.java.maxmemory=64 wrapper.java.maxmemory=1024 参数,指派你期望的值就可以调整 Archiva 的运行内存大小了。 需要注意的是,如果你分配的内存大小过小的话,Archiva 将会在运行的时候崩溃。 这是因为 Archiva 在运行的时候会对下载的 Maven 的 jar 参考进行扫描。在扫描的过程中是比较消耗内存的。 随着你系统下载的 jar 越来越多,你的本地缓存库会越来越大,这会导致 Archiva 的扫描时间越来越长,并且需要的内存也会越来越多。 在这里你需要根据你的实际情况增加 Archiva 使用的内存,我们认为将 Archiva 的使用内存增大到 1 GB 到 2 GB 是合适的。 如果你的机器性能比较好,你可以增加到更多。
apply plugin: 'java' 的插件是否在 Gradle 进行了修改? Source: FAQ 针对 Java 项目,使用 Gradle 3.4+ 在对你项目中进行编译的时候,有关 Java 的插件进行了修改。 针对 library 的项目或者 library 模块的多模块项目中,在 Gradle 推荐你使用 Java-library plugin (插件)来进行编辑。 例如针对的库,你可以使用 apply plugin: 'java-library' 替换 apply plugin: 'java'