You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
101 lines
3.5 KiB
101 lines
3.5 KiB
package com.soa.orchestration;
|
|
|
|
import com.soa.bus.ServiceBus;
|
|
import com.soa.monitoring.ServiceMonitor;
|
|
import org.apache.logging.log4j.LogManager;
|
|
import org.apache.logging.log4j.Logger;
|
|
import java.util.ArrayList;
|
|
import java.util.List;
|
|
|
|
/**
|
|
* 服务编排器 - 负责组合多个服务来完成复杂的业务流程
|
|
*/
|
|
public class ServiceOrchestrator {
|
|
private static final Logger logger = LogManager.getLogger(ServiceOrchestrator.class);
|
|
private final ServiceBus serviceBus;
|
|
private final ServiceMonitor monitor;
|
|
|
|
public ServiceOrchestrator() {
|
|
this.serviceBus = ServiceBus.getInstance();
|
|
this.monitor = ServiceMonitor.getInstance();
|
|
}
|
|
|
|
/**
|
|
* 执行订单处理流程
|
|
* 1. 检查用户
|
|
* 2. 创建订单
|
|
* 3. 处理支付
|
|
*/
|
|
public String processOrder(String userId, String orderInfo, String paymentDetails) {
|
|
logger.info("Starting order processing flow for user: {}", userId);
|
|
|
|
List<ProcessStep> steps = new ArrayList<>();
|
|
steps.add(new ProcessStep("userService", "checkUser:" + userId));
|
|
steps.add(new ProcessStep("orderService", "createOrder:" + orderInfo));
|
|
steps.add(new ProcessStep("paymentService", "processPayment:" + paymentDetails));
|
|
|
|
StringBuilder result = new StringBuilder();
|
|
boolean allSuccessful = true;
|
|
|
|
for (ProcessStep step : steps) {
|
|
try {
|
|
long startTime = monitor.startMonitoring(step.serviceName);
|
|
String stepResult = serviceBus.callService(step.serviceName, step.request);
|
|
|
|
// 检查执行结果是否成功
|
|
boolean success = !stepResult.contains("Error");
|
|
monitor.endMonitoring(step.serviceName, startTime, success);
|
|
|
|
result.append(step.serviceName).append(": ").append(stepResult).append("\n");
|
|
|
|
if (!success) {
|
|
allSuccessful = false;
|
|
logger.error("Step failed: {}", step.serviceName);
|
|
break; // 失败时中断流程
|
|
}
|
|
|
|
} catch (Exception e) {
|
|
monitor.endMonitoring(step.serviceName, System.currentTimeMillis(), false);
|
|
result.append(step.serviceName).append(": Error - ").append(e.getMessage()).append("\n");
|
|
allSuccessful = false;
|
|
logger.error("Exception in step {}: {}", step.serviceName, e.getMessage());
|
|
break;
|
|
}
|
|
}
|
|
|
|
if (allSuccessful) {
|
|
result.append("Order processing completed successfully");
|
|
} else {
|
|
result.append("Order processing failed");
|
|
}
|
|
|
|
return result.toString();
|
|
}
|
|
|
|
/**
|
|
* 创建自定义流程
|
|
*/
|
|
public String executeCustomFlow(List<ProcessStep> steps) {
|
|
StringBuilder result = new StringBuilder();
|
|
|
|
for (ProcessStep step : steps) {
|
|
String stepResult = serviceBus.callService(step.serviceName, step.request);
|
|
result.append(step.serviceName).append(": ").append(stepResult).append("\n");
|
|
}
|
|
|
|
return result.toString();
|
|
}
|
|
|
|
/**
|
|
* 流程步骤内部类
|
|
*/
|
|
public static class ProcessStep {
|
|
public final String serviceName;
|
|
public final String request;
|
|
|
|
public ProcessStep(String serviceName, String request) {
|
|
this.serviceName = serviceName;
|
|
this.request = request;
|
|
}
|
|
}
|
|
} |