我正在使用COM4J从我们的第 3 方提供商生成本机 DLL 库的接口。
然后我使用这些接口与我的 Spring Boot 应用程序中所需的服务进行交互。使用一个线程它可以按预期工作,但是当我尝试并行调用 DLL 方法时,com4j 将这些调用排队,而不是以并行方式执行它们。
作为新线程的入口点,我正在使用 Spring Boot 的@Async
注释。
我现在设法通过为每个使用 DLL 本机库的进程创建一个微服务来解决这个问题。但是,我想了解是否有其他解决方法或者我做错了什么。
来自 COM4j API:
对于每个使用 COM 对象的用户线程,都会创建一个 ComThread 来管理这些对象。
这是因为 COM 对象本质上与创建它的线程相关联,因此所有调用都必须通过创建者线程进行路由。有关更多讨论,请参阅 http://msdn.microsoft.com/en-us/library/ms809971.aspx。
这种模型对于 Java 开发人员来说是相当陌生的,因为 Java 开发人员可以更自由地在线程之间传递对象。(这与是否可以安全地同时访问这些对象是一个单独的问题。)
为了弥补这些差距,我们根本不让应用程序线程接触 COM 对象,而是为每个想要创建 COM 对象的应用程序线程创建 ComThread 作为影子线程。