引入了Java 8 java.time.Clock
,它可以用作许多其他java.time
对象的参数,允许您向它们注入真实或假的时钟.例如,我知道您可以创建一个Clock.fixed()
然后调用Instant.now(clock)
它将返回Instant
您提供的固定.这听起来非常适合单元测试!
但是,我无法弄清楚如何最好地使用它.我有一个类,类似于以下内容:
public class MyClass {
private Clock clock = Clock.systemUTC();
public void method1() {
Instant now = Instant.now(clock);
// Do something with 'now'
}
}
Run Code Online (Sandbox Code Playgroud)
现在,我想对这段代码进行单元测试.我需要能够设置clock
生成固定时间,以便我可以method()
在不同时间进行测试.显然,我可以使用反射将clock
成员设置为特定值,但如果我不必诉诸于反射,那将会很好.我可以创建一个公共setClock()
方法,但这感觉不对.我不想Clock
在方法中添加一个参数,因为真正的代码不应该关注传入时钟.
处理此问题的最佳方法是什么?这是新代码,所以我可以重新组织这个类.
编辑:为了澄清,我需要能够构造一个MyClass
对象,但能够让一个对象看到两个不同的时钟值(就好像它是一个常规的系统时钟一样).因此,我无法将固定时钟传递给构造函数.
使用Java 8 Stream API时,将多个地图调用合并为一个有什么好处,还是不会真正影响性能?
例如:
stream.map(SomeClass::operation1).map(SomeClass::operation2);
Run Code Online (Sandbox Code Playgroud)
与
stream.map(o -> o.operation1().operation2());
Run Code Online (Sandbox Code Playgroud) 我正在使用Elasticsearch 2.1.当我启动系统时,我得到了几个关于无法加载与脚本相关的类的例外.例如,
failed to load mustache
java.lang.ClassNotFoundException: com.github.mustachejava.Mustache
Run Code Online (Sandbox Code Playgroud)
我可以通过在项目中包含这些依赖项来解决此问题,但我没有使用这些脚本语言.有没有办法告诉Elasticsearch禁用它们并防止它抛出异常?
我在 EKS 集群上作为 sidecar 运行 Fluent-bit,以便应用程序跟踪应用程序日志文件并将事件写入 CloudWatch Logs。然后,我通过 CloudWatch Logs Insights 设置一些查询和仪表板来分析这些日志。这一切都很好。
在我能够让这个设置工作之前,我在过去的一周里有一些较旧的日志。在 Fluent-bit tail 输入中,如果发现新文件,它可以选择完全从顶部读取新文件。使用此选项,我能够将较旧的日志加载到与最新日志事件相同的日志组中的 CloudWatch Logs 中。
如果我进入 AWS 控制台并进入我的日志组,我可以看到列出的所有日志流。我可以点击每个事件并查看事件并搜索它们。一切看起来都不错。但是,当我尝试使用 Insights 查询较旧的流时,没有显示任何结果。我已确认我为查询设置了一个应包含事件的时间段。
当我运行此查询时,我没有得到任何结果:
filter @logStream = 'myfile.log'
| fields @timestamp, @message
Run Code Online (Sandbox Code Playgroud)
具有较旧时间戳的日志事件是否不会自动提取到 Insights 中?数据可用之前是否有很长的延迟?我在文档中没有看到任何有关它的内容。
amazon-web-services amazon-cloudwatchlogs aws-cloudwatch-log-insights
我使用RollingFileAppender配置了一个logback,以使用SizeAndTimeBasedFNATP策略翻转到新的日志文件.我将它设置为基于当天或基于大小翻转到新文件.那时,它还会将旧日志压缩为zip文件.
像这样的东西:
<appender name="xyz" class="ch.qos.logback.core.rolling.RollingFileAppender">
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>%d{yyyy/MM/dd}/log.zip</fileNamePattern>
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>100MB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
</rollingPolicy>
</appender>
Run Code Online (Sandbox Code Playgroud)
有没有办法获得logback以在转存时将压缩日志的副本复制到第二个位置?请注意,我希望在原始位置保留一个副本,但将文件复制到第二个位置.(我需要将文件保留在原始位置一段时间,但随后将其删除.复制的文件将无限期保留.)
使用 Elasticsearch 原生 Java 客户端 API ( TransportClient
)的应用程序升级到使用 Java 的高级 REST 客户端的升级路径是什么?
文档(初步?)似乎表明:
Java High Level REST Client 依赖于 Elasticsearch 核心项目。它接受与 TransportClient 相同的请求参数并返回相同的响应对象。
(来源:https : //www.elastic.co/guide/en/elasticsearch/client/java-rest/5.x/java-rest-high.html)
但我并不完全清楚这意味着什么。我是否能够在不重写查询或其他客户端类型操作的情况下将我的整个代码库切换到高级 REST 客户端?REST 客户端似乎没有实现该Client
接口。从脱钩的角度来看,这可能是有道理的。
我需要知道的是我是否应该围绕客户端操作构建自己的抽象,或者是否已经HighLevelRestClient
基本上实现了Client
接口。
我应该暂时继续针对 TransportClient API 编写代码,还是在 TransportClient 被弃用时需要重写所有代码?
请注意,我正在查看高级 REST 客户端,而不是低级 REST 客户端。
java ×3
java-8 ×2
aws-cloudwatch-log-insights ×1
java-stream ×1
java-time ×1
logback ×1
unit-testing ×1