在阅读源代码时,我在JDK源代码中偶然发现了这种方法.请注意,声明和初始化v和newValue.我们在这里有"不错"的未定义值,比较中的赋值,"很棒",以及额外的括号以提高可读性.和其他代码闻起来.
default V computeIfAbsent(K key, Function<? super K, ? extends V> mappingFunction) {
Objects.requireNonNull(mappingFunction);
V v;
if ((v = get(key)) == null) {
V newValue;
if ((newValue = mappingFunction.apply(key)) != null) {
put(key, newValue);
return newValue;
}
}
return v;
}
Run Code Online (Sandbox Code Playgroud)
但为什么?以上述方式编写代码是否有任何实际好处,而不是简单(理想情况下是否定v比较):
default V computeIfAbsent(K key, Function<? super K, ? extends V> mappingFunction) {
Objects.requireNonNull(mappingFunction);
V v = get(key);
if (v == null) {
V newValue = mappingFunction.apply(key);
if (newValue != null) {
put(key, …Run Code Online (Sandbox Code Playgroud) 我们的应用程序在 2.0.4 版本中运行。升级到 2.2.2.RELEASE 后,我们看到集成测试失败。我怀疑存在一些错误配置,并且每个集成测试在其自身之后都没有清理干净,或者存在之前不存在的额外初始化。我真的不知道如何正确修复它。
再具体一点。每个测试在单独调用时都有效。当执行所有这些时,我们确实看到如下错误:
org.hibernate.tool.schema.spi.CommandAcceptanceException: Error executing DDL "drop table somewhere.sometable if exists" via JDBC Statement
...
caused by: org.h2.jdbc.JdbcSQLSyntaxErrorException: Cannot drop "SOME_TABLE" because "FKKJEJC7GUX6OTX5NGANQCMN83R, FK7WLRCFA21PY7CI3R4OL1OWODT, FKQPMY4YOVD3D6HBNT0XX92149P, FK1TG6AMM2NSM6UJTO9EJHPJIXY, FKLPTBKDKFCHE72RJ5RRRIH4ORJ" depends on it; SQL statement:
Run Code Online (Sandbox Code Playgroud)
和
2019-12-16 21:11:00.075 org.apache.tomcat.util.modeler.Registry : The MBean registry cannot be disabled because it has already been initialised
Run Code Online (Sandbox Code Playgroud)
这暗示我,我们正在尝试重新初始化已经初始化的东西+休眠初始化中的删除顺序错误。但我真的看不出我们这边有什么问题。让我们展示一些摘录:
测试注释:
@RunWith(SpringRunner.class)
@ActiveProfiles(...)
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
public class SomeIT {
Run Code Online (Sandbox Code Playgroud)
测试通过以下方式执行:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-failsafe-plugin</artifactId>
<version>2.22.2</version>
<configuration>
<useSystemClassLoader>false</useSystemClassLoader>
<forkCount>0</forkCount>
<reuseForks>false</reuseForks>
</configuration>
<executions>
<execution>
<id>integration-test</id>
<goals>
<goal>integration-test</goal>
</goals> …Run Code Online (Sandbox Code Playgroud) 在 intellij IDEA 中,当您有 GIT VCS 时,您可以执行以下操作: -> Git -> Annotate,这会生成git blame.
但由于某种原因,生成的时间戳不尊重 git 设置(至少生成的内容git blame不同),“右键单击注释,->选项->显示提交时间戳”不执行任何操作,而且我没有找到可能性指定这个的格式。
动机:默认格式错过了时间,并使用美国日期格式,这是“由于其愚蠢的著名订单”,抱歉,我的意思是因其愚蠢的订单而闻名,并且总是花费我 10 倍的时间来弄清楚,它是什么日期。
是否有可能有 iso 时间戳?
我已经阅读了整个文档、教程 [1],并在源代码中花费了几个小时,但我仍然不明白如何配置负载均衡器,特别是如果我不使用魔术注释的话。
我有以下配置:
@Configuration
public class AppConfig {
public static final String SERVICE_ID = "service";
@Primary
@Bean
public ServiceInstanceListSupplier serviceInstanceListSupplier() {
return ServiceInstanceListSuppliers.from(SERVICE_ID,
new DefaultServiceInstance(SERVICE_ID + "1", SERVICE_ID, "localhost", 8886, false),
new DefaultServiceInstance(SERVICE_ID + "2", SERVICE_ID, "localhost", 8887, false));
}
@Bean
public LoadBalancerClientFactory loadBalancerClientFactory() {
return new LoadBalancerClientFactory();
}
@Bean
public ReactorLoadBalancerExchangeFilterFunction loadBalancerExchangeFilterFunction(LoadBalancerProperties properties) {
return new ReactorLoadBalancerExchangeFilterFunction(loadBalancerClientFactory(), properties);
}
}
Run Code Online (Sandbox Code Playgroud)
并使用 beanloadBalancerExchangeFilterFunction作为:
WebClient.builder()
.baseUrl("http://service/test-consumer")
.filter(lbFunction)
.build();
Run Code Online (Sandbox Code Playgroud)
它有效。问题是,无论我使用什么主机名,它都可以工作。因此,如果我将主机名“service”替换为我喜欢的任何工作,我仍将向 localhost:8886 或 localhost:8887 发送数据。
有人可以解释一下 serviceId 的作用是什么以及它如何与 DefaultServiceInstance …
我注意到, mvn -U idea:idea 被标记为已退休。
用什么来替代它呢?因为,也许我做错了什么,这是 IDEA IDE 最重要的功能。从每周一次到每天都会发生几次事情,“宇宙就不再有任何意义了”。
构造函数没有被调用,断点没有命中,等等。重新启动/清除缓存/刷新maven项目/我知道的任何东西都没有帮助......
只有提出mvn -U idea:idea问题才能解决这个想法,然后我们就恢复正常了。
问题:
mvn -U idea:idea我们应该使用的替代品?这个问题很可能与可清除缓存之外的某个地方有关,保存旧版本的依赖项并使用它们违反 pom.xml 等。
这在某种程度上可以在外部称为 mvn clean、缓存清除、重新启动...有关如何处理此问题的任何想法也将受到欢迎。
我使用 @EmbeddedKafka 进行了多个集成测试,在迁移到较新的 springboot 版本 2.1.8.RELEASE 后,日志中充满了这些堆栈跟踪。知道是什么原因造成的吗?
javax.management.InstanceAlreadyExistsException: kafka.server:type=app-info,id=0
at com.sun.jmx.mbeanserver.Repository.addMBean(Repository.java:437)
at com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.registerWithRepository(DefaultMBeanServerInterceptor.java:1898)
at com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.registerDynamicMBean(DefaultMBeanServerInterceptor.java:966)
at com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.registerObject(DefaultMBeanServerInterceptor.java:900)
at com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.registerMBean(DefaultMBeanServerInterceptor.java:324)
at com.sun.jmx.mbeanserver.JmxMBeanServer.registerMBean(JmxMBeanServer.java:522)
at org.apache.kafka.common.utils.AppInfoParser.registerAppInfo(AppInfoParser.java:62)
at kafka.server.KafkaServer.startup(KafkaServer.scala:321)
at kafka.utils.TestUtils$.createServer(TestUtils.scala:132)
at kafka.utils.TestUtils.createServer(TestUtils.scala)
at org.springframework.kafka.test.EmbeddedKafkaBroker.afterPropertiesSet(EmbeddedKafkaBroker.java:223)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1837)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1774)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:405)
Run Code Online (Sandbox Code Playgroud) 每次我提取方法时,都会“为我”生成这一行:
@org.jetbrains.annotations.NotNull
Run Code Online (Sandbox Code Playgroud)
围绕方法。1. 我的类路径上没有这个,所以它不能编译 2. 即使我有,我也不希望在我的项目中包含 jetbrains 注释。即使我javax.validation.constraints.NotNull在类路径上有更合适的(可能)注释,intellij 也不会使用那个注释。
问题:
JLS指出,对于数组,“增强的for语句相当于以下形式的基本 for 语句”。但是,如果我检查 JDK8 生成的字节码,对于两种变体都会生成不同的字节码,并且如果我尝试测量性能,令人惊讶的是,增强的字节码似乎给出了更好的结果(在 jdk8 上)...有人可以建议为什么吗? \是吗?我猜这是因为 jmh 测试不正确,所以如果是这样,请建议如何解决这个问题。(我知道 JMH 声明不要使用循环进行测试,但我认为这不适用于此处,因为我实际上是在尝试测量此处的循环)
\n我的 JMH 测试相当简单(可能太简单了),但我无法解释结果。测试JMH代码如下,典型结果为:
\nJdkBenchmarks.enhanced avgt 5 2556.281 \xc2\xb1 31.789 ns/op\nJdkBenchmarks.indexed avgt 5 4032.164 \xc2\xb1 100.121 ns/op\nRun Code Online (Sandbox Code Playgroud)\n这意味着通常增强的 for 循环速度更快,并且其测量比索引循环更准确,因此我们无法解决测量不确定性的差异。原则上,对于使用随机整数初始化的数组或更大的数组,结果相同。
\npublic class JdkBenchmarks {\n\n @Benchmark\n @BenchmarkMode(AverageTime)\n @OutputTimeUnit(NANOSECONDS)\n public void indexed(Blackhole blackhole, TestState testState) {\n int length = testState.values.length;\n for(int i = 0; i < length; i++) {\n blackhole.consume(testState.values[i]);\n }\n }\n\n @Benchmark\n @BenchmarkMode(AverageTime)\n @OutputTimeUnit(NANOSECONDS)\n public void enhanced(Blackhole blackhole, TestState testState) {\n for …Run Code Online (Sandbox Code Playgroud) 我正在使用以下工具
<dependency>
<groupId>tech.allegro.schema.json2avro</groupId>
<artifactId>converter</artifactId>
<version>0.2.7</version>
</dependency>
Run Code Online (Sandbox Code Playgroud)
将 json 转换为 avro,但出现异常
Caused by: org.apache.avro.SchemaParseException: "enum" is not a defined name. The type of the "enumValue" field must be a defined name or a {"type": ...} expression.
at org.apache.avro.Schema.parse(Schema.java:1265)
at org.apache.avro.Schema$Parser.parse(Schema.java:1032)
at org.apache.avro.Schema$Parser.parse(Schema.java:997)
... removed by me, our code ...
Run Code Online (Sandbox Code Playgroud)
对于 avro 架构:
{
"namespace": "test",
"type": "record",
"name": "test",
"fields": [
{
"name": "enumValue",
"type": "enum",
"symbols": [
"val_a",
"val_b"
]
}
]
}
Run Code Online (Sandbox Code Playgroud)
和json:
{
"enumValue": "val_a"
}
Run Code Online (Sandbox Code Playgroud)
依赖树显示 avro …
我遇到了 问题@DataJpaTest,因为由于缺少架构 [1],无法创建表。所以我想,我可以通过在连接字符串中创建模式来欺骗 spring,如下所示:
应用程序属性
spring.datasource.url=jdbc:h2:mem:SCH;MODE=Oracle;DB_CLOSE_DELAY=-1;INIT=create schema if not exists SCH
spring.datasource.username=test
spring.datasource.password=test
Run Code Online (Sandbox Code Playgroud)
无论多么神秘,这都无济于事。为什么?
快速查看测试日志的摘录:
2019-02-13 17:48:12.735 INFO [CCH,,,] 28586 --- [ main] o.s.j.d.e.EmbeddedDatabaseFactory : Starting embedded database: url='jdbc:h2:mem:11247702-6bc4-44b9-be65-9639ebb8d695;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=false', username='sa'
Run Code Online (Sandbox Code Playgroud)
这是因为@DataJpaTest 忽略了 application.properties 中配置的数据源,而是使用自动配置的 h2 数据库
我发现我可以使用,@AutoConfigureTestDatabase(replace = AutoConfigureTestDatabase.Replace.NONE)但这也不起作用并且失败了Unknown host specified。什么主持人???
那么任何想法如何说服@DataJpaTest 使用配置的数据源?
java ×2
avro ×1
h2 ×1
hibernate ×1
jmh ×1
maven ×1
spring ×1
spring-boot ×1
spring-cloud ×1
spring-kafka ×1