diff --git a/ServiceOrchestrator.java b/ServiceOrchestrator.java new file mode 100644 index 0000000..d914c88 --- /dev/null +++ b/ServiceOrchestrator.java @@ -0,0 +1,101 @@ +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 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 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; + } + } +} \ No newline at end of file