如何为SPI编写客户端代理以及客户端和服务器代理之间的区别是什么?

时间:2015-06-15 07:30:07

标签: hazelcast

我已经开发了基于Hazelcast IdGenerator类的自己的idGenerator(将每个last_used_id存储到db中)。现在我想将hazelcast集群作为单个java应用程序运行,并将我的web应用程序作为其他应用程序运行(Web应用程序重启不应该将id值移动到下一个块)。我将MyIdGeneratorProxyMyIdGeneratorService移动到新应用程序,运行它,将web应用程序作为hazelcast-client运行并获取

IllegalArgumentException: No factory registered for service: ecs:impl:idGeneratorService

当客户端和服务器是同一个应用程序时,没关系。

如果没有clientProxy,它似乎无法处理。我比较了IdGeneratorProxyClientIdGeneratorProxy,看起来一样。这个想法是什么?如何为服务编写客户端代理?我还没有找到任何文档。调查方向是否正确?我认为可以将hazelcast内部服务(如id生成器服务)和我的业务流程分开。我应该在我的网络应用程序中存储自定义ClientProxy(用于自定义spi)吗?

1 个答案:

答案 0 :(得分:1)

这是一个演示如何创建客户端代理,缺少部分CustomClientProxy函数调用,退出复杂(更像是服务器代理,这里称为ReadRequest,服务器被称为{{ 1}}),您可以找到AtomicLong implement的方式。对于每个客户端代理方法,您都必须提出请求。

Operation

修改

在hazelcast中,IdGenerate是作为AtomicLong的包装器实现的,你应该自己实现IdGenerate,而不是扩展IdGenerate。

所以你必须实现这些(更像是待办事项列表XD):

@Test
public void client() throws InterruptedException, IOException
{
    ClientConfig cfg = new XmlClientConfigBuilder("hazelcast-client.xml").build();
    ServiceConfig serviceConfig = new ServiceConfig();
    serviceConfig.setName(ConnectorService.NAME)
                 .setClassName(ConnectorService.class.getCanonicalName())
                 .setEnabled(true);
    ProxyFactoryConfig proxyFactoryConfig = new ProxyFactoryConfig();
    proxyFactoryConfig.setService(ConnectorService.NAME);
    proxyFactoryConfig.setClassName(CustomProxyFactory.class.getName());
    cfg.addProxyFactoryConfig(proxyFactoryConfig);
    HazelcastInstance hz = HazelcastClient.newHazelcastClient(cfg);

    Thread.sleep(1000);
    for (int i = 0; i < 10; i++)
    {
        Connector c = hz.getDistributedObject(ConnectorService.NAME, "Connector:" + ThreadLocalRandom.current()
                                                                                                     .nextInt(10000));
        System.out.println(c.snapshot());
    }
}

private static class CustomProxyFactory implements ClientProxyFactory
{

    @Override
    public ClientProxy create(String id)
    {
        return new CustomClientProxy(ConnectorService.NAME, id);
    }
}

private static class CustomClientProxy extends ClientProxy implements Connector
{
    protected CustomClientProxy(String serviceName, String objectName)
    {
        super(serviceName, objectName);
    }

    @Override
    public ConnectorState snapshot()
    {
        return null;
    }

    @Override
    public void loadState(ConnectorState state)
    {

    }

    @Override
    public boolean reconnect(HostNode node)
    {
        return false;
    }

    @Override
    public boolean connect()
    {
        return false;
    }

}

我还创建了一个序列(与IdGenerate相同)here,这是由zookeeper或redis支持的,同样也很容易添加db后端。如果我有了,我会集成到hazelcast时间。