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);
   }
 }
  private GearmanPacket generateCanDoPacket(FunctionDefinition def) {
    GearmanPacketType pt = GearmanPacketType.CAN_DO;
    byte[] data = null;
    byte[] name = ByteUtils.toUTF8Bytes(def.getFactory().getFunctionName());
    long timeout = def.getTimeout();

    if (timeout > 0) {
      pt = GearmanPacketType.CAN_DO_TIMEOUT;
      byte[] to = ByteUtils.toUTF8Bytes(String.valueOf(timeout));
      data = new byte[name.length + to.length + 1];
      System.arraycopy(name, 0, data, 0, name.length);
      data[name.length] = ByteUtils.NULL;
      System.arraycopy(to, 0, data, name.length + 1, to.length);
    } else {
      data = name;
    }
    return new GearmanPacketImpl(GearmanPacketMagic.REQ, pt, data);
  }