当前位置: 首页 > 知识库问答 >
问题:

我如何使HK2 ServiceLocator使用它桥接的ServiceLocator中的单例服务实例?

郑哲彦
2023-03-14

我们正在使用usingextrasUtilities.bridgeServiceLocator()通过将app ServiceLocator桥接到Jersey ServiceLocator中,将在一个ServiceLocator中创建的现有单例应用程序服务注入到Jersey RESTful Web服务中。

然而,存在于“外部”定位器中的单例并没有被使用--每个服务都是在注入到Jersey服务中时再次创建的。单例似乎只在ServiceLocator的范围内可见,即使它是桥接的。

我已经将这个问题提取到一组测试类中,这些测试类说明了下面的观点:

public class BridgedServiceTest
{
  private ServiceLocator _outerServiceLocator;
  private ServiceLocator _innerServiceLocator;

  @Test
  public void testBridgedInnerServiceOK() throws Exception
  {
    ServiceLocatorFactory serviceLocatorFactory = ServiceLocatorFactory.getInstance();

    _outerServiceLocator = serviceLocatorFactory.create("Outer");
    ServiceLocatorUtilities.addClasses(_outerServiceLocator, SingletonServiceImpl.class);

    _innerServiceLocator = serviceLocatorFactory.create("Inner");
    ExtrasUtilities.bridgeServiceLocator(_innerServiceLocator, _outerServiceLocator);

    final Client client1 = new Client();
    _outerServiceLocator.inject(client1);
    assertThat(SingletonServiceImpl.instanceCount.get(), Matchers.is(1));
    client1.test();

    final Client client2 = new Client();
    _innerServiceLocator.inject(client2);
    // next line fails as instance count is 2
    assertThat(SingletonServiceImpl.instanceCount.get(), Matchers.is(1));
    client2.test();
  }

  @After
  public void tearDown() throws Exception
  {
    _innerServiceLocator.shutdown();
    _outerServiceLocator.shutdown();
  }
}

@Contract
public interface SingletonService
{
  void fulfil();
}

@Service
public class SingletonServiceImpl implements SingletonService
{
  public static AtomicInteger instanceCount = new AtomicInteger();

  @PostConstruct
  public void postConstruct()
  {
    instanceCount.incrementAndGet();
  }

  @Override
  public void fulfil()
  {
    System.out.println("Contract Fulfilled.");
  }
}

public class Client
{
  @Inject
  private SingletonService _singletonService;

  public void test()
  {
    _singletonService.fulfil();
  }

  public SingletonService getSingletonService()
  {
    return _singletonService;
  }
}

共有1个答案

秦城
2023-03-14

ServiceLocator桥接器中存在一个已修复的错误。修复将在hk2 2.5.0-B07或更高版本!

 类似资料:
  • 问题内容: 通过将应用程序ServiceLocator桥接到Jersey ServiceLocator,我们正在使用来将在一个ServiceLocator中创建的现有Singleton应用程序服务注入Jersey RESTful Web服务。 但是,没有使用“外部”定位器中存在的Singletons- 将每个服务注入到Jersey服务中后都会再次创建它们。似乎Singleton仅在ServiceL

  • 我有一个java项目,我正试图扩大我的项目,所以想旋转单个微服务的3个实例。 但我有个问题 解释一下 当用户登录时,从用户界面,每10秒一个api请求(针对特定用户)进入后端,该请求给出了Spring批处理作业的状态(对于已登录的特定用户,正在运行或未运行)。这仅适用于1个实例。 但是当我有 3 个实例(实例 1、2 假设10秒的第一个请求到达实例1,并且登录用户的作业正在运行-它返回作业正在运行

  • 这个例子的目的是向您展示如何构建一个预装Riak的docker镜象。 创建Dockerfile 创建一个空文件Dockerfile $ touch Dockerfile 接下来,定义你想要来建立你镜像的父镜像。我们将使用Ubuntu(tag:最新版),从Docker Hub中下载: # Riak # # VERSION 0.1.0 # Use the Ubuntu base ima

  • 本文向大家介绍Python调用服务接口的实例,包括了Python调用服务接口的实例的使用技巧和注意事项,需要的朋友参考一下 如下所示: 运行Python脚本,即可调用相应的接口修改数据库数据。 text.txt中即为参数,以空格分隔 以上这篇Python调用服务接口的实例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持呐喊教程。

  • 背景是: 我想在收到kafka消息时触发websocket客户端。对于两个websocket服务器实例,这会产生一个问题,即kafka分区不必与服务于确切websocket客户端的服务器实例相关联。 Kafka主题中已经填充了具有多个分区的消息。我对重置偏移量和真正的“提交日志作为真相的来源”不感兴趣。对于这种情况,kafka只用于将触发器传递给web套接字客户端 我需要的: 我的意图是绕过同一个

  • 我正在Android Studio中做一个项目,我需要在一个RecyclerView中列出几部电影(在本例中,来自RESTful API的几部意味着20)。现在我已经设置好了所有内容,我的静态虚拟内容显示在使用cardview的recyclerview中。然而,当我切换到RESTful API时,我的真实数据(来自RESTful API)会出现问题。这是我的主要活动。带有手动数据的java代码(显