<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-all</artifactId>
<version>2.7.3</version>
</dependency>
public interface OrderService {
@Transactional(propagation = Propagation.REQUIRED, isolation = Isolation.DEFAULT, rollbackFor = Exception.class)
Order createOrder(OrderDto orderDto);
}
@Service
public class OrderServiceImpl implements OrderService {
@Autowired
private InventoryService inventoryService;
@Autowired
private UserService userService;
@Override
public Order createOrder(OrderDto orderDto) {
inventoryService.reserve(orderDto.getProductId(), orderDto.getQuantity());
userService.charge(orderDto.getUserId(), orderDto.getAmount());
Order order = orderMapper.create(orderDto);
return order;
}
}
<dubbo:protocol name="dubbo" port="20880" />
<dubbo:provider>
<dubbo:service filter="dubboTransactionFilter" />
</dubbo:provider>
<dubbo:reference interface="com.example.OrderService" id="orderService" />
<dubbo:consumer>
<dubbo:reference filter="dubboTransactionFilter" />
</dubbo:consumer>
<bean id="transactionManager" class="com.atomikos.icatch.jta.UserTransactionManager">
<property name="forceShutdown" value="false" />
</bean>
<bean id="userTransaction" class="com.atomikos.icatch.jta.UserTransactionImp">
<property name="transactionTimeout" value="300" />
</bean>
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = {"classpath:spring.xml"})
public class OrderServiceTest {
@Autowired
private OrderService orderService;
@Test
public void testCreateOrder() {
OrderDto orderDto = new OrderDto();
Order order = orderService.createOrder(orderDto);
}
}