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.
trea1/ServiceOrchestrator.java

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;
}
}
}