小编Luk*_*s F的帖子

WeekField在JVM 8和JVM 10上的不同行为

我这里有一个非常简单的程序:

 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)

java jvm java-8 java-10 localdate

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

并发集合枚举器

我正在编写自己的优先级队列/排序列表的实现,我想让它并发.为了让它的线程安全我正在使用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在枚举器中一直被锁定(因此它会在到达方法结束后解锁)或者在产生值后自动解锁?

.net c#

7
推荐指数
1
解决办法
227
查看次数

Visual Studio-路径中的非法字符

这发生在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

ScreenShot来自这个项目的错误.

c# visual-studio visual-studio-2017

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

WebFlux和Kotlin在没有ReactiveCrud存储库的情况下

我正在开发一个使用Kotlin,Spring Boot,Hibernate(均为最新版本)的项目,我想使其与Spring的WebFlux框架进行交互。

问题是我无法使用,ReactiveCrudRepository因为Web应用程序必须使用Oracle数据库,因此必须使用Hibernate。因此,我想不出一种方法来使用对Oracle SQL数据库的非阻塞访问(仅免费框架)。

我的问题是:

是否可以这样使用:

  • 休闲CrudRepository阻碍
  • 使用corountines并返回所有内容的服务 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)

这种方法有效,但我不确定它是否始终有效,并且这种做法是否可怕等等。

kotlin reactive spring-webflux kotlinx.coroutines

4
推荐指数
1
解决办法
440
查看次数

使用 MDC 或 Threadlocal

当使用 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以将其放入请求的标头中。我在这里可以看到两个选项:

  1. 只需从 MDC 获取该值即可
  2. 除了将该标头存储在 MDC 中之外,还将该标头存储在线程局部变量中(因为该服务正在使用 Dropwizard)

我可能会使用 MDC 来完成此操作,但我不确定这是否是最佳实践,或者是否存在一些问题/问题。

java thread-local mdc dropwizard

4
推荐指数
1
解决办法
6027
查看次数