1010import org .springframework .beans .factory .annotation .Autowired ;
1111import org .springframework .context .annotation .Bean ;
1212import org .springframework .context .annotation .Configuration ;
13- import org .springframework .transaction .annotation .Transactional ;
1413import org .sterl .spring .persistent_tasks .AbstractSpringTest ;
15- import org .sterl .spring .persistent_tasks .api .RetryStrategy ;
1614import org .sterl .spring .persistent_tasks .api .PersistentTask ;
15+ import org .sterl .spring .persistent_tasks .api .RetryStrategy ;
16+ import org .sterl .spring .persistent_tasks .api .TransactionalTask ;
1717import org .sterl .spring .persistent_tasks .api .TaskId .TaskTriggerBuilder ;
1818import org .sterl .spring .persistent_tasks .api .TriggerKey ;
1919import org .sterl .spring .persistent_tasks .shared .model .TriggerStatus ;
@@ -24,15 +24,13 @@ class SchedulerServiceTransactionTest extends AbstractSpringTest {
2424
2525 private SchedulerService subject ;
2626 private static AtomicBoolean sendError = new AtomicBoolean (false );
27- private static AtomicBoolean inTrx = new AtomicBoolean (false );
2827 @ Autowired private PersonRepository personRepository ;
2928
3029 @ Configuration
3130 static class Config {
3231 @ Bean
33- PersistentTask <String > savePerson (PersonRepository personRepository ) {
34- return new PersistentTask <>() {
35- @ Transactional
32+ PersistentTask <String > savePersonInTrx (PersonRepository personRepository ) {
33+ return new TransactionalTask <String >() {
3634 @ Override
3735 public void accept (String name ) {
3836 personRepository .save (new PersonBE (name ));
@@ -43,9 +41,21 @@ public void accept(String name) {
4341 public RetryStrategy retryStrategy () {
4442 return RetryStrategy .THREE_RETRIES_IMMEDIATELY ;
4543 }
44+ };
45+ }
46+
47+ @ Bean
48+ PersistentTask <String > savePersonNoTrx (PersonRepository personRepository ) {
49+ return new PersistentTask <>() {
4650 @ Override
47- public boolean isTransactional () {
48- return inTrx .get ();
51+ public void accept (String name ) {
52+ personRepository .save (new PersonBE (name ));
53+ if (sendError .get ()) {
54+ throw new RuntimeException ("Error requested for " + name );
55+ }
56+ }
57+ public RetryStrategy retryStrategy () {
58+ return RetryStrategy .THREE_RETRIES_IMMEDIATELY ;
4959 }
5060 };
5161 }
@@ -57,64 +67,63 @@ public void beforeEach() throws Exception {
5767 subject = schedulerService ;
5868 personRepository .deleteAllInBatch ();
5969 sendError .set (false );
60- inTrx .set (false );
6170 }
62-
71+
6372 @ Test
64- void testSaveEntity () throws Exception {
73+ void testSaveTransactions () throws Exception {
6574 // GIVEN
66- final var trigger = TaskTriggerBuilder .newTrigger ("savePerson" ).state ("Paul" ).build ();
75+ final var request = TaskTriggerBuilder .newTrigger ("savePersonNoTrx" ).state ("Paul" ).build ();
76+ var trigger = triggerService .queue (request );
6777
6878 // WHEN
6979 hibernateAsserts .reset ();
70- subject . runOrQueue (trigger ). get ( );
80+ triggerService . run (trigger );
7181
7282 // THEN
73- // AND one the service, one the event and one more status update,
74- // one more to save the trigger
75- hibernateAsserts .assertTrxCount (4 );
83+ // AND one the service, one the event and one more status update
84+ hibernateAsserts .assertTrxCount (3 );
7685 assertThat (personRepository .count ()).isOne ();
7786 }
7887
88+
7989 @ Test
80- void testSaveTransactions () throws Exception {
90+ void testTrxCountTriggerService () throws Exception {
8191 // GIVEN
82- final var request = TaskTriggerBuilder .newTrigger ("savePerson " ).state ("Paul" ).build ();
92+ final var request = TaskTriggerBuilder .newTrigger ("savePersonInTrx " ).state ("Paul" ).build ();
8393 var trigger = triggerService .queue (request );
8494
8595 // WHEN
8696 hibernateAsserts .reset ();
8797 triggerService .run (trigger );
8898
8999 // THEN
90- // AND one the service, one the event and one more status update
91- hibernateAsserts .assertTrxCount (3 );
100+ hibernateAsserts .assertTrxCount (1 );
92101 assertThat (personRepository .count ()).isOne ();
93102 }
94-
95103
96104 @ Test
97- void testTrxCountTriggerService () throws Exception {
105+ void testFailTrxCount () throws Exception {
98106 // GIVEN
99- final var request = TaskTriggerBuilder .newTrigger ("savePerson " ).state ("Paul" ).build ();
107+ final var request = TaskTriggerBuilder .newTrigger ("savePersonInTrx " ).state ("Paul" ).build ();
100108 var trigger = triggerService .queue (request );
101- inTrx .set (true );
109+ sendError .set (true );
102110
103111 // WHEN
104112 hibernateAsserts .reset ();
105113 triggerService .run (trigger );
106114
107115 // THEN
108- hibernateAsserts .assertTrxCount (1 );
109- assertThat (personRepository .count ()).isOne ();
116+ // first the work which runs on error
117+ // second the update to the trigger
118+ // third to write the history
119+ hibernateAsserts .assertTrxCount (3 );
110120 }
111121
112122 @ Test
113123 void testRollbackAndRetry () throws Exception {
114124 // GIVEN
115- final var triggerRequest = TaskTriggerBuilder .newTrigger ("savePerson " ).state ("Paul" ).build ();
125+ final var triggerRequest = TaskTriggerBuilder .newTrigger ("savePersonInTrx " ).state ("Paul" ).build ();
116126 sendError .set (true );
117- inTrx .set (true );
118127
119128 // WHEN
120129 var key = subject .runOrQueue (triggerRequest );
0 commit comments