Skip to content

Commit c69c074

Browse files
authored
Merge pull request #3 from pbinitiative/feature/small-improvements
- Initialize ApiClient during the Spring application context initialization lifecycle to prevent creation of multiple appClients - Use safer AtomicBoolean instead of volatile boolean for safer multithreaded use case - Add command to build the project straight from README.md
2 parents 833c30a + 7958837 commit c69c074

3 files changed

Lines changed: 44 additions & 36 deletions

File tree

README.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,9 @@
1010
* OpenTelemetry interceptors for REST and spans for gRPC
1111
* Configurable HTTP/gRPC logging
1212

13+
## Build this project
14+
``mvn clean package``
15+
1316
## Getting started
1417

1518
Add the starter to your application and the core client as needed.

zenbpm-spring-boot-starter/src/main/java/org/zenbpm/grpc/ZenbpmJobWorkerManager.java

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828
import java.util.*;
2929
import java.util.concurrent.ConcurrentHashMap;
3030
import java.util.concurrent.TimeUnit;
31+
import java.util.concurrent.atomic.AtomicBoolean;
3132

3233
import org.slf4j.Logger;
3334
import org.slf4j.LoggerFactory;
@@ -41,7 +42,7 @@ public class ZenbpmJobWorkerManager implements BeanPostProcessor, SmartLifecycle
4142

4243
private final Map<String, Handler> handlers = new ConcurrentHashMap<>();
4344

44-
private volatile boolean running = false;
45+
private final AtomicBoolean running = new AtomicBoolean(false);
4546

4647
private ManagedChannel channel;
4748
private StreamObserver<Zenbpm.JobStreamRequest> requestObserver;
@@ -70,7 +71,7 @@ public Object postProcessAfterInitialization(@NotNull Object bean, @NotNull Stri
7071

7172
@Override
7273
public void start() {
73-
if (running || handlers.isEmpty()) {
74+
if (running.get() || handlers.isEmpty()) {
7475
return;
7576
}
7677
ManagedChannelBuilder<?> chBuilder = ManagedChannelBuilder
@@ -99,13 +100,13 @@ public void onNext(Zenbpm.JobStreamResponse resp) {
99100
@Override
100101
public void onError(Throwable t) {
101102
log.error("Stream error", t);
102-
running = false;
103+
running.set(false);
103104
}
104105

105106
@Override
106107
public void onCompleted() {
107108
log.info("Stream completed by server");
108-
running = false;
109+
running.set(false);
109110
}
110111
};
111112

@@ -120,7 +121,7 @@ public void onCompleted() {
120121
requestObserver.onNext(req);
121122
}
122123

123-
running = true;
124+
running.set(true);
124125
}
125126

126127
private Collection<String> getJobTypes() {
@@ -228,7 +229,7 @@ private ByteString serializeResult(Object result) throws JsonProcessingException
228229

229230
@Override
230231
public void stop() {
231-
if (!running) return;
232+
if (!running.get()) return;
232233
try {
233234
if (requestObserver != null) {
234235
try {
@@ -245,13 +246,13 @@ public void stop() {
245246
} catch (InterruptedException e) {
246247
Thread.currentThread().interrupt();
247248
} finally {
248-
running = false;
249+
running.set(false);
249250
}
250251
}
251252

252253
@Override
253254
public boolean isRunning() {
254-
return running;
255+
return running.get();
255256
}
256257

257258
@Override

zenbpm-spring-boot-starter/src/main/java/org/zenbpm/rest/ZenbpmClientService.java

Lines changed: 32 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,8 @@
1010
import org.zenbpm.ZenbpmClientProperties;
1111
import org.zenbpm.client.ApiClient;
1212

13+
import javax.annotation.PostConstruct;
14+
1315
@Service
1416
public class ZenbpmClientService {
1517

@@ -20,41 +22,43 @@ public class ZenbpmClientService {
2022

2123
private ApiClient apiClient;
2224

23-
public ApiClient getApiClient() {
24-
initApiClient();
25-
return apiClient;
26-
}
27-
2825
public ZenbpmClientService(ZenbpmClientProperties properties, ObjectProvider<OpenTelemetry> openTelemetry) {
2926
this.properties = properties;
3027
this.openTelemetry = openTelemetry;
3128
}
3229

30+
@PostConstruct
31+
private void init() {
32+
initApiClient();
33+
}
34+
35+
public ApiClient getApiClient() {
36+
return apiClient;
37+
}
38+
3339
private void initApiClient() {
34-
if (apiClient == null) {
35-
apiClient = new ApiClient();
36-
apiClient.setBasePath(properties.getRestUrl());
37-
38-
OkHttpClient.Builder builder = apiClient.getHttpClient().newBuilder();
39-
40-
OpenTelemetry otel = openTelemetry.getIfAvailable();
41-
if (properties.isOtelEnabled() && otel != null) {
42-
builder.addInterceptor(new ZenbpmOkHttpOtelInterceptor(otel));
43-
}
44-
45-
if (properties.isRestLoggingEnabled()) {
46-
HttpLoggingInterceptor.Logger slf4jLogger = this::logHttpMessage;
47-
HttpLoggingInterceptor interceptor = new HttpLoggingInterceptor(slf4jLogger);
48-
interceptor.setLevel(
49-
log.isTraceEnabled()
50-
? HttpLoggingInterceptor.Level.BODY
51-
: HttpLoggingInterceptor.Level.BASIC
52-
);
53-
builder.addInterceptor(interceptor);
54-
}
55-
56-
apiClient.setHttpClient(builder.build());
40+
apiClient = new ApiClient();
41+
apiClient.setBasePath(properties.getRestUrl());
42+
43+
OkHttpClient.Builder builder = apiClient.getHttpClient().newBuilder();
44+
45+
OpenTelemetry otel = openTelemetry.getIfAvailable();
46+
if (properties.isOtelEnabled() && otel != null) {
47+
builder.addInterceptor(new ZenbpmOkHttpOtelInterceptor(otel));
48+
}
49+
50+
if (properties.isRestLoggingEnabled()) {
51+
HttpLoggingInterceptor.Logger slf4jLogger = this::logHttpMessage;
52+
HttpLoggingInterceptor interceptor = new HttpLoggingInterceptor(slf4jLogger);
53+
interceptor.setLevel(
54+
log.isTraceEnabled()
55+
? HttpLoggingInterceptor.Level.BODY
56+
: HttpLoggingInterceptor.Level.BASIC
57+
);
58+
builder.addInterceptor(interceptor);
5759
}
60+
61+
apiClient.setHttpClient(builder.build());
5862
}
5963

6064
private void logHttpMessage(String message) {

0 commit comments

Comments
 (0)