All Downloads are FREE. Search and download functionalities are using the official Maven repository.

io.zeebe.transport.impl.ServerReceiveHandler Maven / Gradle / Ivy

There is a newer version: 0.16.4
Show newest version
/*
 * Copyright © 2017 camunda services GmbH ([email protected])
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package io.zeebe.transport.impl;

import io.zeebe.dispatcher.FragmentHandler;
import io.zeebe.transport.RemoteAddress;
import io.zeebe.transport.RemoteAddressList;
import io.zeebe.transport.ServerControlMessageListener;
import io.zeebe.transport.ServerMessageHandler;
import io.zeebe.transport.ServerOutput;
import io.zeebe.transport.ServerRequestHandler;
import org.agrona.DirectBuffer;

public class ServerReceiveHandler implements FragmentHandler {
  private final TransportHeaderDescriptor transportHeaderDescriptor =
      new TransportHeaderDescriptor();
  private final RequestResponseHeaderDescriptor requestResponseHeaderDescriptor =
      new RequestResponseHeaderDescriptor();
  private final RemoteAddressList remoteAddressList;
  private final ServerMessageHandler messageHandler;
  private final ServerRequestHandler requestHandler;
  private final ServerControlMessageListener controlMessageListener;
  protected final ServerOutput output;

  public ServerReceiveHandler(
      ServerOutput output,
      RemoteAddressList remoteAddressList,
      ServerMessageHandler messageHandler,
      ServerRequestHandler requestHandler,
      ServerControlMessageListener controlMessageListener) {
    this.output = output;
    this.remoteAddressList = remoteAddressList;
    this.messageHandler = messageHandler;
    this.requestHandler = requestHandler;
    this.controlMessageListener = controlMessageListener;
  }

  @Override
  public int onFragment(
      DirectBuffer buffer, int readOffset, int length, int streamId, boolean isMarkedFailed) {
    int result = CONSUME_FRAGMENT_RESULT;

    final RemoteAddress remoteAddress = remoteAddressList.getByStreamId(streamId);

    transportHeaderDescriptor.wrap(buffer, readOffset);
    readOffset += TransportHeaderDescriptor.headerLength();
    length -= TransportHeaderDescriptor.headerLength();

    final int protocolId = transportHeaderDescriptor.protocolId();

    switch (protocolId) {
      case TransportHeaderDescriptor.REQUEST_RESPONSE:
        if (requestHandler != null) {
          requestResponseHeaderDescriptor.wrap(buffer, readOffset);
          readOffset += RequestResponseHeaderDescriptor.headerLength();
          length -= RequestResponseHeaderDescriptor.headerLength();

          final long requestId = requestResponseHeaderDescriptor.requestId();
          result =
              requestHandler.onRequest(output, remoteAddress, buffer, readOffset, length, requestId)
                  ? CONSUME_FRAGMENT_RESULT
                  : POSTPONE_FRAGMENT_RESULT;
        }

        break;

      case TransportHeaderDescriptor.FULL_DUPLEX_SINGLE_MESSAGE:
        if (messageHandler != null) {
          result =
              messageHandler.onMessage(output, remoteAddress, buffer, readOffset, length)
                  ? CONSUME_FRAGMENT_RESULT
                  : POSTPONE_FRAGMENT_RESULT;
        }

        break;

      case TransportHeaderDescriptor.CONTROL_MESSAGE:
        if (controlMessageListener != null) {
          final int messageType =
              buffer.getInt(readOffset, ControlMessages.CONTROL_MESSAGE_BYTEORDER);
          controlMessageListener.onMessage(output, remoteAddress, messageType);
        }

        break;

      default:
        // ignore / fail
        result = FAILED_FRAGMENT_RESULT;
    }

    return result;
  }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy