瀏覽代碼

Brought EventService closer to the domain by renaming it DomainEventNotifier and use ubiquitous language in the method signatures (fireHandlingEventRegistered is now cargoWasHandled) in order to make it naturally fit in among the domain services.

peter_backlund 18 年之前
父節點
當前提交
59eff65404

+ 2
- 2
dddsample/src/main/java/se/citerus/dddsample/application/messaging/HandlingEventMessageDelegate.java 查看文件

@@ -13,7 +13,7 @@ import javax.jms.MessageListener;
13 13
  * Consumes JMS messages and delegates notification of misdirected
14 14
  * cargo to the cargo service.
15 15
  * <p/>
16
- * This point of this is to decouple the cargo service from JMS,
16
+ * This point of this is to decouple the tracking service from JMS,
17 17
  * and to allow a thread-based messaging implementation to live in
18 18
  * parallell.
19 19
  */
@@ -27,7 +27,7 @@ public class HandlingEventMessageDelegate implements MessageListener {
27 27
       logger.debug("Received message " + message);
28 28
     }
29 29
     try {
30
-      String tidString = message.getStringProperty(JmsEventServiceImpl.TRACKING_ID_KEY);
30
+      String tidString = message.getStringProperty(JmsDomainEventNotifierImpl.TRACKING_ID_KEY);
31 31
       trackingService.notify(new TrackingId(tidString));
32 32
     } catch (JMSException e) {
33 33
       logger.error(e, e);

dddsample/src/main/java/se/citerus/dddsample/application/messaging/JmsEventServiceImpl.java → dddsample/src/main/java/se/citerus/dddsample/application/messaging/JmsDomainEventNotifierImpl.java 查看文件

@@ -4,19 +4,19 @@ import org.springframework.jms.core.JmsOperations;
4 4
 import org.springframework.jms.core.MessageCreator;
5 5
 import se.citerus.dddsample.domain.model.cargo.TrackingId;
6 6
 import se.citerus.dddsample.domain.model.handling.HandlingEvent;
7
-import se.citerus.dddsample.domain.service.EventService;
7
+import se.citerus.dddsample.domain.service.DomainEventNotifier;
8 8
 
9 9
 import javax.jms.*;
10 10
 
11 11
 /**
12 12
  * JMS based implementation.
13 13
  */
14
-public final class JmsEventServiceImpl implements EventService {
14
+public final class JmsDomainEventNotifierImpl implements DomainEventNotifier {
15 15
   private JmsOperations jmsOperations;
16 16
   private Destination destination;
17 17
   public static final String TRACKING_ID_KEY = TrackingId.class.getName() + ".KEY";
18 18
 
19
-  public void fireHandlingEventRegistered(final HandlingEvent event) {
19
+  public void cargoWasHandled(final HandlingEvent event) {
20 20
     jmsOperations.send(destination, new MessageCreator() {
21 21
       // TODO: richer message type
22 22
       public Message createMessage(final Session session) throws JMSException {

+ 25
- 0
dddsample/src/main/java/se/citerus/dddsample/application/messaging/ThreadBasedDomainEventNotifierImpl.java 查看文件

@@ -0,0 +1,25 @@
1
+package se.citerus.dddsample.application.messaging;
2
+
3
+import se.citerus.dddsample.domain.model.handling.HandlingEvent;
4
+import se.citerus.dddsample.domain.service.DomainEventNotifier;
5
+import se.citerus.dddsample.domain.service.TrackingService;
6
+
7
+/**
8
+ * Thread based implementation.
9
+ */
10
+public class ThreadBasedDomainEventNotifierImpl implements DomainEventNotifier {
11
+
12
+  private TrackingService trackingService;
13
+
14
+  public void cargoWasHandled(final HandlingEvent event) {
15
+    new Thread(new Runnable() {
16
+      public void run() {
17
+        trackingService.notify(event.cargo().trackingId());
18
+      }
19
+    }).start();
20
+  }
21
+
22
+  public void setTrackingService(TrackingService trackingService) {
23
+    this.trackingService = trackingService;
24
+  }
25
+}

+ 22
- 0
dddsample/src/main/java/se/citerus/dddsample/domain/service/DomainEventNotifier.java 查看文件

@@ -0,0 +1,22 @@
1
+package se.citerus.dddsample.domain.service;
2
+
3
+import se.citerus.dddsample.domain.model.handling.HandlingEvent;
4
+
5
+/**
6
+ * This interface provides a way to let other parts
7
+ * of the system know about domain events that have occurred.
8
+ * <p/>
9
+ * All method signatures are expressed in the ubiquitous language.    
10
+ * <p/>
11
+ * It may be implemented synchronously or asynchronously, using
12
+ * for example JMS.
13
+ */
14
+public interface DomainEventNotifier {
15
+
16
+  /**
17
+   * A cargo has been handled.
18
+   *
19
+   * @param event handling event
20
+   */
21
+  void cargoWasHandled(HandlingEvent event);
22
+}

+ 4
- 4
dddsample/src/main/java/se/citerus/dddsample/domain/service/HandlingEventServiceImpl.java 查看文件

@@ -21,7 +21,7 @@ public final class HandlingEventServiceImpl implements HandlingEventService {
21 21
   private CarrierMovementRepository carrierMovementRepository;
22 22
   private HandlingEventRepository handlingEventRepository;
23 23
   private LocationRepository locationRepository;
24
-  private EventService eventService;
24
+  private DomainEventNotifier domainEventNotifier;
25 25
 
26 26
   @Transactional(readOnly = false)
27 27
   public void register(final Date completionTime, final TrackingId trackingId, final CarrierMovementId carrierMovementId,
@@ -53,7 +53,7 @@ public final class HandlingEventServiceImpl implements HandlingEventService {
53 53
      */
54 54
     handlingEventRepository.save(event);
55 55
 
56
-    eventService.fireHandlingEventRegistered(event);
56
+    domainEventNotifier.cargoWasHandled(event);
57 57
   }
58 58
 
59 59
   private CarrierMovement findCarrierMovement(final CarrierMovementId carrierMovementId)
@@ -99,7 +99,7 @@ public final class HandlingEventServiceImpl implements HandlingEventService {
99 99
     this.locationRepository = locationRepository;
100 100
   }
101 101
 
102
-  public void setEventService(final EventService eventService) {
103
-    this.eventService = eventService;
102
+  public void setEventService(final DomainEventNotifier domainEventNotifier) {
103
+    this.domainEventNotifier = domainEventNotifier;
104 104
   }
105 105
 }

+ 1
- 1
dddsample/src/main/resources/context-messaging-jms.xml 查看文件

@@ -34,7 +34,7 @@
34 34
     <property name="connectionFactory" ref="jmsConnectionFactory"/>
35 35
   </bean>
36 36
 
37
-  <bean id="eventService" class="se.citerus.dddsample.application.messaging.JmsEventServiceImpl">
37
+  <bean id="domainEventNotifier" class="se.citerus.dddsample.application.messaging.JmsDomainEventNotifierImpl">
38 38
     <property name="jmsOperations" ref="jmsOperations"/>
39 39
     <property name="destination" ref="handlingEventTopic"/>
40 40
   </bean>

+ 1
- 1
dddsample/src/main/resources/context-messaging-thread.xml 查看文件

@@ -4,7 +4,7 @@
4 4
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
5 5
        xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd">
6 6
 
7
-  <bean id="eventService" class="se.citerus.dddsample.application.messaging.ThreadBasedEventServiceImpl">
7
+  <bean id="domainEventNotifier" class="se.citerus.dddsample.application.messaging.ThreadBasedDomainEventNotifierImpl">
8 8
     <property name="bookingService" ref="bookingService"/>
9 9
   </bean>
10 10
 

+ 1
- 1
dddsample/src/main/resources/context-service.xml 查看文件

@@ -24,7 +24,7 @@
24 24
     <property name="handlingEventRepository" ref="handlingEventRepository"/>
25 25
     <property name="carrierMovementRepository" ref="carrierMovementRepository"/>
26 26
     <property name="locationRepository" ref="locationRepository"/>
27
-    <property name="eventService" ref="eventService"/>
27
+    <property name="domainEventNotifier" ref="domainEventNotifier"/>
28 28
   </bean>
29 29
 
30 30
   <bean id="routingService" class="se.citerus.dddsample.application.routing.ExternalRoutingService">

+ 11
- 11
dddsample/src/test/java/se/citerus/dddsample/domain/service/HandlingEventServiceTest.java 查看文件

@@ -18,7 +18,7 @@ import java.util.Date;
18 18
 
19 19
 public class HandlingEventServiceTest extends TestCase {
20 20
   private HandlingEventServiceImpl service;
21
-  private EventService eventService;
21
+  private DomainEventNotifier domainEventNotifier;
22 22
   private CargoRepository cargoRepository;
23 23
   private CarrierMovementRepository carrierMovementRepository;
24 24
   private HandlingEventRepository handlingEventRepository;
@@ -37,17 +37,17 @@ public class HandlingEventServiceTest extends TestCase {
37 37
     carrierMovementRepository = createMock(CarrierMovementRepository.class);
38 38
     handlingEventRepository = createMock(HandlingEventRepository.class);
39 39
     locationRepository = createMock(LocationRepository.class);
40
-    eventService = createMock(EventService.class);
40
+    domainEventNotifier = createMock(DomainEventNotifier.class);
41 41
 
42 42
     service.setCargoRepository(cargoRepository);
43 43
     service.setCarrierMovementRepository(carrierMovementRepository);
44 44
     service.setHandlingEventRepository(handlingEventRepository);
45 45
     service.setLocationRepository(locationRepository);
46
-    service.setEventService(eventService);
46
+    service.setEventService(domainEventNotifier);
47 47
   }
48 48
 
49 49
   protected void tearDown() throws Exception {
50
-    verify(cargoRepository, carrierMovementRepository, handlingEventRepository, eventService);
50
+    verify(cargoRepository, carrierMovementRepository, handlingEventRepository, domainEventNotifier);
51 51
   }
52 52
 
53 53
   public void testRegisterEvent() throws Exception {
@@ -64,9 +64,9 @@ public class HandlingEventServiceTest extends TestCase {
64 64
 
65 65
     // TODO: does not inspect the handling event instance in a sufficient way
66 66
     handlingEventRepository.save(isA(HandlingEvent.class));
67
-    eventService.fireHandlingEventRegistered(isA(HandlingEvent.class));
67
+    domainEventNotifier.cargoWasHandled(isA(HandlingEvent.class));
68 68
 
69
-    replay(cargoRepository, carrierMovementRepository, handlingEventRepository, locationRepository, eventService);
69
+    replay(cargoRepository, carrierMovementRepository, handlingEventRepository, locationRepository, domainEventNotifier);
70 70
     
71 71
     service.register(date, trackingId, carrierMovementId, unLocode, HandlingEvent.Type.LOAD);
72 72
   }
@@ -78,11 +78,11 @@ public class HandlingEventServiceTest extends TestCase {
78 78
     expect(cargoRepository.find(trackingId)).andReturn(cargoABC);
79 79
 
80 80
     handlingEventRepository.save(isA(HandlingEvent.class));
81
-    eventService.fireHandlingEventRegistered(isA(HandlingEvent.class));
81
+    domainEventNotifier.cargoWasHandled(isA(HandlingEvent.class));
82 82
 
83 83
     expect(locationRepository.find(STOCKHOLM.unLocode())).andReturn(STOCKHOLM);
84 84
 
85
-    replay(cargoRepository, carrierMovementRepository, handlingEventRepository, locationRepository, eventService);
85
+    replay(cargoRepository, carrierMovementRepository, handlingEventRepository, locationRepository, domainEventNotifier);
86 86
 
87 87
     service.register(date, trackingId, null, STOCKHOLM.unLocode(), HandlingEvent.Type.CLAIM);
88 88
   }
@@ -99,7 +99,7 @@ public class HandlingEventServiceTest extends TestCase {
99 99
 
100 100
     expect(locationRepository.find(MELBOURNE.unLocode())).andReturn(MELBOURNE);
101 101
     
102
-    replay(cargoRepository, carrierMovementRepository, handlingEventRepository, locationRepository, eventService);
102
+    replay(cargoRepository, carrierMovementRepository, handlingEventRepository, locationRepository, domainEventNotifier);
103 103
     
104 104
     try {
105 105
       service.register(date, trackingId, carrierMovementId, MELBOURNE.unLocode(), HandlingEvent.Type.UNLOAD);
@@ -115,7 +115,7 @@ public class HandlingEventServiceTest extends TestCase {
115 115
 
116 116
     expect(locationRepository.find(HONGKONG.unLocode())).andReturn(HONGKONG);
117 117
     
118
-    replay(cargoRepository, carrierMovementRepository, handlingEventRepository, locationRepository, eventService);
118
+    replay(cargoRepository, carrierMovementRepository, handlingEventRepository, locationRepository, domainEventNotifier);
119 119
     
120 120
     try {
121 121
       service.register(date, trackingId, null, HONGKONG.unLocode(), HandlingEvent.Type.CLAIM);
@@ -131,7 +131,7 @@ public class HandlingEventServiceTest extends TestCase {
131 131
     UnLocode wayOff = new UnLocode("XXYYY");
132 132
     expect(locationRepository.find(wayOff)).andReturn(null);
133 133
     
134
-    replay(cargoRepository, carrierMovementRepository, handlingEventRepository, locationRepository, eventService);
134
+    replay(cargoRepository, carrierMovementRepository, handlingEventRepository, locationRepository, domainEventNotifier);
135 135
     
136 136
     try {
137 137
       service.register(date, trackingId, null, wayOff, HandlingEvent.Type.CLAIM);