Module org.snmp4j

Class MultiThreadedMessageDispatcher

java.lang.Object
org.snmp4j.util.MultiThreadedMessageDispatcher
All Implemented Interfaces:
MessageDispatcher, TransportListener

public class MultiThreadedMessageDispatcher extends Object implements MessageDispatcher
The MultiThreadedMessageDispatcher class is a decorator for any MessageDispatcher instances that processes incoming message with a supplied ThreadPool. The processing is thus concurrent on up to the size of the supplied thread pool threads.

In contrast to a MessageDispatcherImpl a MultiThreadedMessageDispatcher copies the incoming ByteBuffer for processMessage(TransportMapping, Address, ByteBuffer, TransportStateReference) to allow concurrent processing of the buffer.

Since:
1.0.2
Version:
3.5.0
Author:
Frank Fock
  • Constructor Details

    • MultiThreadedMessageDispatcher

      public MultiThreadedMessageDispatcher(WorkerPool workerPool, MessageDispatcher decoratedDispatcher)
      Creates a multithreaded message dispatcher using the provided ThreadPool to concurrently process incoming messages that are forwarded to the supplied decorated MessageDispatcher.
      Parameters:
      workerPool - a WorkerPool instance (that can be shared). The worker pool has to be stopped externally.
      decoratedDispatcher - the decorated MessageDispatcher that must be multi-threading safe.
  • Method Details

    • getDispatcher

      public MessageDispatcher getDispatcher()
      Returns the wrapped dispatcher.
      Returns:
      the MessageDispatcher instance called by the threads of the worker pool.
      Since:
      3.5.0
    • getNextRequestID

      public int getNextRequestID()
      Description copied from interface: MessageDispatcher
      Gets the next unique request ID. The returned ID is unique across the last 2^31-1 IDs generated by this message dispatcher.
      Specified by:
      getNextRequestID in interface MessageDispatcher
      Returns:
      an integer value in the range 1..2^31-1. The returned ID can be used to map responses to requests send through this message dispatcher.
    • addMessageProcessingModel

      public void addMessageProcessingModel(MessageProcessingModel model)
      Description copied from interface: MessageDispatcher
      Adds a MessageProcessingModel to the dispatcher. In order to support a specific SNMP protocol version, the message dispatcher needs a message processing model to process messages before they can be dispatched.
      Specified by:
      addMessageProcessingModel in interface MessageDispatcher
      Parameters:
      model - a MessageProcessingModel instance.
    • removeMessageProcessingModel

      public void removeMessageProcessingModel(MessageProcessingModel model)
      Description copied from interface: MessageDispatcher
      Removes a previously added MessageProcessingModel from the dispatcher.
      Specified by:
      removeMessageProcessingModel in interface MessageDispatcher
      Parameters:
      model - a MessageProcessingModel instance.
    • getMessageProcessingModel

      public MessageProcessingModel getMessageProcessingModel(int messageProcessingModel)
      Description copied from interface: MessageDispatcher
      Gets the MessageProcessingModel for the supplied message processing model ID.
      Specified by:
      getMessageProcessingModel in interface MessageDispatcher
      Parameters:
      messageProcessingModel - a message processing model ID (see MessageProcessingModel.getID()).
      Returns:
      a MessageProcessingModel instance if the ID is known, otherwise null
    • addTransportMapping

      public void addTransportMapping(TransportMapping<? extends Address> transport)
      Description copied from interface: MessageDispatcher
      Adds a TransportMapping to the dispatcher. The transport mapping is used to send and receive messages to/from the network.
      Specified by:
      addTransportMapping in interface MessageDispatcher
      Parameters:
      transport - a TransportMapping instance.
    • removeTransportMapping

      public TransportMapping<?> removeTransportMapping(TransportMapping<? extends Address> transport)
      Description copied from interface: MessageDispatcher
      Removes a previously added TransportMapping from the dispatcher.
      Specified by:
      removeTransportMapping in interface MessageDispatcher
      Parameters:
      transport - a TransportMapping instance.
      Returns:
      the TransportMapping instance if it could be successfully removed, null otherwise.
    • addCounterListener

      public void addCounterListener(CounterListener counterListener)
      Adds a CounterListener to the dispatcher. The counter listener is informed about errors during message dispatching.
      Specified by:
      addCounterListener in interface MessageDispatcher
      Parameters:
      counterListener - a CounterListener instance.
      Since:
      3.0
    • removeCounterListener

      public CounterListener removeCounterListener(CounterListener counterListener)
      Removes a previously added CounterListener from the dispatcher.
      Specified by:
      removeCounterListener in interface MessageDispatcher
      Parameters:
      counterListener - a CounterListener instance.
      Returns:
      the CounterListener instance if it could be successfully removed, null otherwise.
      Since:
      3.0
    • getTransportMappings

      public Collection<TransportMapping<? extends Address>> getTransportMappings()
      Description copied from interface: MessageDispatcher
      Gets the Collection of transport mappings in this message dispatcher.
      Specified by:
      getTransportMappings in interface MessageDispatcher
      Returns:
      a Collection with the registered transport mappings.
    • addCommandResponder

      public void addCommandResponder(CommandResponder listener)
      Description copied from interface: MessageDispatcher
      Adds a CommandResponder instance to the message dispatcher. Successfully processed SNMP messages will be presented to all command responder (in the order in which they have been added) until a responder uses the CommandResponderEvent.setProcessed(boolean processed) to set the processed status of the event to true.
      Specified by:
      addCommandResponder in interface MessageDispatcher
      Parameters:
      listener - a CommandResponder instance.
    • removeCommandResponder

      public void removeCommandResponder(CommandResponder listener)
      Description copied from interface: MessageDispatcher
      Removes a previously added CommandResponder instance from the message dispatcher.
      Specified by:
      removeCommandResponder in interface MessageDispatcher
      Parameters:
      listener - a CommandResponder instance.
    • sendPdu

      public <A extends Address> PduHandle sendPdu(Target<A> target, PDU pdu, boolean expectResponse) throws MessageException
      Description copied from interface: MessageDispatcher
      Sends a PDU to the supplied transport address. This method behaves like a call to MessageDispatcher.sendPdu(TransportMapping transportMapping, Target target, PDU pdu, boolean expectResponse) with transportMapping set to null.
      Specified by:
      sendPdu in interface MessageDispatcher
      Type Parameters:
      A - the target Address type.
      Parameters:
      target - the target which identifies, transport address, message processing model, security model, security name and level.
      pdu - the SNMP Protocol Data Unit
      expectResponse - true if a response is expected and a state reference should be saved (if needed for the supplied message processing model).
      Returns:
      an PduHandle that uniquely identifies this request.
      Throws:
      MessageException - if sending of the PDU failed.
    • sendPdu

      public <A extends Address> PduHandle sendPdu(TransportMapping<? super A> transportMapping, Target<A> target, PDU pdu, boolean expectResponse) throws MessageException
      Description copied from interface: MessageDispatcher
      Sends a PDU to the supplied transport address.
      Specified by:
      sendPdu in interface MessageDispatcher
      Type Parameters:
      A - the Address type.
      Parameters:
      transportMapping - the TransportMapping to be used to send the PDU. If transportMapping is null the message dispatcher will determine the appropriate transport mapping for the given transport address.
      target - the target which identifies, transport address, message processing model, security model, security name and level.
      pdu - the SNMP Protocol Data Unit
      expectResponse - true if a response is expected and a state reference should be saved (if needed for the supplied message processing model).
      Returns:
      an PduHandle that uniquely identifies this request.
      Throws:
      MessageException - if sending of the PDU failed.
    • sendPdu

      public <A extends Address> PduHandle sendPdu(TransportMapping<? super A> transportMapping, Target<A> target, PDU pdu, boolean expectResponse, PduHandleCallback<PDU> callback) throws MessageException
      Description copied from interface: MessageDispatcher
      Sends a PDU to the supplied transport address and returns the PduHandle that uniquely identifies the request as response after the request has been sent and optional, if a PduHandleCallback is given, it returns also the PduHandle just before the request is sent through the the callback interface.
      Specified by:
      sendPdu in interface MessageDispatcher
      Type Parameters:
      A - the target Address type.
      Parameters:
      transportMapping - the TransportMapping to be used to send the PDU. If transportMapping is null the message dispatcher will determine the appropriate transport mapping for the given transport address.
      target - the target which identifies, transport address, message processing model, security model, security name and level.
      pdu - the SNMP Protocol Data Unit
      expectResponse - true if a response is expected and a state reference should be saved (if needed for the supplied message processing model).
      callback - an optional callback instance that is informed (if not null) about the newly assigned PduHandle just before the message is sent out.
      Returns:
      an PduHandle that uniquely identifies this request.
      Throws:
      MessageException - if sending of the PDU failed.
    • returnResponsePdu

      public <A extends Address> int returnResponsePdu(int messageProcessingModel, int securityModel, byte[] securityName, int securityLevel, PDU pdu, int maxSizeResponseScopedPDU, StateReference<A> stateReference, StatusInformation statusInformation) throws MessageException
      Description copied from interface: MessageDispatcher
      Returns a response PDU to the sender of the corresponding request PDU.
      Specified by:
      returnResponsePdu in interface MessageDispatcher
      Type Parameters:
      A - the Address type.
      Parameters:
      messageProcessingModel - the message processing model, see MessageProcessingModel
      securityModel - the security model to use, see SecurityModel
      securityName - the security name
      securityLevel - the security level for the message to be returned, see SecurityLevel
      pdu - the protocol data unit (PDU) to send.
      maxSizeResponseScopedPDU - the maximum size agreed for the response scoped PDU.
      stateReference - the state reference to be used.
      statusInformation - the status information to be used.
      Returns:
      an MP error status or SnmpConstants.SNMP_MP_OK if the operation was successful.
      Throws:
      MessageException - if message processing fails with a fatal error.
    • releaseStateReference

      public void releaseStateReference(int messageProcessingModel, PduHandle pduHandle)
      Description copied from interface: MessageDispatcher
      Release any state references associated with the supplied PduHandle in the specified message processing model.
      Specified by:
      releaseStateReference in interface MessageDispatcher
      Parameters:
      messageProcessingModel - a message processing model ID.
      pduHandle - the PduHandle that identifies a confirmed class message.
      See Also:
    • getTransport

      @Deprecated public <A extends Address> TransportMapping<? super A> getTransport(A destAddress)
      Deprecated.
      Description copied from interface: MessageDispatcher
      Returns a transport mapping that can handle the supplied address.
      Specified by:
      getTransport in interface MessageDispatcher
      Type Parameters:
      A - the Address type to get a TransportMapping for.
      Parameters:
      destAddress - an Address instance.
      Returns:
      a TransportMapping instance that can be used to sent a SNMP message to destAddress or null if such a transport mapping does not exists.
    • getTransport

      public <A extends Address> TransportMapping<? super A> getTransport(A destAddress, TransportType transportType)
      Description copied from interface: MessageDispatcher
      Returns a transport mapping that can handle the supplied address.
      Specified by:
      getTransport in interface MessageDispatcher
      Type Parameters:
      A - the Address type to get a TransportMapping for.
      Parameters:
      destAddress - an Address instance.
      transportType - specifies the SNMP application type that will use the returned transport mapping. transportType must be either TransportType.receiver or TransportType.sender. If TransportType.any is provided an IllegalArgumentException will be thrown.
      Returns:
      a TransportMapping instance that can be used to sent a SNMP message to destAddress or null if such a transport mapping does not exists.
    • processMessage

      public <A extends Address> void processMessage(TransportMapping<? super A> sourceTransport, A incomingAddress, ByteBuffer wholeMessage, TransportStateReference tmStateReference)
      Description copied from interface: MessageDispatcher
      Process an incoming SNMP message. The message is processed and dispatched according to the message's content, the message processing models, and the command responder available to the dispatcher.
      Specified by:
      processMessage in interface MessageDispatcher
      Specified by:
      processMessage in interface TransportListener
      Type Parameters:
      A - the Address type.
      Parameters:
      sourceTransport - a TransportMapping instance denoting the transport that received the message and that will be used to send any responses to this message. The sourceTransport has to support the incomingAddress's implementation class.
      incomingAddress - the Address from which the message has been received.
      wholeMessage - an ByteBuffer containing the received SNMP message.
      tmStateReference - the transport model state reference as defined by RFC 5590.
    • stop

      public void stop()
      Description copied from interface: MessageDispatcher
      Stops this message dispatcher and free all resources (i.e. stop/join internal threads, etc.)
      Specified by:
      stop in interface MessageDispatcher