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