标签: java-8

java 8中如何实现异步重试机制?

我正在使用 Java 8 Spring 启动。我有以下方法。

public hello() {
  try {
    // send message
  }
  catch(HttpClientErrorException e) {
     if (e.getRawStatusCode() == 401) {
          // I need to retry the same hello() method for three times as in 10sec, 20sec and 25sec.
     }
  }
}
Run Code Online (Sandbox Code Playgroud)

我需要调用相同的方法三次,以便在遇到 catch 块时重试。我怎样才能异步执行此操作?

我找到了下面的代码,但它不起作用。

@Retryable( value = {RestClientException.class}, maxAttempts = 3, backoff = @Backoff(3000)) 
Run Code Online (Sandbox Code Playgroud)

感谢你的帮助。

asynchronous java-8 spring-retry spring-boot

2
推荐指数
1
解决办法
9563
查看次数

Caffeine 结合了调度程序和执行程序服务

我在以下配置中使用咖啡因:

    Cache<String, String> cache = Caffeine.newBuilder()
                .executor(newWorkStealingPool(15))
                .scheduler(createScheduler())
                .expireAfterWrite(10, TimeUnit.SECONDS)
                .maximumSize(MAXIMUM_CACHE_SIZE)
                .removalListener(this::onRemoval)
                .build();


    private Scheduler createScheduler() {
        return forScheduledExecutorService(newSingleThreadScheduledExecutor());
    }
Run Code Online (Sandbox Code Playgroud)

我是否正确地假设该onRemoval方法将在 ForkJoinPool 上执行newWorkStealingPool(15),并且只会调用调度程序来查找需要驱逐的过期条目?

这意味着它会像这样:

  1. 调用单线程调度程序(每约 1 秒)
  2. 找到所有要驱逐的过期条目
  3. newWorkStealingPool(15)对缓存构建器中的定义中的每个被逐出的条目执行 onRemoval 吗?

我没有找到解释此行为的文档,所以我在这里询问

总氮

java caching java-8 caffeine-cache

2
推荐指数
1
解决办法
3032
查看次数

Map.ofEntries 在使用 containsKey() 检查 NULL 键时给出空指针异常

我之前使用 HashMap 从常量映射中获取键。

在传递NULL 键containsKey(),我常常得到FALSE

为了让代码看起来更漂亮,我尝试了 java-8 。因此,我开始使用 Map.ofEntries来构建我的地图,而不是 HashMap

令人惊讶的是,当将空键传递给方法时,我得到了空指针异常containsKey()

String str = null;

Map<String,String> hashMap = new HashMap<>();
hashMap.put("k1", "v1");
System.out.print(hashMap.containsKey(str)); // This gives false

Map<String,String> ofEntriesMap = Map.ofEntries( Map.entry("k1", "v1")); 
System.out.print(ofEntriesMap.containsKey(str)); // Why this gives Null Pointer Exception ?

Run Code Online (Sandbox Code Playgroud)

我无法弄清楚为什么它的行为有所不同Map.ofEntries

处理这种情况的最佳方法是什么?

java collections nullpointerexception java-8

2
推荐指数
1
解决办法
4138
查看次数

Java 8 Stream过滤给定键列表的映射中的所有值

我有一个Map<String, String>

List<String>我想流式传输I call中的所有值keys

我怎样才能让它从地图返回值?

地图是这样的:

("Frank", "Car")
("Bob", "Bike")
("Jim", "Truck")
Run Code Online (Sandbox Code Playgroud)

我给它的钥匙列表:

["Frank","Jim"]
Run Code Online (Sandbox Code Playgroud)

预期结果:

["Car","Truck"]
Run Code Online (Sandbox Code Playgroud)

我尝试了这个,但它只打印键而不是值。

keys.stream()
    .filter(map::containskey)
    .collect(Collectors.toList())
Run Code Online (Sandbox Code Playgroud)

java java-8 java-stream

2
推荐指数
1
解决办法
4558
查看次数

java 8中BiConsumer接口的使用

我是使用流和函数式接口进行编程的新手,并且在文档中java.util.function.BiConsumer描述了如下方法accept,但尚不清楚

void accept(T t,
            U u)
Performs this operation on the given arguments.
Parameters:
t - the first input argument
u - the second input argument
Run Code Online (Sandbox Code Playgroud)

函数接口可以使用 lamda 表达式来引用,如下所示

BiConsumer<String,String> a=(a,b)->{
 
}
Run Code Online (Sandbox Code Playgroud)

但“此操作在这里到底意味着什么”。提前致谢

java java-8 functional-interface

2
推荐指数
1
解决办法
6510
查看次数

为什么我的 java lambda 表达式无法工作,而其命令式样式却可以正常工作?

我有多年的 Java 8 及其 lambda 经验。但当我开发一个 hello-world 大小的 Spark 程序时,我遇到了一个疯狂的问题。

这里我有一个Java类,其中的Data注释来自Lombok:

@Data
public class Person implements Serializable {
  private String name;
  private Long age;
}
Run Code Online (Sandbox Code Playgroud)

然后我构建了一个包含Persion类对象的 java 列表:

        Person p1 = new Person("sb", 1L);
        Person p2 = new Person("sth", null);
        List<Person> list = new ArrayList<>(2);
        list.add(p1);
        list.add(p2);
Run Code Online (Sandbox Code Playgroud)

到目前为止一切都很好。然后我尝试使用该列表生成 Spark 数据集:

SparkSession session = SparkSession.builder().master("local[1]").appName("SparkSqlApp").getOrCreate();
Encoder<Person> personEncoder = Encoders.bean(Person.class);
Dataset<Person> dataset1 = session.createDataset(list, personEncoder);
dataset1.foreach(new ForeachFunction<Person>() { // 1
            @Override
            public void call(Person person) throws Exception {
                System.out.println(person);
            } …
Run Code Online (Sandbox Code Playgroud)

java lambda jvm java-8 apache-spark-sql

2
推荐指数
1
解决办法
225
查看次数

Gradle 构建失败,并显示“org/eclipse/jgit/storage/file/FileRepositoryBuilder 已由更新版本的 Java 编译”

从今天开始我不能再构建我的项目了。其中没有任何变化。看起来一些 Gradle 依赖项是用 Java 11 重新编译的。我使用的是 Java 8 和 Gradle 4.10。

org/eclipse/jgit/storage/file/FileRepositoryBuilder 已由更新版本的 Java 运行时(类文件版本 55.0)编译,此版本的 Java 运行时仅识别最高版本为 52.0 的类文件

有人有同样的问题吗?

    ./gradlew --version
    
    ------------------------------------------------------------
    Gradle 4.10.3
    ------------------------------------------------------------
    
    Build time:   2018-12-05 00:50:54 UTC
    Revision:     e76905e3a1034e6f724566aeb985621347ff43bc
    
    Kotlin DSL:   1.0-rc-6
    Kotlin:       1.2.61
    Groovy:       2.4.15
    Ant:          Apache Ant(TM) version 1.9.11 compiled on March 23 2018
    JVM:          1.8.0_292 (Private Build 25.292-b10)
    OS:           Linux 4.15.0-142-generic amd64
Run Code Online (Sandbox Code Playgroud)
    echo $JAVA_HOME
    /usr/lib/jvm/java-8-openjdk-amd64/
Run Code Online (Sandbox Code Playgroud)
./gradlew clean

FAILURE: Build failed with an exception.

* What went wrong:
org/eclipse/jgit/storage/file/FileRepositoryBuilder has been compiled by …
Run Code Online (Sandbox Code Playgroud)

gradle java-8

2
推荐指数
1
解决办法
4212
查看次数

无方法签名:java.util.Date.minus() 适用于参数类型:(整数)?

我正在将 grails 2.2 升级到 grails 4.0.10。

在使用 java 7 的 grails 2.2 中,这曾经可以工作

def eanalytics = EventAnalytics.createCriteria().get(){
    eq('event', raceGroup)
    lt('dateCreated', timeService.now())
    gt('dateCreated', timeService.now() - 1)
}
Run Code Online (Sandbox Code Playgroud)

现在对于 grails 4 和 java 8 我收到此异常

Caused by: groovy.lang.MissingMethodException: No signature of method: java.util.Date.minus() is applicable for argument types: (Integer) values: [1]
Possible solutions: find(), find(groovy.lang.Closure), is(java.lang.Object), any(), print(java.io.PrintWriter), use([Ljava.lang.Objec
Run Code Online (Sandbox Code Playgroud)

似乎我无法通过减去 java 8 中迄今为止的天数来获得新日期。执行此操作的等效代码是什么?谢谢您的帮助。

timeservice.now 是

def now(){
        def now = new Date()
        return now
    }
Run Code Online (Sandbox Code Playgroud)

grails java-8 grails-4

2
推荐指数
1
解决办法
2893
查看次数

将列表映射到地图内的 DTO - java

我有这样的集合:Map<Integer, List<MyObject>> collection 我想将整个列表映射MyObjectMyObjectDTO并返回带有映射列表的整个地图。

所以返回将是: Map<Integer, List<MyObjectDto>> collectionWithDtos

最简单、最快的方法是什么?我已经检查了几种使用流的方法,但没有一个产生我预期的结果。谢谢

java collections java-8 java-stream

2
推荐指数
1
解决办法
3408
查看次数

为什么Java接口用javac -g编译的类文件中没有LocalVariableTable?

当Java文件是接口时,如TestInterface.java

public interface TestInterface {

    void method(String parameterName);

}
Run Code Online (Sandbox Code Playgroud)

我用 编译javac -g TestInterface.java,然后用 反汇编javap -v TestInterface,输出如下:

Classfile /private/tmp/TestInterface.class
  Last modified Mar 17, 2022; size 148 bytes
  MD5 checksum da2f58afc0eaf77badc94c90de385198
  Compiled from "TestInterface.java"
public interface TestInterface
  minor version: 0
  major version: 52
  flags: ACC_PUBLIC, ACC_INTERFACE, ACC_ABSTRACT
Constant pool:
  #1 = Class              #7              // TestInterface
  #2 = Class              #8              // java/lang/Object
  #3 = Utf8               method
  #4 = Utf8               (Ljava/lang/String;)V
  #5 = Utf8               SourceFile
  #6 = Utf8 …
Run Code Online (Sandbox Code Playgroud)

java javac java-8

2
推荐指数
2
解决办法
240
查看次数