Grid Ops Java-主机

时间:2020-01-09 10:35:44  来源:igfitidea点击:

com.nanosai.gridops.host.Host类代表一个单线程循环,该循环从TcpSocketsPort读取消息并将消息传递给NodeContainer进行处理。这里简要说明了"主机"的工作方式:

创建主机

这是一个如何创建一个主机的例子:

Host host = GridOps.hostBuilder().build();

这个例子创建了一个空的Host对象,它不是很有用。一个"主机"需要一个" TcpSocketsPort"来从中读取消息,并需要一个" NodeContainer"来将它们传递到。

在主机上设置TcpSocketsPort

这是创建TcpServerTcpSocketsPort并将它们连接到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();