我这里有一个非常简单的程序:
public static void main(String[] args) {
LocalDate year = LocalDate.ofYearDay(2022, 100);
System.out.println(year);
System.out.println(WeekFields.of(Locale.GERMAN).weekOfYear());
System.out.println(year.with(WeekFields.of(Locale.GERMAN).weekOfYear(), 0));
System.out.println(year.with(WeekFields.of(Locale.GERMAN).weekOfYear(), 0).with(TemporalAdjusters.previousOrSame(DayOfWeek.MONDAY)));
}
Run Code Online (Sandbox Code Playgroud)
但是它在JVM 8和JVM 10上的行为有所不同。问题似乎出在的实现上WeekFields.of(Locale.GERMAN).weekOfYear()。
在JVM 10上,我得到以下结果:
JVM 10
2022-04-10
WeekOfYear[WeekFields[SUNDAY,1]]
2021-12-19
2021-12-13
Run Code Online (Sandbox Code Playgroud)
而在JVM 8上:
JVM 8
2022-04-10
WeekOfYear[WeekFields[MONDAY,4]]
2022-01-02
2021-12-27
Run Code Online (Sandbox Code Playgroud)
为什么会这样呢?我是否正在做某事,可能会导致不确定的行为?还是在某处指定了这种行为变化?
JVM10:
$ java -version
openjdk version "10.0.2" 2018-07-17
OpenJDK Runtime Environment (build 10.0.2+13-Ubuntu-1ubuntu0.18.04.4)
OpenJDK 64-Bit Server VM (build 10.0.2+13-Ubuntu-1ubuntu0.18.04.4, mixed mode)
Run Code Online (Sandbox Code Playgroud)
JVM8
$ java -version
openjdk version "1.8.0_191"
OpenJDK Runtime Environment (build 1.8.0_191-8u191-b12-2ubuntu0.18.04.1-b12)
OpenJDK 64-Bit Server VM (build 25.191-b12, …Run Code Online (Sandbox Code Playgroud) 我正在编写自己的优先级队列/排序列表的实现,我想让它并发.为了让它的线程安全我正在使用lock(someObject),我想验证C#中的互斥体的一些行为.
我的排序列表的内部表示基本上是链接列表head和链接在一起的插槽.就像是:
internal class Slot
{
internal T Value;
internal Slot Next;
public Slot(T value, Slot next = null)
{
Value = value;
Next = next;
}
}
Run Code Online (Sandbox Code Playgroud)
每次我操作head都必须使用lock(someObject)因为线程安全.为了实现ICollection我必须实现的接口public IEnumerator<T> GetEnumerator().在这种方法中,我接受了我的head阅读,因此我应该使用互斥量.
public IEnumerator<T> GetEnumerator()
{
lock (syncLock)
{
var curr = head;
while (curr != null)
{
yield return curr.Value;
curr = curr.Next;
}
}
}
Run Code Online (Sandbox Code Playgroud)
我的问题是:syncLock在枚举器中一直被锁定(因此它会在到达方法结束后解锁)或者在产生值后自动解锁?
这发生在Visual Studio Community 2017最新更新之后.每当我尝试打开我的项目时,我都会收到以下警告:
警告IDE0006加载项目时遇到错误.某些项目功能(例如失败项目的完整解决方案分析和依赖它的项目)已被禁用.Core.Tests
然后,当我运行构建时,我得到:
错误"ResolvePackageFileConflicts"任务意外失败.System.ArgumentException:路径中的非法字符.
位于 Microsoft.NET.Build的Microsoft.NET.Build.Tasks.ItemUtilities.GetTargetPath(ITaskItem项目)的
System.IO.Path.GetFileName(String path)上的System.IO.Path.CheckInvalidPathChars(String path,Boolean checkAdditional) . Microsoft.Build.Tasks.ConflictResolution.ResolvePackageFileConflicts中的Tasks.ItemUtilities.GetReferenceTargetPath(ITaskItem项).<> c. 在Microsoft.NET.Build.Tasks.ConflictResolution.ConflictResolver`1.ResolveConflicts(IEnumerable`1 conflictItems,Func`2 getItemKey,Action`1 foundConflict,Boolean commitWinner,Action`1 unresolvedConflict) 中的<ExecuteCore> b__35_1(ConflictItem ci) Microsoft的Microsoft.Build.BackEnd.TaskExecutionHost.Microsoft.Build.BackEnd.ITaskExecutionHost.Execute() 中的Microsoft.NET.Build.Tasks.TaskBase.Execute() 中的.NET.Build.Tasks.ConflictResolution.ResolvePackageFileConflicts.ExecuteCore().Build.BackEnd.TaskBuilder.<ExecuteInstantiatedTask> d__26.MoveNext()Core.Tests
然后
错误CS0006元数据文件'C:\ tmp\backend\Tests\DataLoader.Tests\bin\Debug\DataLoader.Tests.dll'找不到EResourceConnector.Tests C:\ tmp\backend\Tests\EResourceConnector.Tests\CSC 1活性
项目的路径仅限拉丁字符.在构建服务器上构建正在运行,但是在VS的最后一次更新之后,我的计算机上没有.我试图重新安装VS,但这没有帮助.
那么这个问题是否有任何解决方案或至少暗示?
编辑:我试图排除受此问题影响且有效的文件.但这不是我的问题的解决方案.有趣的是,只有受影响的文件才是单元测试.
编辑2:我尝试使用最新的Visual Studio 2017在新的Windows 10上构建完整的解决方案,但它失败了所以这显然是我的解决方案的问题,但仅限于新版本的VS. 我在Visual Studio 2015上尝试了我的解决方案并且构建工作正常.
无论如何,这里是例如Core.Test.csproj导致该问题的文件之一.https://pastebin.com/kq7MFLV1
我正在开发一个使用Kotlin,Spring Boot,Hibernate(均为最新版本)的项目,我想使其与Spring的WebFlux框架进行交互。
问题是我无法使用,ReactiveCrudRepository因为Web应用程序必须使用Oracle数据库,因此必须使用Hibernate。因此,我想不出一种方法来使用对Oracle SQL数据库的非阻塞访问(仅免费框架)。
我的问题是:
是否可以这样使用:
CrudRepository阻碍Mono服务示例代码:
fun getAllLanguages(): Mono<Collection<ProgrammingLanguage>> = async { repository.findAll() }.asMono()
Run Code Online (Sandbox Code Playgroud)
之后,控制器将具有:
fun listProgrammingLanguagesReactive() = mono(Unconfined) {
service.also { logger.info { "requesting list of programming languages" } }
.getAllLanguages()
.also { logger.info { "responding with list of programming languages" } }
}
Run Code Online (Sandbox Code Playgroud)
这种方法有效,但我不确定它是否始终有效,并且这种做法是否可怕等等。
当使用 http 调用它们时,我想将从X-Request-IdNginx 接收到的信息传播到 k8s 中的其他服务。
现在,我正在使用请求过滤器来捕获该X-Request-Id标头并将其放入 MDC。
final String nginxRequestId = requestContext.getHeaderString("X-Request-Id");
if (nginxRequestId != null) {
MDC.put("infra_request", nginxRequestId);
}
Run Code Online (Sandbox Code Playgroud)
现在,我正在 k8s 内调用服务 B 的端点(因此没有 Nginx 的阻碍),我想获取它X-Request-Id以将其放入请求的标头中。我在这里可以看到两个选项:
我可能会使用 MDC 来完成此操作,但我不确定这是否是最佳实践,或者是否存在一些问题/问题。