小编Edd*_*Edd的帖子

跨多个服务器执行单个作业

我设置了多个服务器运行的服务器@Schedule,它运行弹出批处理作业,向用户发送电子邮件.我想确保在多个服务器上只运行此作业的一个实例.

基于这个问题,我已经实现了一些逻辑,看看是否可以仅使用弹簧批来解决这个问题.

为了运行一个作业,我JobRunner使用以下方法创建了一个帮助器类:

public void run(Job job) {
    try {
        jobLauncher.run(job, new JobParameters());
    } catch (JobExecutionAlreadyRunningException e) {

        // Check if job is inactive and stop it if so.
        stopIfInactive(job);

    } catch (JobExecutionException e) {
        ...
    }
}
Run Code Online (Sandbox Code Playgroud)

stopIfInactive方法:

private void stopIfInactive(Job job) {
    for (JobExecution execution : jobExplorer.findRunningJobExecutions(job.getName())) {
        Date createTime = execution.getCreateTime();

        DateTime now = DateTime.now();

        // Get running seconds for more info.
        int seconds = Seconds
                .secondsBetween(new DateTime(createTime), now) …
Run Code Online (Sandbox Code Playgroud)

java spring-integration spring-batch spring-boot

6
推荐指数
1
解决办法
2120
查看次数

静默处理 Gradle 任务失败

我有一个项目,仅当执行任务sonarqube后满足条件时才应运行特定的 Gradle 任务(任务)。build此任务可能会失败,因为它与有时不可用的远程服务器进行通信。如果服务器不可用,我想默默地处理错误并向控制台打印一些消息,而不是使整个构建失败。

目前我可以通过以下配置来做到这一点:

build.doLast {
    if ('desired.value' == System.properties['some.prop']) {
        try {
            tasks.sonarqube.execute()
        } catch(e) {
            ...
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

但是使用这种方法我会收到弃用消息。读了一点之后,我应该不应该使用execute,所以我想出了这个:

if ('desired.value' == System.properties['some.property']) {
    build.finalizedBy sonarqube
}
Run Code Online (Sandbox Code Playgroud)

但是在这种情况下,如果sonarqube任务失败,我的整个构建也会失败。在这种情况下我该如何处理sonarqube任务失败?

我正在使用 Gradle 4.5.1

编辑

使用以下命令运行构建:

./gradlew build
Run Code Online (Sandbox Code Playgroud)

像下面这样修改它会导致 Gradle 不仅忽略sonarqube失败,而且build忽略我不想要的失败:

./gradlew build --continue
Run Code Online (Sandbox Code Playgroud)

gradle sonar-runner build.gradle

6
推荐指数
1
解决办法
3210
查看次数

Spring Boot 具有重复属性的多个数据源

我设置了一个 Spring Web 应用程序,其中有两个数据源,一个是主数据源,一个是辅助数据源。这两个数据源大部分共享除用户名、密码和 url 之外的所有配置属性。随着公共属性列表的不断增长,我想对两个数据源使用公共配置属性,并且仅指定要为辅助数据源和其他数据源覆盖哪些属性。例如,我设置了我的主要数据源 bean,如下所示:

@Bean
@Primary
@ConfigurationProperties(prefix = "spring.datasource")
public DataSource dataSource() {
    return DataSourceBuilder.create().build();
}
Run Code Online (Sandbox Code Playgroud)

在辅助数据源中:

@Value("${spring.secondaryDatasource.url}")
private String databaseUrl;

@Value("${spring.datasource.username}")
private String username;

@Value("${spring.datasource.password}")
private String password;

@Value("${spring.datasource.driver-class-name}")
private String driver;

@Bean
public DataSource secondaryDataSource() {
    return DataSourceBuilder
            .create()
            .url(databaseUrl)
            .username(username)
            .password(password)
            .driverClassName(driver)
            .build();
}
Run Code Online (Sandbox Code Playgroud)

我还设置了一个与我当前设置类似的示例项目: https://github.com/Edvinas01/MultipleDatasources

是否可以注入重复属性(例如驱动程序名称和其他属性),同时仅指定要覆盖的属性?像这样的东西(这不起作用):

@Bean
@ConfigurationProperties(prefix = "spring.datasource") // Inject default properties
public DataSource secondaryDataSource() {
    return DataSourceBuilder
            .create()
            .url(databaseUrl)   // Override url
            .username(username) // Override username
            .password(password) // Override  password …
Run Code Online (Sandbox Code Playgroud)

java spring spring-boot

5
推荐指数
1
解决办法
1万
查看次数

解析包含重复键的json

我正在尝试使用无效结构解析json,该结构具有使用Jackson库的重复键.如果json有重复键,我想将它们作为一个提取Collection.

我正在尝试解析的示例(我正在尝试解析的实际json来自Wiresharkjson export):

{
    "a": "a",
    "a": {
        "b": {

        },
        "b": true
    }
}
Run Code Online (Sandbox Code Playgroud)

但是,由于此json具有重复键,因此仅保留最后一个值:

JsonNode tree = new ObjectMapper().readTree(json);
System.out.println(tree); // {"a":{"b":true}}
Run Code Online (Sandbox Code Playgroud)

我也尝试过GuavaMultimap支持的模块,但它不能像嵌套的json对象那样工作.

我之前展示的json使用Guava模块的示例:

ObjectMapper mapper = new ObjectMapper();
mapper.registerModule(new GuavaModule());
mapper.configure(DeserializationFeature.ACCEPT_SINGLE_VALUE_AS_ARRAY, true);

Multimap read = mapper.readValue(json, Multimap.class);
System.out.println(read); // {a=[a, {b=true}]}
Run Code Online (Sandbox Code Playgroud)

我应该如何使用Jackson库来解决这个问题?是否还有其他库可以支持解析java的这种json结构?

java json jackson

5
推荐指数
1
解决办法
5111
查看次数

获取具有多个VCS根的触发器的拉取请求信息

我有一个TeamCity(版本2017.2.4)项目,其中包含多个配置,这些配置附加到各种GitHub存储库.现在我想为其中一些配置设置SonarQube GitHub插件.为此,我创建了一个新的构建并附加了一个VCS Trigger.为了使这个触发器工作,我还附加了我想要运行的所有VCS根目录.现在,在对这些VCS根进行任何更改之后,将触发构建.

为了使用这个插件,在每次触发后我需要提取受影响的存储库名称并获取拉取请求ID.如果我有一个带有以下脚本的VCS根目录,这很容易做到:

#!/usr/bin/env bash

# Exit script on any command failure.
set -e

# Pass parameter to next TeamCity build step.
param() {
    echo "##teamcity[setParameter name='$1' value='$2']"
}

# Full GitHub repository name.
repository="myOrg/$(echo '%vcsroot.url%' | grep -oP '(?<=\/).*(?=\.git)')"

# Full URL to fetch branch pull request info.
url="https://api.github.com/repos/${repository}/pulls"
url="${url}?head=%teamcity.build.branch%"
url="${url}&access_token=%github.authToken%"

echo "Fetching PR information from: ${url}"
res=$(curl "${url}" -f)

echo "Parsing PR id from:"
echo "${res}"
pullRequest=$(echo "${res}" | grep -oP -m 1 …
Run Code Online (Sandbox Code Playgroud)

git teamcity github sonarqube

5
推荐指数
0
解决办法
148
查看次数