Skip to content

Commit 5e93dcb

Browse files
committed
updated messaging example for cleaner separation of publishing and converting messages
1 parent 3b0eb77 commit 5e93dcb

File tree

13 files changed

+183
-102
lines changed

13 files changed

+183
-102
lines changed

pact/pact-message-consumer/src/main/java/io/reflectoring/MessageConsumerConfiguration.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -47,13 +47,13 @@ public SimpleMessageListenerContainer container(ConnectionFactory connectionFact
4747
}
4848

4949
@Bean
50-
public MessageListenerAdapter listenerAdapter(StringMessageConsumer stringMessageConsumer) {
51-
return new MessageListenerAdapter(stringMessageConsumer, "consumeStringMessage");
50+
public MessageListenerAdapter listenerAdapter(UserCreatedMessageConsumer userCreatedMessageConsumer) {
51+
return new MessageListenerAdapter(userCreatedMessageConsumer, "consumeStringMessage");
5252
}
5353

5454
@Bean
55-
public StringMessageConsumer eventReceiver(ObjectMapper objectMapper) {
56-
return new StringMessageConsumer(objectMapper);
55+
public UserCreatedMessageConsumer eventReceiver(ObjectMapper objectMapper) {
56+
return new UserCreatedMessageConsumer(objectMapper);
5757
}
5858

5959
}

pact/pact-message-consumer/src/main/java/io/reflectoring/StringMessageConsumer.java renamed to pact/pact-message-consumer/src/main/java/io/reflectoring/UserCreatedMessageConsumer.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -13,13 +13,13 @@
1313
import org.slf4j.Logger;
1414
import org.slf4j.LoggerFactory;
1515

16-
public class StringMessageConsumer {
16+
public class UserCreatedMessageConsumer {
1717

18-
private Logger logger = LoggerFactory.getLogger(StringMessageConsumer.class);
18+
private Logger logger = LoggerFactory.getLogger(UserCreatedMessageConsumer.class);
1919

2020
private ObjectMapper objectMapper;
2121

22-
public StringMessageConsumer(ObjectMapper objectMapper) {
22+
public UserCreatedMessageConsumer(ObjectMapper objectMapper) {
2323
this.objectMapper = objectMapper;
2424
}
2525

@@ -31,7 +31,7 @@ public void consumeStringMessage(String messageString) throws IOException {
3131
if(!violations.isEmpty()){
3232
throw new ConstraintViolationException(violations);
3333
}
34-
// do something with the message
34+
// pass message into business use case
3535
}
3636

3737
}

pact/pact-message-consumer/src/test/java/io/reflectoring/StringMessageConsumerTest.java renamed to pact/pact-message-consumer/src/test/java/io/reflectoring/UserCreatedMessageConsumerTest.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,14 +17,14 @@
1717

1818
@RunWith(SpringRunner.class)
1919
@SpringBootTest
20-
public class StringMessageConsumerTest {
20+
public class UserCreatedMessageConsumerTest {
2121

2222
@Rule
2323
public MessagePactProviderRule mockProvider = new MessagePactProviderRule(this);
2424
private byte[] currentMessage;
2525

2626
@Autowired
27-
private StringMessageConsumer stringMessageConsumer;
27+
private UserCreatedMessageConsumer userCreatedMessageConsumer;
2828

2929
@Pact(provider = "userservice", consumer = "userclient")
3030
public MessagePact userCreatedMessagePact(MessagePactBuilder builder) {
@@ -46,7 +46,7 @@ public MessagePact userCreatedMessagePact(MessagePactBuilder builder) {
4646
@Test
4747
@PactVerification("userCreatedMessagePact")
4848
public void verifyCreatePersonPact() throws IOException {
49-
stringMessageConsumer.consumeStringMessage(new String(this.currentMessage));
49+
userCreatedMessageConsumer.consumeStringMessage(new String(this.currentMessage));
5050
}
5151

5252
/**

pact/pact-message-provider/src/main/java/io/reflectoring/DemoApplication.java

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,7 @@
11
package io.reflectoring;
22

3-
import org.springframework.amqp.rabbit.annotation.EnableRabbit;
43
import org.springframework.boot.SpringApplication;
54
import org.springframework.boot.autoconfigure.SpringBootApplication;
6-
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
75

86
@SpringBootApplication
97
public class DemoApplication {

pact/pact-message-provider/src/main/java/io/reflectoring/MessageProvider.java

Lines changed: 0 additions & 55 deletions
This file was deleted.
Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package io.reflectoring;
22

3+
import com.fasterxml.jackson.databind.ObjectMapper;
34
import org.springframework.amqp.core.TopicExchange;
45
import org.springframework.amqp.rabbit.core.RabbitTemplate;
56
import org.springframework.context.annotation.Bean;
@@ -8,17 +9,28 @@
89

910
@Configuration
1011
@EnableScheduling
11-
public class MessageProviderConfiguration {
12+
class MessageProviderConfiguration {
1213

1314
@Bean
14-
public TopicExchange senderTopicExchange() {
15+
TopicExchange topicExchange() {
1516
return new TopicExchange("myExchange");
1617
}
1718

1819

1920
@Bean
20-
public MessageProvider eventPublisher(RabbitTemplate rabbitTemplate, TopicExchange senderTopicExchange) {
21-
return new MessageProvider(rabbitTemplate, senderTopicExchange);
21+
UserCreatedMessageProvider messageProvider(ObjectMapper objectMapper, UserCreatedMessagePublisher publisher) {
22+
return new UserCreatedMessageProvider(objectMapper, publisher);
2223
}
2324

25+
@Bean
26+
UserCreatedMessagePublisher messagePublisher(RabbitTemplate rabbitTemplate, TopicExchange topicExchange) {
27+
return new UserCreatedMessagePublisher(rabbitTemplate, topicExchange);
28+
}
29+
30+
@Bean
31+
SendMessageJob job(UserCreatedMessageProvider messageProvider) {
32+
return new SendMessageJob(messageProvider);
33+
}
34+
35+
2436
}
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
package io.reflectoring;
2+
3+
import java.io.IOException;
4+
import java.util.Random;
5+
import java.util.UUID;
6+
7+
import org.springframework.scheduling.annotation.Scheduled;
8+
9+
class SendMessageJob {
10+
11+
private Random random = new Random();
12+
13+
private UserCreatedMessageProvider messageProvider;
14+
15+
SendMessageJob(UserCreatedMessageProvider messageProvider) {
16+
this.messageProvider = messageProvider;
17+
}
18+
19+
/**
20+
* This scheduled job simulates the "real" business logic that should produce messages.
21+
*/
22+
@Scheduled(fixedDelay = 1000)
23+
void sendUserCreatedMessage() {
24+
try {
25+
UserCreatedMessage userCreatedMessage = UserCreatedMessage.builder()
26+
.messageUuid(UUID.randomUUID().toString())
27+
.user(User.builder()
28+
.id(random.nextLong())
29+
.name("Zaphpod Beeblebrox")
30+
.build())
31+
.build();
32+
messageProvider.sendUserCreatedMessage(userCreatedMessage);
33+
} catch (IOException e) {
34+
throw new RuntimeException(e);
35+
}
36+
}
37+
}

pact/pact-message-provider/src/main/java/io/reflectoring/User.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,12 @@
22

33
import javax.validation.constraints.NotNull;
44

5+
import lombok.Builder;
56
import lombok.Data;
67

78
@Data
8-
public class User {
9+
@Builder
10+
class User {
911

1012
@NotNull
1113
private long id;

pact/pact-message-provider/src/main/java/io/reflectoring/UserCreatedMessage.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,12 @@
22

33
import javax.validation.constraints.NotNull;
44

5+
import lombok.Builder;
56
import lombok.Data;
67

78
@Data
8-
public class UserCreatedMessage {
9+
@Builder
10+
class UserCreatedMessage {
911

1012
@NotNull
1113
private String messageUuid;
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
package io.reflectoring;
2+
3+
import java.io.IOException;
4+
5+
import com.fasterxml.jackson.databind.ObjectMapper;
6+
import org.slf4j.Logger;
7+
import org.slf4j.LoggerFactory;
8+
9+
/**
10+
* Takes a {@link UserCreatedMessage}, converts it to a {@link String} and sends it to be published.
11+
*/
12+
class UserCreatedMessageProvider {
13+
14+
private Logger logger = LoggerFactory.getLogger(UserCreatedMessageProvider.class);
15+
16+
private ObjectMapper objectMapper;
17+
18+
private UserCreatedMessagePublisher userCreatedMessagePublisher;
19+
20+
UserCreatedMessageProvider(ObjectMapper objectMapper, UserCreatedMessagePublisher userCreatedMessagePublisher) {
21+
this.objectMapper = objectMapper;
22+
this.userCreatedMessagePublisher = userCreatedMessagePublisher;
23+
}
24+
25+
void sendUserCreatedMessage(UserCreatedMessage message) throws IOException {
26+
String stringMessage = objectMapper.writeValueAsString(message);
27+
userCreatedMessagePublisher.publishMessage(stringMessage, "user.created");
28+
logger.info("Published message '{}'", stringMessage);
29+
}
30+
31+
}

0 commit comments

Comments
 (0)