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); }