Skip to content

Commit c17ea30

Browse files
author
Liviu Ilea
committed
jooq-notx: unfinished
1 parent be05bdd commit c17ea30

File tree

45 files changed

+1113
-26
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

45 files changed

+1113
-26
lines changed

README.md

+14
Original file line numberDiff line numberDiff line change
@@ -5,3 +5,17 @@ This repository contains samples of various prototype projects built with Spring
55

66
### http-adapter
77
Sample of an HTTP integration service between a client using one API and a backend using a different API.
8+
##### Setup
9+
`cd http-adapter`
10+
11+
`mvn clean install`
12+
13+
### jooq-notx
14+
Sample service that uses jOOQ to query a postgres database. Database access is non-transactional (for now).
15+
16+
##### Setup
17+
`cd jooq-notx`
18+
19+
`./jooq-notx-service/src/sql/setup/setup-db.sh`
20+
21+
`mvn clean install`

http-adapter/http-adapter-integration-test/pom.xml

+1-1
Original file line numberDiff line numberDiff line change
@@ -90,7 +90,7 @@
9090
</execution>
9191
</executions>
9292
<configuration>
93-
<mainClass>org.codemental.samples.webflux.java.http.adapter.main.HttpAdapterApplication</mainClass>
93+
<mainClass>org.codemental.samples.webflux.java.jooq.adapter.main.HttpAdapterApplication</mainClass>
9494
</configuration>
9595
</plugin>
9696
</plugins>
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package org.codemental.samples.webflux.java.http.adapter.integration.config;
1+
package org.codemental.samples.webflux.java.jooq.adapter.integration.config;
22

33
import com.consol.citrus.dsl.endpoint.CitrusEndpoints;
44
import com.consol.citrus.http.client.HttpClient;
@@ -8,10 +8,8 @@
88
import org.springframework.context.annotation.Import;
99
import org.springframework.context.annotation.PropertySource;
1010
import org.springframework.http.MediaType;
11-
import org.springframework.test.context.ContextConfiguration;
1211

1312

14-
@ContextConfiguration()
1513
@PropertySource(value = "citrus.properties")
1614
@Import({})// you can import more configuration classes here
1715
public class CitrusConfiguration {
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package org.codemental.samples.webflux.java.http.adapter.integration.test;
1+
package org.codemental.samples.webflux.java.jooq.adapter.integration.test;
22

33
import com.consol.citrus.annotations.CitrusTest;
44
import com.consol.citrus.dsl.testng.TestNGCitrusTestRunner;
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,7 @@
1+
http.adapter.service.url=localhost:8080
2+
external.api.mock.port=9090
3+
4+
15
# citrus internal configuration
2-
citrus.spring.java.config=org.codemental.samples.webflux.java.http.adapter.integration.config.CitrusConfiguration
6+
citrus.spring.java.config=org.codemental.samples.webflux.java.jooq.adapter.integration.config.CitrusConfiguration
37
citrus.html.report.enabled=false
Original file line numberDiff line numberDiff line change
@@ -1,2 +0,0 @@
1-
http.adapter.service.url=localhost:8080
2-
external.api.mock.port=9090

http-adapter/http-adapter-service/pom.xml

+1-1
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@
3535
<artifactId>netty-transport-native-epoll</artifactId>
3636
</dependency>
3737
</dependencies>
38-
38+
3939
<build>
4040
<plugins>
4141
<plugin>
+6-6
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
1-
package org.codemental.samples.webflux.java.http.adapter.controller;
1+
package org.codemental.samples.webflux.java.jooq.adapter.controller;
22

33

4-
import org.codemental.samples.webflux.java.http.adapter.model.inbound.NotificationRequest;
5-
import org.codemental.samples.webflux.java.http.adapter.model.inbound.NotificationResponse;
6-
import org.codemental.samples.webflux.java.http.adapter.model.outbound.ReportRequest;
7-
import org.codemental.samples.webflux.java.http.adapter.model.outbound.ReportResponse;
4+
import org.codemental.samples.webflux.java.jooq.adapter.model.inbound.NotificationRequest;
5+
import org.codemental.samples.webflux.java.jooq.adapter.model.inbound.NotificationResponse;
6+
import org.codemental.samples.webflux.java.jooq.adapter.model.outbound.ReportRequest;
7+
import org.codemental.samples.webflux.java.jooq.adapter.model.outbound.ReportResponse;
88
import org.springframework.beans.factory.annotation.Autowired;
99
import org.springframework.http.HttpStatus;
1010
import org.springframework.http.MediaType;
@@ -28,7 +28,7 @@ public class InboundApiController {
2828
private WebClient outboundApiClient;
2929

3030
@PostMapping("/inbound")
31-
Mono<NotificationResponse> notify(@RequestBody NotificationRequest notificationRequest) {
31+
public Mono<NotificationResponse> notify(@RequestBody NotificationRequest notificationRequest) {
3232
return Mono.justOrEmpty(notificationRequest)
3333
.log()
3434
.map(this::mapToReqOut)
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package org.codemental.samples.webflux.java.http.adapter.errorhandling;
1+
package org.codemental.samples.webflux.java.jooq.adapter.errorhandling;
22

33
import io.netty.handler.timeout.ReadTimeoutException;
44
import org.slf4j.Logger;
+2-2
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
1-
package org.codemental.samples.webflux.java.http.adapter.main;
1+
package org.codemental.samples.webflux.java.jooq.adapter.main;
22

3-
import org.codemental.samples.webflux.java.http.adapter.errorhandling.BackendConnectionExceptionTranslator;
3+
import org.codemental.samples.webflux.java.jooq.adapter.errorhandling.BackendConnectionExceptionTranslator;
44
import org.springframework.context.annotation.Bean;
55

66
public class ErrorHandlingConfiguration {
+1-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package org.codemental.samples.webflux.java.http.adapter.main;
1+
package org.codemental.samples.webflux.java.jooq.adapter.main;
22

33
import org.springframework.boot.SpringApplication;
44
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
+2-2
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
1-
package org.codemental.samples.webflux.java.http.adapter.main;
1+
package org.codemental.samples.webflux.java.jooq.adapter.main;
22

33
import io.netty.channel.ChannelOption;
44
import io.netty.handler.timeout.ReadTimeoutHandler;
55
import org.springframework.beans.factory.annotation.Value;
66
import org.springframework.context.annotation.Bean;
77
import org.springframework.http.client.reactive.ReactorClientHttpConnector;
88
import org.springframework.web.reactive.function.client.WebClient;
9-
import org.codemental.samples.webflux.java.http.adapter.controller.InboundApiController;
9+
import org.codemental.samples.webflux.java.jooq.adapter.controller.InboundApiController;
1010

1111
import java.util.concurrent.TimeUnit;
1212

Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package org.codemental.samples.webflux.java.http.adapter.model.inbound;
1+
package org.codemental.samples.webflux.java.jooq.adapter.model.inbound;
22

33
public class NotificationRequest {
44

Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package org.codemental.samples.webflux.java.http.adapter.model.inbound;
1+
package org.codemental.samples.webflux.java.jooq.adapter.model.inbound;
22

33
public class NotificationResponse {
44

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package org.codemental.samples.webflux.java.http.adapter.model.outbound;
1+
package org.codemental.samples.webflux.java.jooq.adapter.model.outbound;
22

33
import java.time.LocalDateTime;
44

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package org.codemental.samples.webflux.java.http.adapter.model.outbound;
1+
package org.codemental.samples.webflux.java.jooq.adapter.model.outbound;
22

33

44
public class ReportResponse {
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,104 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<project xmlns="http://maven.apache.org/POM/4.0.0"
3+
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
4+
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
5+
<parent>
6+
<groupId>org.codemental.samples.webflux.java.jooq.notx</groupId>
7+
<artifactId>jooq-notx</artifactId>
8+
<version>1.0.0-SNAPSHOT</version>
9+
</parent>
10+
<modelVersion>4.0.0</modelVersion>
11+
12+
<artifactId>jooq-notx-integration-test</artifactId>
13+
14+
<dependencies>
15+
<dependency>
16+
<groupId>org.codemental.samples.webflux.java.jooq.notx</groupId>
17+
<artifactId>jooq-notx-service</artifactId>
18+
<version>1.0.0-SNAPSHOT</version>
19+
</dependency>
20+
<dependency>
21+
<groupId>com.consol.citrus</groupId>
22+
<artifactId>citrus-core</artifactId>
23+
</dependency>
24+
<dependency>
25+
<groupId>com.consol.citrus</groupId>
26+
<artifactId>citrus-java-dsl</artifactId>
27+
</dependency>
28+
<dependency>
29+
<groupId>com.consol.citrus</groupId>
30+
<artifactId>citrus-http</artifactId>
31+
</dependency>
32+
<dependency>
33+
<groupId>org.testng</groupId>
34+
<artifactId>testng</artifactId>
35+
</dependency>
36+
<dependency>
37+
<groupId>commons-dbcp</groupId>
38+
<artifactId>commons-dbcp</artifactId>
39+
</dependency>
40+
<dependency>
41+
<groupId>org.apache.logging.log4j</groupId>
42+
<artifactId>log4j-slf4j-impl</artifactId>
43+
</dependency>
44+
<dependency>
45+
<groupId>org.apache.logging.log4j</groupId>
46+
<artifactId>log4j-core</artifactId>
47+
</dependency>
48+
<dependency>
49+
<groupId>org.slf4j</groupId>
50+
<artifactId>slf4j-log4j12</artifactId>
51+
</dependency>
52+
</dependencies>
53+
54+
<build>
55+
<plugins>
56+
<!-- disable running unit tests -->
57+
<plugin>
58+
<groupId>org.apache.maven.plugins</groupId>
59+
<artifactId>maven-surefire-plugin</artifactId>
60+
<configuration>
61+
<skipTests>true</skipTests>
62+
</configuration>
63+
</plugin>
64+
<!-- setup running integration tests -->
65+
<plugin>
66+
<groupId>org.apache.maven.plugins</groupId>
67+
<artifactId>maven-failsafe-plugin</artifactId>
68+
<executions>
69+
<execution>
70+
<id>integration-tests</id>
71+
<goals>
72+
<goal>integration-test</goal>
73+
<goal>verify</goal>
74+
</goals>
75+
</execution>
76+
</executions>
77+
</plugin>
78+
<plugin>
79+
<groupId>org.springframework.boot</groupId>
80+
<artifactId>spring-boot-maven-plugin</artifactId>
81+
<executions>
82+
<execution>
83+
<id>start-app</id>
84+
<phase>pre-integration-test</phase>
85+
<goals>
86+
<goal>start</goal>
87+
</goals>
88+
</execution>
89+
<execution>
90+
<id>stop-app</id>
91+
<phase>post-integration-test</phase>
92+
<goals>
93+
<goal>stop</goal>
94+
</goals>
95+
</execution>
96+
</executions>
97+
<configuration>
98+
<mainClass>org.codemental.samples.webflux.java.jooq.notx.main.JooqNoTxApplication</mainClass>
99+
</configuration>
100+
</plugin>
101+
</plugins>
102+
</build>
103+
104+
</project>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
package org.codemental.samples.webflux.java.jooq.notx.integration.config;
2+
3+
import com.consol.citrus.dsl.endpoint.CitrusEndpoints;
4+
import com.consol.citrus.http.client.HttpClient;
5+
import org.springframework.beans.factory.annotation.Value;
6+
import org.springframework.context.annotation.Bean;
7+
import org.springframework.context.annotation.Import;
8+
import org.springframework.context.annotation.PropertySource;
9+
import org.springframework.http.MediaType;
10+
11+
12+
@PropertySource(value = "citrus.properties")
13+
@Import({DatabaseConfiguration.class})
14+
public class CitrusConfiguration {
15+
16+
@Value("${jooq.notx.service.url}")
17+
private String serviceUrl;
18+
19+
@Bean
20+
public HttpClient httpClient() {
21+
return CitrusEndpoints.http()
22+
.client()
23+
.requestUrl("http://" + serviceUrl)
24+
.contentType(MediaType.APPLICATION_JSON_UTF8_VALUE)
25+
.build();
26+
}
27+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
package org.codemental.samples.webflux.java.jooq.notx.integration.config;
2+
3+
4+
import org.apache.commons.dbcp.BasicDataSource;
5+
import org.springframework.beans.factory.annotation.Value;
6+
import org.springframework.context.annotation.Bean;
7+
8+
public class DatabaseConfiguration {
9+
10+
@Value("${jooq.notx.db.host}")
11+
private String dbHost;
12+
@Value("${jooq.notx.db.port}")
13+
private int dbPort;
14+
@Value("${jooq.notx.db.user}")
15+
private String dbUser;
16+
@Value("${jooq.notx.db.pass}")
17+
private String dbPass;
18+
19+
@Bean()
20+
public BasicDataSource jooqNotxDatasource() {
21+
BasicDataSource dataSource = new BasicDataSource();
22+
23+
dataSource.setDriverClassName("org.postgresql.Driver");
24+
dataSource.setUrl(String.format("jdbc:postgresql://%s:%d/vps_prov", dbHost, dbPort));
25+
dataSource.setUsername(dbUser);
26+
dataSource.setPassword(dbPass);
27+
dataSource.setInitialSize(1);
28+
dataSource.setMaxActive(5);
29+
30+
return dataSource;
31+
}
32+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
package org.codemental.samples.webflux.java.jooq.notx.integration.test;
2+
3+
import com.consol.citrus.annotations.CitrusTest;
4+
import com.consol.citrus.dsl.testng.TestNGCitrusTestRunner;
5+
import com.consol.citrus.http.client.HttpClient;
6+
import org.springframework.beans.factory.annotation.Autowired;
7+
import org.springframework.http.HttpStatus;
8+
import org.springframework.http.MediaType;
9+
import org.testng.annotations.Test;
10+
11+
import javax.sql.DataSource;
12+
13+
@Test
14+
public class UserControllerIT extends TestNGCitrusTestRunner {
15+
16+
@Autowired
17+
private HttpClient httpClient;
18+
@Autowired
19+
private DataSource jooqNotxDatasource;
20+
21+
@CitrusTest
22+
public void createUserTest() {
23+
http(action -> action.client(httpClient)
24+
.send()
25+
.post("api/user")
26+
.payload("{" +
27+
"\"firstName\": \"Bruce\"," +
28+
"\"lastName\": \"Wayne\"," +
29+
"\"title\": \"Batman\"," +
30+
"\"email\": \"[email protected]\"" +
31+
"}")
32+
.fork(true));
33+
34+
http(action -> action.client(httpClient)
35+
.receive()
36+
.response(HttpStatus.OK)
37+
.contentType(MediaType.APPLICATION_JSON_UTF8_VALUE)
38+
.payload("{" +
39+
"\"success\": true" +
40+
"}"));
41+
}
42+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
# citrus internal configuration
2+
citrus.spring.java.config=org.codemental.samples.webflux.java.jooq.notx.integration.config.CitrusConfiguration
3+
citrus.html.report.enabled=false
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
jooq.notx.service.url=localhost:8080
2+
3+
jooq.notx.db.host=localhost
4+
jooq.notx.db.port=5432
5+
jooq.notx.db.user=webflux_samples_user
6+
jooq.notx.db.pass=webflux

0 commit comments

Comments
 (0)