Skip to content

Commit 3d2a3f0

Browse files
author
Brendan Almonte
committed
Events API: Switch to a callback approach rather than a BlockingQueue
1 parent d3fe99f commit 3d2a3f0

File tree

9 files changed

+128
-131
lines changed

9 files changed

+128
-131
lines changed

src/main/java/com/github/dockerjava/api/DockerClient.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
import com.github.dockerjava.api.command.CopyFileFromContainerCmd;
1111
import com.github.dockerjava.api.command.CreateContainerCmd;
1212
import com.github.dockerjava.api.command.CreateImageCmd;
13+
import com.github.dockerjava.api.command.EventCallback;
1314
import com.github.dockerjava.api.command.EventsCmd;
1415
import com.github.dockerjava.api.command.InfoCmd;
1516
import com.github.dockerjava.api.command.InspectContainerCmd;
@@ -115,7 +116,7 @@ public CopyFileFromContainerCmd copyFileFromContainerCmd(
115116

116117
public UnpauseContainerCmd unpauseContainerCmd(String containerId);
117118

118-
public EventsCmd eventsCmd();
119+
public EventsCmd eventsCmd(EventCallback eventCallback);
119120

120121
public void close() throws IOException;
121122

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
package com.github.dockerjava.api.command;
2+
3+
import com.github.dockerjava.api.model.Event;
4+
5+
/**
6+
* Event callback
7+
*/
8+
public interface EventCallback {
9+
public void onEvent(Event event);
10+
}
Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,14 @@
11
package com.github.dockerjava.api.command;
22

3-
import com.github.dockerjava.api.model.EventStream;
3+
import com.github.dockerjava.api.model.EventNotifier;
44

55
/**
66
* Get events
77
*
88
* @param since - Show all events created since timestamp
99
* @param until - Stream events until this timestamp
1010
*/
11-
public interface EventsCmd extends DockerCmd<EventStream> {
11+
public interface EventsCmd extends DockerCmd<EventNotifier> {
1212
public EventsCmd withSince(String since);
1313

1414
public EventsCmd withUntil(String until);
@@ -17,6 +17,8 @@ public interface EventsCmd extends DockerCmd<EventStream> {
1717

1818
public String getUntil();
1919

20-
public static interface Exec extends DockerCmdExec<EventsCmd, EventStream> {
20+
public EventCallback getEventCallback();
21+
22+
public static interface Exec extends DockerCmdExec<EventsCmd, EventNotifier> {
2123
}
2224
}
Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
package com.github.dockerjava.api.model;
2+
3+
import com.fasterxml.jackson.core.JsonFactory;
4+
import com.fasterxml.jackson.core.JsonParser;
5+
import com.fasterxml.jackson.core.JsonToken;
6+
import com.fasterxml.jackson.databind.ObjectMapper;
7+
import com.github.dockerjava.api.command.EventCallback;
8+
import com.google.common.base.Preconditions;
9+
10+
import java.io.Closeable;
11+
import java.io.IOException;
12+
import java.io.InputStream;
13+
import java.util.concurrent.Callable;
14+
15+
/**
16+
* EventStream API
17+
* <p/>
18+
* Spawns a thread to poll for events to fill a BlockingQueue
19+
*/
20+
public class EventNotifier implements Closeable, Callable<Void> {
21+
private static final JsonFactory JSON_FACTORY = new JsonFactory();
22+
private static final ObjectMapper OBJECT_MAPPER = new ObjectMapper();
23+
24+
private final EventCallback eventCallback;
25+
private final InputStream inputStream;
26+
27+
private EventNotifier(EventCallback eventCallback, InputStream inputStream) {
28+
this.eventCallback = eventCallback;
29+
this.inputStream = inputStream;
30+
}
31+
32+
public static EventNotifier create(EventCallback eventCallback, InputStream inputStream) {
33+
Preconditions.checkNotNull(eventCallback, "An EventCallback must be provided");
34+
Preconditions.checkNotNull(inputStream, "An InputStream must be provided");
35+
return new EventNotifier(eventCallback, inputStream);
36+
}
37+
38+
@Override
39+
public void close() throws IOException {
40+
inputStream.close();
41+
}
42+
43+
@Override
44+
public Void call() throws Exception {
45+
JsonParser jp = JSON_FACTORY.createParser(inputStream);
46+
while (jp.nextToken() != JsonToken.END_OBJECT && !jp.isClosed()) {
47+
eventCallback.onEvent(OBJECT_MAPPER.readValue(jp, Event.class));
48+
}
49+
return null;
50+
}
51+
}

src/main/java/com/github/dockerjava/api/model/EventStream.java

Lines changed: 0 additions & 85 deletions
This file was deleted.

src/main/java/com/github/dockerjava/core/DockerClientImpl.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -253,8 +253,8 @@ public UnpauseContainerCmd unpauseContainerCmd(String containerId) {
253253
}
254254

255255
@Override
256-
public EventsCmd eventsCmd() {
257-
return new EventsCmdImpl(getDockerCmdExecFactory().createEventsCmdExec());
256+
public EventsCmd eventsCmd(EventCallback eventCallback) {
257+
return new EventsCmdImpl(getDockerCmdExecFactory().createEventsCmdExec(), eventCallback);
258258
}
259259

260260
@Override

src/main/java/com/github/dockerjava/core/command/EventsCmdImpl.java

Lines changed: 15 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,22 @@
11
package com.github.dockerjava.core.command;
22

3+
import com.github.dockerjava.api.command.EventCallback;
34
import com.github.dockerjava.api.command.EventsCmd;
4-
import com.github.dockerjava.api.model.EventStream;
5-
6-
import java.io.InputStream;
5+
import com.github.dockerjava.api.model.EventNotifier;
76

87
/**
98
* Stream docker events
109
*/
11-
public class EventsCmdImpl extends AbstrDockerCmd<EventsCmd, EventStream> implements EventsCmd {
10+
public class EventsCmdImpl extends AbstrDockerCmd<EventsCmd, EventNotifier> implements EventsCmd {
11+
12+
private final EventCallback eventCallback;
1213

1314
private String since;
1415
private String until;
1516

16-
public EventsCmdImpl(EventsCmd.Exec exec) {
17+
public EventsCmdImpl(EventsCmd.Exec exec, EventCallback eventCallback) {
1718
super(exec);
19+
this.eventCallback = eventCallback;
1820
}
1921

2022
@Override
@@ -29,16 +31,23 @@ public EventsCmd withUntil(String until) {
2931
return this;
3032
}
3133

34+
@Override
3235
public String getSince() {
3336
return since;
3437
}
3538

39+
@Override
3640
public String getUntil() {
3741
return until;
3842
}
3943

4044
@Override
41-
public EventStream exec() {
45+
public EventCallback getEventCallback() {
46+
return eventCallback;
47+
}
48+
49+
@Override
50+
public EventNotifier exec() {
4251
return super.exec();
4352
}
4453

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,29 +1,29 @@
11
package com.github.dockerjava.jaxrs;
22

33
import com.github.dockerjava.api.command.EventsCmd;
4-
import com.github.dockerjava.api.model.EventStream;
4+
import com.github.dockerjava.api.model.EventNotifier;
55
import org.slf4j.Logger;
66
import org.slf4j.LoggerFactory;
77

88
import javax.ws.rs.client.WebTarget;
99
import javax.ws.rs.core.Response;
1010
import java.io.InputStream;
1111

12-
public class EventsCmdExec extends AbstrDockerCmdExec<EventsCmd, EventStream> implements EventsCmd.Exec {
12+
public class EventsCmdExec extends AbstrDockerCmdExec<EventsCmd, EventNotifier> implements EventsCmd.Exec {
1313
private static final Logger LOGGER = LoggerFactory.getLogger(EventsCmdExec.class);
1414

1515
public EventsCmdExec(WebTarget baseResource) {
1616
super(baseResource);
1717
}
1818

1919
@Override
20-
public EventStream exec(EventsCmd command) {
20+
protected EventNotifier execute(EventsCmd command) {
2121
WebTarget webResource = getBaseResource().path("/events")
2222
.queryParam("since", command.getSince())
2323
.queryParam("until", command.getUntil());
2424

2525
LOGGER.trace("GET: {}", webResource);
2626
InputStream inputStream = webResource.request().get(Response.class).readEntity(InputStream.class);
27-
return EventStream.create(inputStream);
27+
return EventNotifier.create(command.getEventCallback(), inputStream);
2828
}
2929
}

0 commit comments

Comments
 (0)