class_docstr: The server maintains the port and hands off the requests to workers
  
  example of use:
  
  context = zmq.Context()
  with KnimeBridgeServer(
      context,
      "tcp://127.0.0.1:4000", # server address
      "inproc://Notify        # kill notify address
      ) as server:
      notify_socket = context.socket(zmq.PUB)
      notify_socket.bind("inproc://Notify")
      ....
      notify_socket.send("Stop")
class_docstr_tok: ["The","server","maintains","the","port","and","hands","off","the","requests","to","workers","example","of","use",":","context","=","zmq.Context","(",")","with","KnimeBridgeServer","(","context",",","``","tcp",":","\/\/127.0.0.1:4000","''",",","#","server","address","``","inproc",":","\/\/Notify","#","kill","notify","address",")","as","server",":","notify_socket","=","context.socket","(","zmq.PUB",")","notify_socket.bind","(","``","inproc",":","\/\/Notify","''",")","....","notify_socket.send","(","``","Stop","''",")"]
docstr: Scan the modules for features
  
  modules - modules to scan for features
  pipeline - the pipeline they came from
  
  returns a two tuple of
      Java types, e.g., "java.lang.Integer"
      A dictionary whose key is the object name and whose
      value is a list of two-tuples of feature name and index into
      the java types array.
docstr_tok: ["Scan","the","modules","for","features","modules","-","modules","to","scan","for","features","pipeline","-","the","pipeline","they","came","from","returns","a","two","tuple","of","Java","types",",","e.g.",",","``","java.lang.Integer","''","A","dictionary","whose","key","is","the","object","name","and","whose","value","is","a","list","of","two-tuples","of","feature","name","and","index","into","the","java","types","array","."]
code: def find_measurements(self, modules, pipeline):
      """Scan the modules for features
  
      modules - modules to scan for features
      pipeline - the pipeline they came from
  
      returns a two tuple of
          Java types, e.g., "java.lang.Integer"
          A dictionary whose key is the object name and whose
          value is a list of two-tuples of feature name and index into
          the java types array.
      """
      jtypes = ["java.lang.Integer"]
      features = {}
      for module in modules:
          assert isinstance(module, Module)
          for column in module.get_measurement_columns(pipeline):
              objects, name, dbtype = column[:3]
              qualifiers = {} if len(column) < 4 else column[3]
              if (
                  objects == EXPERIMENT
                  and qualifiers.get(MCA_AVAILABLE_POST_RUN, False)
                  == True
              ):
                  continue
              if dbtype == COLTYPE_FLOAT:
                  jtype = "java.lang.Double"
              elif dbtype == COLTYPE_INTEGER:
                  jtype = "java.lang.Integer"
              elif dbtype.startswith(COLTYPE_VARCHAR):
                  jtype = "java.lang.String"
              else:
                  continue
              if jtype in jtypes:
                  type_idx = jtypes.index(jtype)
              else:
                  type_idx = len(jtypes)
                  jtypes.append(jtype)
              if objects not in features:
                  ofeatures = features[objects] = {}
              else:
                  ofeatures = features[objects]
              if name not in ofeatures:
                  ofeatures[name] = type_idx
      for key in features:
          features[key][IMAGE_NUMBER] = 0
      features_out = dict(
          [(k, list(v.items())) for k, v in list(features.items())]
      )
      return jtypes, features_out
  
imports: import json
  import logging
  import threading
  import uuid
  from io import StringIO
  import numpy
  import zmq
  from cellprofiler_core.constants.measurement import GROUP_NUMBER, GROUP_INDEX, OBJECT_NUMBER, EXPERIMENT, MCA_AVAILABLE_POST_RUN, COLTYPE_FLOAT, COLTYPE_INTEGER, COLTYPE_VARCHAR, IMAGE_NUMBER
  from cellprofiler_core.constants.workspace import DISPOSITION_SKIP, DISPOSITION_CANCEL
  from cellprofiler_core.image import Image
  from cellprofiler_core.measurement import Measurements
  from cellprofiler_core.module import Module
  from cellprofiler_core.setting.text import ImageName
  import cellprofiler_core.object
  import cellprofiler_core.pipeline
  import cellprofiler_core.workspace
label_desc: Use image node_id 16 for calling the KnimeBridgeServer obj's underlying member method code with example usage: obj.find_measurements(modules, pipeline) and returns: jtypes,  features_out