gpt4 book ai didi

spring - 如何在事务中调用Mule Flow中的多个http webservice?

转载 作者:行者123 更新时间:2023-12-02 02:47:44 25 4
gpt4 key购买 nike

我是骡子的新手。我有一个 spring-hibernate mule 设置。假设有 3 个 Web 服务。目的是在 Mule 流中调用所有这些 Web 服务,以便所有 3 个 Web 服务都在一个事务中。因此,假设如果第 3 个 Web 服务失败,那么前 2 个 Web 服务将自动回滚。

这是我尝试过的代码片段。我的 mule-flow.xml(目前我只有一个 Web 服务,请告诉我如何在流程中添加多个 Web 服务调用?)

<spring:beans>
<spring:import resource="classpath:spring-mule.xml"/>
<spring:import resource="classpath:applicationContext-persistence.xml"/>
</spring:beans>

<flow name="addCustomer" doc:name="addCustomer">
<http:inbound-endpoint exchange-pattern="request-response"
address="http://localhost:8081/pos/addCustomer" doc:name="HTTP" />

<cxf:simple-service serviceClass="com.proj.pos.webservice.interfac.CustomerService" doc:name="SOAP"/>
<component ><spring-object bean="customerService"/></component>
</flow>

</mule>

我的 spring-mule.xml

<bean id="customerService"  class="com.proj.pos.webservice.implementation.CustomerServiceImpl">
<property name="cusDao" >
<ref local="customerDao"/>
</property>
</bean>

我的:applicationContext-persistence.xml

     <bean id="datasource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="oracle.jdbc.OracleDriver" />
<property name="url" value="jdbc:oracle:thin:@localhost:1521:xe" />
<property name="username" value="xyz" />
<property name="password" value="xyz" />
</bean>

<bean id="sessionFactory"
class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="dataSource" ref="datasource" />
<property name="configLocation">
<value>classpath:hibernate.cfg.xml</value>
</property>
<property name="configurationClass">
<value>org.hibernate.cfg.AnnotationConfiguration</value>
</property>
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">org.hibernate.dialect.Oracle10gDialect</prop>
<prop key="hibernate.show_sql">true</prop>
<prop key="cache.provider_class">org.hibernate.cache.NoCacheProvider</prop>
<prop key="hibernate.connection.release_mode">auto</prop>
</props>
</property>
</bean>

<tx:annotation-driven />
<bean id="transactionManager"
class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory" />
</bean>

<bean id="customerDao" class="com.proj.pos.dao.implementation.CustomerDaoImpl">
<property name="sessionFactory">
<ref local="sessionFactory"/>
</property>
</bean>

我的 CustomerServiceImpl

@WebService(endpointInterface = "com.proj.pos.webservice.interfac.CustomerService",
serviceName = "CustomerService")
public class CustomerServiceImpl implements CustomerService {

@Autowired
private CustomerDao cusDao;

@Transactional //NOTE:USING THIS ANNOTATION I AM ABLE TO ACHIEVE THE BELOW METHOD //IN TRANSACTION,BUT I BELEIVE THIS FEATURE WILL NOT WORK IF WE HAVE MULTIPLE WEBSERVICE CALL
@Override
public Customer addCustomer(CustomerDto dto) {
Customer customer=new Customer(dto.getCustomerId(), dto.getFname(), dto.getLname(), dto.getAge(), dto.getDateOfBirth(), dto.getAddress());
customer.setCustomerId(cusDao.persist(customer));
return customer;
}

public CustomerDao getCusDao() {
return cusDao;
}

public void setCusDao(CustomerDao cusDao) {
this.cusDao = cusDao;
}

}

请让我知道任何解决方案。谢谢

最佳答案

通过看到您的问题,我了解到您正在尝试进行 3 个网络服务调用,并且您希望在一次事务中进行所有三个调用。

当您调用另一个系统(在您的情况下为 Web 服务)时,您无法控制维护事务。

在您的情况下,您可以使用分散收集路由器来调用三个Web服务,如果任何路由(Web服务调用)失败,它将抛出CompositeRoutingException,您可以很好地捕获此异常你的捕获异常策略。

在捕获异常策略中,您需要执行回滚事件(进行另一个 Web 服务调用或数据库调用来满足您的回滚要求)。

关于spring - 如何在事务中调用Mule Flow中的多个http webservice?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14534406/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com