Grid Ops Java-主机
com.nanosai.gridops.host.Host类代表一个单线程循环,该循环从TcpSocketsPort读取消息并将消息传递给NodeContainer进行处理。这里简要说明了"主机"的工作方式:
创建主机
这是一个如何创建一个主机的例子:
Host host = GridOps.hostBuilder().build();
这个例子创建了一个空的Host对象,它不是很有用。一个"主机"需要一个" TcpSocketsPort"来从中读取消息,并需要一个" NodeContainer"来将它们传递到。
在主机上设置TcpSocketsPort
这是创建TcpServer
和TcpSocketsPort
并将它们连接到Host
的方法:
TcpServer tcpServer = GridOps.tcpServerBuilder().buildAndStart(); TcpSocketsPort tcpSocketsPort = GridOps.tcpSocketsPortBuilder().tcpServer(tcpServer).build(); Host host = GridOps.hostBuilder() .tcpSocketsPort(tcpSocketsPort) .build();
TcpServer类在有关TcpServer的文本中有更详细的说明。
TcpSocketsPort类在有关TcpSocketsPort的文本中进行了详细说明。
在主机上设置NodeContainer
这是如何使用可以处理传入消息的NodeReactor,ProtocolReactor和MessageReactor创建NodeContainer的方法:
byte[] messageType = new byte[]{11}; byte[] protocolId = new byte[]{22}; byte[] protocolVersion = new byte[]{ 0}; byte[] nodeId = new byte[]{33}; MessageReactor messageReactor = new MessageReactor(messageType) { @Override public void react(IonReader ionReader, IapMessageFields iapMessageFields, TcpSocketsPort tcpSocketsPort) { System.out.println("Reacting to message"); } }; ProtocolReactor protocolReactor = GridOps.protocolReactor(protocolId, protocolVersion, messageReactor); NodeReactor nodeReactor = GridOps.nodeReactor (nodeId , protocolReactor); NodeContainer nodeContainer = GridOps.nodeContainer (nodeReactor);
关于NodeContainer的文本将更详细地说明NodeContainer。
一旦NodeContainer
被创建,我们需要在HostBuilder
上进行设置。这是在HostBuilder上设置NodeContainer的完整示例:
TcpServer tcpServer = GridOps.tcpServerBuilder().buildAndStart(); TcpSocketsPort tcpSocketsPort = GridOps.tcpSocketsPortBuilder().tcpServer(tcpServer).build(); byte[] messageType = new byte[]{11}; byte[] protocolId = new byte[]{22}; byte[] protocolVersion = new byte[]{ 0}; byte[] nodeId = new byte[]{33}; MessageReactor messageReactor = new MessageReactor(messageType) { @Override public void react(IonReader ionReader, IapMessageFields iapMessageFields, TcpSocketsPort tcpSocketsPort) { System.out.println("Reacting to message"); } }; ProtocolReactor protocolReactor = GridOps.protocolReactor(protocolId, protocolVersion, messageReactor); NodeReactor nodeReactor = GridOps.nodeReactor (nodeId , protocolReactor); NodeContainer nodeContainer = GridOps.nodeContainer (nodeReactor); Host host = GridOps.hostBuilder() .tcpSocketsPort(tcpSocketsPort) .nodeContainer(nodeContainer) .build();
启动主机
创建"主机"后,我们需要先启动它,然后再执行任何操作。一个Host对象实现了Runnable,因此我们可以通过调用其run()方法来运行它。这将导致当前线程执行"主机"。看起来是这样的:
host.run();
如果要在自己的线程中运行"主机",则可以这样操作:
new Thread(host).start();
HostBuilder对此也有一个方便的方法,称为buildAndStart()。这是调用buildAndStart()
的样子:
Host host = GridOps.hostBuilder() .tcpSocketsPort(tcpSocketsPort) .nodeContainer(nodeContainer) .buildAndStart();
一旦"主机"构建并运行,我们就可以使用IAP客户端连接到其TCP服务器并向其发送消息。消息将通过TcpSocketsPort
读取并转发到NodeContainer
进行处理。请记住在发送的消息中正确设置接收节点ID,语义协议ID和消息类型,否则它们将无法到达正确的消息反应堆。
停止主机
一旦Host运行,它将一直运行直到我们停止它或者关闭JVM。我们可以通过调用其主机的stop()方法来停止其运行。这是停止运行中的"主机"的方法:
host.stop();