如何为SPI编写客户端代理以及客户端和服务器代理之间的区别是什么?
How to write client proxy for SPI and what the difference between client and server proxies?
我开发了自己的基于 Hazelcast IdGenerator
class 的 idGenerator(将每个 last_used_id
存储到数据库中)。现在我想 运行 hazelcast 集群作为单个 java 应用程序和我的网络应用程序作为其他应用程序(网络应用程序重新启动不应将 id 值移动到下一个块)。我将 MyIdGeneratorProxy
和 MyIdGeneratorService
移动到新应用程序,运行 它,运行 网络应用程序作为 hazelcast-client 并获得
IllegalArgumentException: No factory registered for service: ecs:impl:idGeneratorService
当客户端和服务器是同一个应用程序时没问题。
似乎没有一些 clientProxy
就无法处理。我比较了 IdGeneratorProxy
和 ClientIdGeneratorProxy
,看起来是一样的。什么想法?如何编写服务的客户端代理?我还没有找到文档。调查方向是否正确?我认为可以将 hazelcast 内部服务(如 id 生成器服务)和我的业务流程分开。我应该在我的网络应用程序中存储自定义 ClientProxy(用于自定义 spi)吗?
这是一个创建客户端代理的demo,缺少部分CustomClientProxy
函数调用,比较复杂(更像服务器代理,这里调用ReadRequest
,服务器调用Operation
),你可以找到一个 AtomicLong implement。对于每个客户端代理方法,你都必须发出请求。
@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;
}
}
编辑
在 hazelcast 中,IdGenerate 是作为 AtomicLong 的包装器实现的,您应该自己实现 IdGenerate,而不是扩展 IdGenerate。
所以你必须实现这些(更像是待办事项列表 XD):
API
interface MyIdGenerate
Server
MyIdGenerateService
MyIdGenerateProxy
MyIdGenerateXXXOperation
Client
ClientMyIdGenerateFactory
ClientMyIdGenerateProxy
MyIdGenerateXXXRequest
我还制作了一个序列(与IdGenerate相同)here,这是由zookeeper或redis支持的,添加数据库后端也很容易,too.I如果我有,将集成到hazelcast时间。
我开发了自己的基于 Hazelcast IdGenerator
class 的 idGenerator(将每个 last_used_id
存储到数据库中)。现在我想 运行 hazelcast 集群作为单个 java 应用程序和我的网络应用程序作为其他应用程序(网络应用程序重新启动不应将 id 值移动到下一个块)。我将 MyIdGeneratorProxy
和 MyIdGeneratorService
移动到新应用程序,运行 它,运行 网络应用程序作为 hazelcast-client 并获得
IllegalArgumentException: No factory registered for service: ecs:impl:idGeneratorService
当客户端和服务器是同一个应用程序时没问题。
似乎没有一些 clientProxy
就无法处理。我比较了 IdGeneratorProxy
和 ClientIdGeneratorProxy
,看起来是一样的。什么想法?如何编写服务的客户端代理?我还没有找到文档。调查方向是否正确?我认为可以将 hazelcast 内部服务(如 id 生成器服务)和我的业务流程分开。我应该在我的网络应用程序中存储自定义 ClientProxy(用于自定义 spi)吗?
这是一个创建客户端代理的demo,缺少部分CustomClientProxy
函数调用,比较复杂(更像服务器代理,这里调用ReadRequest
,服务器调用Operation
),你可以找到一个 AtomicLong implement。对于每个客户端代理方法,你都必须发出请求。
@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;
}
}
编辑
在 hazelcast 中,IdGenerate 是作为 AtomicLong 的包装器实现的,您应该自己实现 IdGenerate,而不是扩展 IdGenerate。
所以你必须实现这些(更像是待办事项列表 XD):
API
interface MyIdGenerate
Server
MyIdGenerateService
MyIdGenerateProxy
MyIdGenerateXXXOperation
Client
ClientMyIdGenerateFactory
ClientMyIdGenerateProxy
MyIdGenerateXXXRequest
我还制作了一个序列(与IdGenerate相同)here,这是由zookeeper或redis支持的,添加数据库后端也很容易,too.I如果我有,将集成到hazelcast时间。