private void addNewJob(GearmanSessionEvent event) {
   byte[] handle, data, functionNameBytes, unique;
   GearmanPacket p = event.getPacket();
   GearmanJobServerSession sess = event.getSession();
   String functionName;
   handle = p.getDataComponentValue(GearmanPacket.DataComponentName.JOB_HANDLE);
   functionNameBytes = p.getDataComponentValue(GearmanPacket.DataComponentName.FUNCTION_NAME);
   data = p.getDataComponentValue(GearmanPacket.DataComponentName.DATA);
   unique = p.getDataComponentValue(DataComponentName.UNIQUE_ID);
   functionName = ByteUtils.fromUTF8Bytes(functionNameBytes);
   FunctionDefinition def = functionMap.get(functionName);
   if (def == null) {
     GearmanTask gsr =
         new GearmanTask(
             new GearmanPacketImpl(GearmanPacketMagic.REQ, GearmanPacketType.WORK_FAIL, handle));
     sess.submitTask(gsr);
   } else {
     GearmanFunction function = def.getFactory().getFunction();
     function.setData(data);
     function.setJobHandle(handle);
     function.registerEventListener(sess);
     if (unique != null && unique.length > 0) {
       function.setUniqueId(unique);
     }
     functionList.add(function);
   }
 }
 public void handleSessionEvent(GearmanSessionEvent event)
     throws IllegalArgumentException, IllegalStateException {
   GearmanPacket p = event.getPacket();
   GearmanJobServerSession s = event.getSession();
   GearmanPacketType t = p.getPacketType();
   LOG.debug(
       "Worker "
           + this
           + " handling session event"
           + " ( Session = "
           + s
           + " Event = "
           + t
           + " )");
   switch (t) {
     case JOB_ASSIGN:
       // TODO Figure out what the right behavior is if JobUUIDRequired was false when we submitted
       // but is now true
       taskMap.remove(s);
       addNewJob(event);
       break;
     case JOB_ASSIGN_UNIQ:
       // TODO Figure out what the right behavior is if JobUUIDRequired was true when we submitted
       // but is now false
       taskMap.remove(s);
       addNewJob(event);
       break;
     case NOOP:
       taskMap.remove(s);
       break;
     case NO_JOB:
       GearmanTask preSleepTask =
           new GearmanTask(
               new GrabJobEventHandler(s),
               new GearmanPacketImpl(
                   GearmanPacketMagic.REQ, GearmanPacketType.PRE_SLEEP, new byte[0]));
       taskMap.put(s, preSleepTask);
       s.submitTask(preSleepTask);
       break;
     case ECHO_RES:
       break;
     case OPTION_RES:
       break;
     case ERROR:
       s.closeSession();
       break;
     default:
       LOG.warn(
           "Received unknown packet type " + t + " from session " + s + ". Closing connection.");
       s.closeSession();
   }
 }
  public void handleSessionEvent(GearmanSessionEvent event)
      throws IllegalArgumentException, IllegalStateException {
    GearmanPacket p = event.getPacket();
    GearmanJobServerSession s = event.getSession();
    GearmanPacketType t = p.getPacketType();
    Map<JobHandle, GearmanJobImpl> jobsMaps = sessionJobsMap.get(s);

    switch (t) {
      case JOB_CREATED:
        if (jobAwatingCreation == null) {
          throw new IllegalStateException(
              "Recevied job creation " + "message but have not job awaiting submission.");
        }
        if (!jobAwatingCreation.isBackgroundJob()) {
          jobsMaps.put(new JobHandle(jobAwatingCreation), jobAwatingCreation);
        }
        break;
      case WORK_DATA:
      case WORK_STATUS:
      case WORK_WARNING:
      case WORK_COMPLETE:
      case WORK_FAIL:
      case WORK_EXCEPTION:
        JobHandle handle =
            new JobHandle(p.getDataComponentValue(GearmanPacket.DataComponentName.JOB_HANDLE));
        GearmanJobImpl job = jobsMaps.get(handle);
        if (job == null) {
          LOG.warn(
              "Client received packet from server"
                  + " for unknown job ( job_handle = "
                  + handle
                  + " packet = "
                  + t
                  + " )");
        } else {
          job.handleEvent(p);
          if (job.isDone()) {
            jobsMaps.remove(handle);
          }
        }
        break;
      case ERROR:
        String errCode =
            ByteUtils.fromUTF8Bytes(
                p.getDataComponentValue(GearmanPacket.DataComponentName.ERROR_CODE));
        String errMsg =
            ByteUtils.fromUTF8Bytes(
                p.getDataComponentValue(GearmanPacket.DataComponentName.ERROR_TEXT));
        LOG.warn(
            "Received error code "
                + errCode
                + "( "
                + errMsg
                + " )"
                + " from session "
                + s
                + ". Shutting session down");
        shutDownSession(s);
        if (sessionsMap.isEmpty()) {
          shutdown();
        }
        break;
      default:
        LOG.warn(
            "received un-expected packet from Job"
                + " Server Session: "
                + p
                + ". Shutting down session");
        shutDownSession(s);
        if (sessionsMap.isEmpty()) {
          shutdown();
        }
    }
  }