void processTask(ETask task, ObjectMessage msg, EntityManager em) {
    EMethod method;
    EModel model;
    Collection<EBounds> bounds;
    TaskMessage tm;

    System.out.println("Processing task [id=" + String.valueOf(task.getId()) + "]...");

    method = task.getMethod();
    model = task.getModel();
    bounds = getBoundsForModel(model, em);

    try {
      tm = (TaskMessage) msg.getObject();
      if (method.getIdent().equals(EMethod.fba)) {
        FbaMethod.run(task, model, bounds);
      } else if (method.getIdent().equals(EMethod.fva)) {
        FvaMethod.run(task, model, bounds, (MultipleReactionsTaskMessage) tm);
      } else if (method.getIdent().equals(EMethod.rscan)) {
        RscanMethod.run(task, model, bounds, (MultipleReactionsTaskMessage) tm);
      } else if (method.getIdent().equals(EMethod.kgene)) {
        KgeneMethod.run(task, model, bounds);
      }
      msg.acknowledge();
    } catch (AmkfbaException e) {
      AcornLogger.logError("AmkfbaException: " + e.getMessage());
      markAsBroken(task, em);
    } catch (JMSException e) {
      e.printStackTrace(System.err);
      throw new Error("JMSException, aborting...");
    }
  }