7
7
package gearmanij.client;
9
import java.util.LinkedList;
10
import java.util.Queue;
11
9
import java.util.UUID;
12
10
import java.util.logging.Level;
13
11
import java.util.logging.Logger;
15
13
import gearmanij.GearmanException;
14
import org.gearman.GearmanJobEventListener;
16
15
import org.gearman.GearmanPacket;
17
16
import org.gearman.PacketMagic;
19
class GearmanServerRequest {
18
class GearmanServerRequest implements GearmanJobEventListener{
21
20
enum RequestState {
22
21
NEW, AWAITINGRESPONSE, PROCESSINGRESPONSES, FINISHED,
27
26
private final String DESCRIPTION;
28
27
private RequestState state = null;
29
28
private GearmanPacket requestPacket = null;
30
private Queue<GearmanPacket> responsePackets = new LinkedList<GearmanPacket>();
31
29
private UUID uuid = null;
32
30
private GearmanServerResponseHandler handler = null;
33
31
private static final Logger LOG = GearmanClientImpl.getLogger();
59
void addResponsePacket(GearmanPacket p) {
57
public void handleGearmanJobEvent(GearmanPacket p) throws IllegalArgumentException {
61
59
throw new IllegalArgumentException("You can not add a null" +
62
60
" response packet");
64
if (!p.getMagic().equals(PacketMagic.RES)) {
65
throw new IllegalArgumentException("Invalid packet magic. Packet" +
66
" is not a response packet");
68
responsePackets.add(p);
71
GearmanPacket getRequestPacket() {
75
GearmanServerResponseHandler getHandler() {
79
public String toString() {
83
RequestState getState() {
87
void driveRequest() throws GearmanException {
88
GearmanPacket p = null;
92
64
// request needs to be submitted to server
94
if (requestPacket == null) {
95
changeState(RequestState.EXCEPTION);
98
if (!requestPacket.requiresResponse()) {
99
state = RequestState.FINISHED;
66
if (p.getMagic().equals(PacketMagic.REQ)) {
67
if (requestPacket.requiresResponse()) {
68
changeState(RequestState.AWAITINGRESPONSE);
70
changeState(RequestState.FINISHED);
103
77
case AWAITINGRESPONSE:
104
if (responsePackets.isEmpty()) {
105
changeState(RequestState.AWAITINGRESPONSE);
78
if (p.getMagic().equals(PacketMagic.RES)) {
79
changeState(RequestState.PROCESSINGRESPONSES);
81
//TODO (for now we break to avoid falling through)
109
85
case PROCESSINGRESPONSES:
110
if (responsePackets.isEmpty()) {
111
changeState(RequestState.PROCESSINGRESPONSES);
86
if (!p.getMagic().equals(PacketMagic.RES)) {
114
p = responsePackets.remove();
115
90
if (handler == null) {
116
91
LOG.log(Level.WARNING,"ServerRequest requires " +
117
92
"response, but not response handler was " +
142
117
throw new GearmanException("Unknown Request state " +
143
118
state + " for request " + requestPacket);
122
GearmanPacket getRequestPacket() {
123
return requestPacket;
126
GearmanServerResponseHandler getHandler() {
130
public String toString() {
134
RequestState getState() {
148
138
private void changeState(RequestState newState) {