commit d3ebc8a6efe51003ef6b388d00dbb85850a795d6 Author: 1445458000@qq.com <1445458000@qq.com> Date: Thu Mar 13 21:19:48 2025 +0800 初始化项目 diff --git a/camel-jdbc-yml/DatabaseInitializer.java b/camel-jdbc-yml/DatabaseInitializer.java new file mode 100644 index 0000000..07cfc3e --- /dev/null +++ b/camel-jdbc-yml/DatabaseInitializer.java @@ -0,0 +1,101 @@ +package com.example.util; + +import org.apache.camel.Exchange; +import org.apache.camel.Processor; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import javax.sql.DataSource; +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.SQLException; +import java.sql.ResultSet; + +public class DatabaseInitializer implements Processor { + private static final Logger LOG = LoggerFactory.getLogger(DatabaseInitializer.class); + private DataSource dataSource; + + public DatabaseInitializer(){ + } + + public DatabaseInitializer(DataSource dataSource) { + this.dataSource = dataSource; + } + + // setter方法用于属性注入 + public void setDataSource(DataSource dataSource) { + this.dataSource = dataSource; + } + + @Override + public void process(Exchange exchange) throws Exception { + LOG.info("初始化数据库..."); + initializeDatabase(); + insertInitialData(); + LOG.info("数据库初始化完成"); + } + + private void initializeDatabase() { + try (Connection connection = dataSource.getConnection(); + PreparedStatement statement = connection.prepareStatement(SqlQueries.CREATE_USERS_TABLE)) { + statement.execute(); + LOG.info("用户表创建成功或已存在"); + } catch (SQLException e) { + LOG.error("初始化数据库时出错", e); + throw new RuntimeException("初始化数据库时出错", e); + } + } + + private void insertInitialData() { + try (Connection connection = dataSource.getConnection()) { + // 检查admin用户是否已存在 + if (!userExists(connection, "admin")) { + insertUser(connection, "admin", "admin", "管理员", "admin@example.com", "13800000000", true); + LOG.info("已创建管理员用户: admin/admin"); + } + + // 检查普通用户是否已存在 + if (!userExists(connection, "user")) { + insertUser(connection, "user", "user", "普通用户", "user@example.com", "13900000000", true); + LOG.info("已创建普通用户: user/user"); + } + } catch (SQLException e) { + LOG.error("插入初始数据时出错", e); + throw new RuntimeException("插入初始数据时出错", e); + } + } + + private boolean userExists(Connection connection, String username) throws SQLException { + String query = "SELECT COUNT(*) FROM users WHERE username = ?"; + try (PreparedStatement ps = connection.prepareStatement(query)) { + ps.setString(1, username); + try (ResultSet rs = ps.executeQuery()) { + if (rs.next()) { + return rs.getInt(1) > 0; + } + } + } + return false; + } + + private void insertUser(Connection connection, String username, String password, + String fullName, String email, String phone, boolean active) throws SQLException { + String query = "INSERT INTO users (username, password, full_name, email, phone, create_time, update_time, active) " + + "VALUES (?, ?, ?, ?, ?, ?, ?, ?)"; + + java.sql.Timestamp now = new java.sql.Timestamp(System.currentTimeMillis()); + + try (PreparedStatement ps = connection.prepareStatement(query)) { + ps.setString(1, username); + ps.setString(2, password); // 实际应用中应该对密码进行加密处理 + ps.setString(3, fullName); + ps.setString(4, email); + ps.setString(5, phone); + ps.setTimestamp(6, now); + ps.setTimestamp(7, now); + ps.setBoolean(8, active); + + ps.executeUpdate(); + } + } +} \ No newline at end of file diff --git a/camel-jdbc-yml/SqlQueries.java b/camel-jdbc-yml/SqlQueries.java new file mode 100644 index 0000000..e5aeff8 --- /dev/null +++ b/camel-jdbc-yml/SqlQueries.java @@ -0,0 +1,78 @@ +package com.example.util; + +public class SqlQueries { + // 查询 + public static final String GET_ALL_USERS = + "SELECT id, username, email, full_name, phone, create_time, update_time, active FROM users ORDER BY id"; + + public static final String GET_USER_BY_ID = + "SELECT id, username, email, full_name, phone, create_time, update_time, active FROM users WHERE id = :id"; + + public static final String GET_USER_BY_USERNAME = + "SELECT id, username, email, full_name, phone, create_time, update_time, active FROM users WHERE username = :username"; + + // 分页查询 + public static final String GET_USERS_PAGED = + "SELECT id, username, email, full_name, phone, create_time, update_time, active FROM users ORDER BY id LIMIT :limit OFFSET :offset"; + + // 高级分页查询(支持排序和条件筛选) + public static final String GET_USERS_ADVANCED = + "SELECT id, username, email, full_name, phone, create_time, update_time, active FROM users " + + "WHERE 1=1 " + + "#{if}(:username != '') AND username LIKE '%' || :username || '%'#{end} " + + "#{if}(:email != '') AND email LIKE '%' || :email || '%'#{end} " + + "#{if}(:phone != '') AND phone LIKE '%' || :phone || '%'#{end} " + + "#{if}(:active != null) AND active = :active#{end} " + + "#{if}(:fromDate != '') AND create_time >= TO_TIMESTAMP(:fromDate, 'YYYY-MM-DD')#{end} " + + "#{if}(:toDate != '') AND create_time <= TO_TIMESTAMP(:toDate, 'YYYY-MM-DD') + INTERVAL '1 day'#{end} " + + "ORDER BY " + + "#{if}(:sortField = 'username') username#{end} " + + "#{if}(:sortField = 'email') email#{end} " + + "#{if}(:sortField = 'createTime') create_time#{end} " + + "#{if}(:sortField = '') id#{end} " + + "#{if}(:sortOrder = 'ASC') ASC#{else} DESC#{end} " + + "LIMIT :limit OFFSET :offset"; + + public static final String COUNT_USERS_ADVANCED = + "SELECT COUNT(*) as total FROM users " + + "WHERE 1=1 " + + "#{if}(:username != '') AND username LIKE '%' || :username || '%'#{end} " + + "#{if}(:email != '') AND email LIKE '%' || :email || '%'#{end} " + + "#{if}(:phone != '') AND phone LIKE '%' || :phone || '%'#{end} " + + "#{if}(:active != null) AND active = :active#{end} " + + "#{if}(:fromDate != '') AND create_time >= TO_TIMESTAMP(:fromDate, 'YYYY-MM-DD')#{end} " + + "#{if}(:toDate != '') AND create_time <= TO_TIMESTAMP(:toDate, 'YYYY-MM-DD') + INTERVAL '1 day'#{end}"; + + public static final String COUNT_USERS = + "SELECT COUNT(*) as total FROM users"; + + // 插入 + public static final String CREATE_USER = + "INSERT INTO users (username, email, password, full_name, phone, active, create_time, update_time) " + + "VALUES (:username, :email, :password, :fullName, :phone, :active, NOW(), NOW()) RETURNING id"; + + // 更新 + public static final String UPDATE_USER = + "UPDATE users SET username = :username, email = :email, " + + "password = CASE WHEN :password = '' THEN password ELSE :password END, " + + "full_name = :fullName, phone = :phone, active = :active, update_time = NOW() " + + "WHERE id = :id"; + + // 删除 + public static final String DELETE_USER = + "DELETE FROM users WHERE id = :id"; + + // 创建用户表 - 用于初始化数据库 + public static final String CREATE_USERS_TABLE = + "CREATE TABLE IF NOT EXISTS users (" + + "id SERIAL PRIMARY KEY, " + + "username VARCHAR(50) NOT NULL UNIQUE, " + + "email VARCHAR(100) NOT NULL UNIQUE, " + + "password VARCHAR(255) NOT NULL, " + + "full_name VARCHAR(100), " + + "phone VARCHAR(20), " + + "active BOOLEAN DEFAULT TRUE, " + + "create_time TIMESTAMP NOT NULL, " + + "update_time TIMESTAMP NOT NULL" + + ")"; +} \ No newline at end of file diff --git a/camel-jdbc-yml/SqlTemplateProcessor.java b/camel-jdbc-yml/SqlTemplateProcessor.java new file mode 100644 index 0000000..ac0a0f1 --- /dev/null +++ b/camel-jdbc-yml/SqlTemplateProcessor.java @@ -0,0 +1,166 @@ +package com.example.processor; + +import org.apache.camel.Exchange; +import org.apache.camel.Processor; +import org.apache.camel.Configuration; +import org.apache.camel.BindToRegistry; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.Map; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +@Configuration +@BindToRegistry("sqlTemplateProcessor") +public class SqlTemplateProcessor implements Processor { + + private static final Logger LOG = LoggerFactory.getLogger(UserProcessor.class); + // private static final Pattern IF_PATTERN = Pattern.compile("#\\{if\\}\\((.+?)\\)(.+?)#\\{end\\}", Pattern.DOTALL); + // private static final Pattern IF_ELSE_PATTERN = Pattern.compile("#\\{if\\}\\((.+?)\\)(.+?)#\\{else\\}(.+?)#\\{end\\}", Pattern.DOTALL); + // 简化的正则表达式,可能更容易匹配 + private static final Pattern IF_PATTERN = Pattern.compile("#\\{if\\}\\(([^)]+)\\)([^#]+)#\\{end\\}", Pattern.DOTALL); + private static final Pattern IF_ELSE_PATTERN = Pattern.compile("#\\{if\\}\\(([^)]+)\\)([^#]+)#\\{else\\}([^#]+)#\\{end\\}", Pattern.DOTALL); + + @Override + public void process(Exchange exchange) throws Exception { + // 获取原始SQL模板 + String sqlTemplate = exchange.getIn().getHeader("currentSqlString",String.class); + LOG.info("IF_PATTERN: {}", IF_PATTERN); + LOG.info("IF_ELSE_PATTERN: {}", IF_ELSE_PATTERN); + LOG.info("处理前的sql: {}", sqlTemplate); + // 获取参数 + Map params = exchange.getIn().getBody(Map.class); + LOG.info("获取到的body里的参数: {}", params); + if (params == null) { + params = exchange.getIn().getHeaders(); + } + + LOG.info("模板处理的参数: {}", params); + // 处理模板 + String processedSql = processSqlTemplate(sqlTemplate, params); + + LOG.info("处理后的sql: {}", processedSql); + // 设置处理后的SQL + exchange.getIn().setBody(processedSql); + } + + /** + * 处理SQL模板,替换条件部分 + */ + private String processSqlTemplate(String template, Map params) { + // String result = template; + + // // 处理if-else条件 + // Matcher ifElseMatcher = IF_ELSE_PATTERN.matcher(result); + // while (ifElseMatcher.find()) { + + // String condition = ifElseMatcher.group(1); + // String ifBlock = ifElseMatcher.group(2); + // String elseBlock = ifElseMatcher.group(3); + + // boolean conditionResult = evaluateCondition(condition, params); + // String replacement = conditionResult ? ifBlock : elseBlock; + + // LOG.info("ifElseMatcher.group(0): {}", ifElseMatcher.group(0)); + // result = result.replace(ifElseMatcher.group(0), replacement); + // } + // LOG.info("ifelse处理结果: {}", result); + + // // 处理if条件 + // Matcher ifMatcher = IF_PATTERN.matcher(result); + // while (ifMatcher.find()) { + // String condition = ifMatcher.group(1); + // String ifBlock = ifMatcher.group(2); + + // boolean conditionResult = evaluateCondition(condition, params); + // String replacement = conditionResult ? ifBlock : ""; + + // result = result.replace(ifMatcher.group(0), replacement); + // } + // LOG.info("if处理结果: {}", result); + + // return result.trim().replaceAll("\\s+", " "); + + String result = template; + + // 处理if-else条件 + Matcher ifElseMatcher = IF_ELSE_PATTERN.matcher(result); + StringBuffer sb = new StringBuffer(); + + while (ifElseMatcher.find()) { + String condition = ifElseMatcher.group(1); + String ifBlock = ifElseMatcher.group(2); + String elseBlock = ifElseMatcher.group(3); + + boolean conditionResult = evaluateCondition(condition, params); + String replacement = conditionResult ? ifBlock : elseBlock; + + // 使用quoteReplacement处理替换字符串中的特殊字符 + ifElseMatcher.appendReplacement(sb, Matcher.quoteReplacement(replacement)); + } + ifElseMatcher.appendTail(sb); + result = sb.toString(); + + // 处理if条件 + Matcher ifMatcher = IF_PATTERN.matcher(result); + sb = new StringBuffer(); + + while (ifMatcher.find()) { + String condition = ifMatcher.group(1); + String ifBlock = ifMatcher.group(2); + + boolean conditionResult = evaluateCondition(condition, params); + String replacement = conditionResult ? ifBlock : ""; + + // 使用quoteReplacement处理替换字符串中的特殊字符 + ifMatcher.appendReplacement(sb, Matcher.quoteReplacement(replacement)); + } + ifMatcher.appendTail(sb); + + return sb.toString().trim().replaceAll("\\s+", " "); + } + + /** + * 评估条件表达式 + */ + private boolean evaluateCondition(String condition, Map params) { + // 简单解析条件表达式 + // 这里只是一个示例实现,可能需要更复杂的表达式解析逻辑 + condition = condition.trim(); + + if (condition.contains("!=")) { + String[] parts = condition.split("!="); + String paramName = parts[0].trim().replace(":?", ""); + String value = parts[1].trim().replace("'", ""); + + Object paramValue = params.get(paramName); + if (paramValue == null) return false; + + if (value.equals("null")) { + return paramValue != null; + } else if (value.equals("''")) { + return paramValue != null && !paramValue.toString().isEmpty(); + } else { + return !paramValue.toString().equals(value); + } + } else if (condition.contains("=")) { + String[] parts = condition.split("="); + String paramName = parts[0].trim().replace(":?", ""); + String value = parts[1].trim().replace("'", ""); + + Object paramValue = params.get(paramName); + + if (value.equals("null")) { + return paramValue == null; + } else if (value.equals("''")) { + return paramValue == null || paramValue.toString().isEmpty(); + } else { + return paramValue != null && paramValue.toString().equals(value); + } + } + + return false; + } +} \ No newline at end of file diff --git a/camel-jdbc-yml/User.java b/camel-jdbc-yml/User.java new file mode 100644 index 0000000..8abf50e --- /dev/null +++ b/camel-jdbc-yml/User.java @@ -0,0 +1,120 @@ +package com.example.model; + +import java.util.Date; + +public class User { + private Long id; + private String username; + private String email; + private String password; + private String fullName; + private String phone; + private Date createTime; + private Date updateTime; + private boolean active; + + // 默认构造函数 + public User() { + } + + // 带参数的构造函数 + public User(Long id, String username, String email, String password, String fullName, + String phone, Date createTime, Date updateTime, boolean active) { + this.id = id; + this.username = username; + this.email = email; + this.password = password; + this.fullName = fullName; + this.phone = phone; + this.createTime = createTime; + this.updateTime = updateTime; + this.active = active; + } + + // Getter和Setter方法 + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public String getUsername() { + return username; + } + + public void setUsername(String username) { + this.username = username; + } + + public String getEmail() { + return email; + } + + public void setEmail(String email) { + this.email = email; + } + + public String getPassword() { + return password; + } + + public void setPassword(String password) { + this.password = password; + } + + public String getFullName() { + return fullName; + } + + public void setFullName(String fullName) { + this.fullName = fullName; + } + + public String getPhone() { + return phone; + } + + public void setPhone(String phone) { + this.phone = phone; + } + + public Date getCreateTime() { + return createTime; + } + + public void setCreateTime(Date createTime) { + this.createTime = createTime; + } + + public Date getUpdateTime() { + return updateTime; + } + + public void setUpdateTime(Date updateTime) { + this.updateTime = updateTime; + } + + public boolean isActive() { + return active; + } + + public void setActive(boolean active) { + this.active = active; + } + + @Override + public String toString() { + return "User{" + + "id=" + id + + ", username='" + username + '\'' + + ", email='" + email + '\'' + + ", fullName='" + fullName + '\'' + + ", phone='" + phone + '\'' + + ", createTime=" + createTime + + ", updateTime=" + updateTime + + ", active=" + active + + '}'; + } +} \ No newline at end of file diff --git a/camel-jdbc-yml/UserProcessor.java b/camel-jdbc-yml/UserProcessor.java new file mode 100644 index 0000000..01f9b3c --- /dev/null +++ b/camel-jdbc-yml/UserProcessor.java @@ -0,0 +1,309 @@ +package com.example.processor; + +import com.example.model.User; +import com.fasterxml.jackson.databind.ObjectMapper; +import org.apache.camel.Exchange; +import org.apache.camel.Configuration; +import org.apache.camel.BindToRegistry; +import org.apache.camel.Processor; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +@Configuration +@BindToRegistry("userProcessor") +public class UserProcessor implements Processor { + private static final Logger LOG = LoggerFactory.getLogger(UserProcessor.class); + private static final ObjectMapper objectMapper = new ObjectMapper(); + + @Override + public void process(Exchange exchange) throws Exception { + String operation = exchange.getIn().getHeader("operation", String.class); + LOG.info("处理用户操作: {}", operation); + + switch (operation) { + case "transformUserInput": + transformUserInput(exchange); + break; + case "prepareUserResponse": + prepareUserResponse(exchange); + break; + case "prepareUsersResponse": + prepareUsersResponse(exchange); + break; + case "preparePagedUsersResponse": + preparePagedUsersResponse(exchange); + break; + case "preparePageParams": + preparePageParams(exchange); + break; + case "prepareAdvancedSearchParams": + prepareAdvancedSearchParams(exchange); + break; + case "prepareErrorResponse": + prepareErrorResponse(exchange); + break; + case "prepareCreateUserParams": + prepareCreateUserParams(exchange); + break; + case "prepareUpdateUserParams": + prepareUpdateUserParams(exchange); + break; + default: + LOG.warn("未知操作: {}", operation); + exchange.getIn().setBody("未知操作"); + exchange.getIn().setHeader(Exchange.HTTP_RESPONSE_CODE, 400); + } + } + + private void transformUserInput(Exchange exchange) throws Exception { + String body = exchange.getIn().getBody(String.class); + User user = objectMapper.readValue(body, User.class); + exchange.getIn().setBody(user); + } + + private void prepareUserResponse(Exchange exchange) throws Exception { + List> resultList = exchange.getIn().getBody(List.class); + + if (resultList == null || resultList.isEmpty()) { + exchange.getIn().setBody("{\"message\": \"用户不存在\"}"); + exchange.getIn().setHeader(Exchange.HTTP_RESPONSE_CODE, 404); + return; + } + + Map result = resultList.get(0); + User user = mapToUser(result); + exchange.getIn().setBody(user); + } + + private void prepareUsersResponse(Exchange exchange) throws Exception { + List> resultList = exchange.getIn().getBody(List.class); + + if (resultList == null) { + resultList = new ArrayList<>(); + } + + List users = new ArrayList<>(); + for (Map result : resultList) { + users.add(mapToUser(result)); + } + LOG.info("进入处理数据过程方法获取到的list: {}", users); + exchange.getIn().setBody(users); + } + + private void preparePagedUsersResponse(Exchange exchange) throws Exception { + // 获取用户数据 + List> resultList = exchange.getIn().getBody(List.class); + + if (resultList == null) { + resultList = new ArrayList<>(); + } + + // 转换用户对象 + List users = new ArrayList<>(); + for (Map result : resultList) { + users.add(mapToUser(result)); + } + + // 获取总记录数 + Long total = exchange.getProperty("totalCount", Long.class); + if (total == null) { + total = 0L; + } + + // 获取分页参数 + int page = exchange.getIn().getHeader("page", Integer.class); + int size = exchange.getIn().getHeader("size", Integer.class); + + // 构建分页响应对象 + Map response = new HashMap<>(); + response.put("content", users); + response.put("totalElements", total); + response.put("totalPages", (int) Math.ceil((double) total / size)); + response.put("page", page); + response.put("size", size); + response.put("numberOfElements", users.size()); + + exchange.getIn().setBody(response); + } + + private void preparePageParams(Exchange exchange) { + // 获取页码和每页大小参数,默认值为第1页,每页10条记录 + String pageParam = exchange.getIn().getHeader("page", "1", String.class); + String sizeParam = exchange.getIn().getHeader("size", "10", String.class); + + int page = Integer.parseInt(pageParam); + int size = Integer.parseInt(sizeParam); + + // 确保页码和每页大小有效 + page = Math.max(1, page); + size = Math.max(1, Math.min(100, size)); // 限制每页最多100条记录 + + // 计算偏移量 + int offset = (page - 1) * size; + + // 将参数设置到消息头中 + exchange.getIn().setHeader("page", page); + exchange.getIn().setHeader("size", size); + exchange.getIn().setHeader("offset", offset); + exchange.getIn().setHeader("limit", size); + + // 创建参数Map用于SQL查询 + Map params = new HashMap<>(); + params.put("limit", size); + params.put("offset", offset); + + exchange.getIn().setBody(params); + LOG.info("分页参数: page={}, size={}, offset={}", page, size, offset); + } + + private void prepareAdvancedSearchParams(Exchange exchange) { + // 获取分页参数 + String pageParam = exchange.getIn().getHeader("page", "1", String.class); + String sizeParam = exchange.getIn().getHeader("size", "10", String.class); + + int page = Integer.parseInt(pageParam); + int size = Integer.parseInt(sizeParam); + + // 确保页码和每页大小有效 + page = Math.max(1, page); + size = Math.max(1, Math.min(100, size)); // 限制每页最多100条记录 + + // 计算偏移量 + int offset = (page - 1) * size; + + // 获取查询参数 + String username = exchange.getIn().getHeader("username", "", String.class); + String email = exchange.getIn().getHeader("email", "", String.class); + String phone = exchange.getIn().getHeader("phone", "", String.class); + String activeStr = exchange.getIn().getHeader("active", "", String.class); + String fromDate = exchange.getIn().getHeader("fromDate", "", String.class); + String toDate = exchange.getIn().getHeader("toDate", "", String.class); + + // 获取排序参数 + String sortField = exchange.getIn().getHeader("sortField", "", String.class); + String sortOrder = exchange.getIn().getHeader("sortOrder", "DESC", String.class); + + // 验证排序字段 + if (!sortField.isEmpty() && !isValidSortField(sortField)) { + sortField = ""; // 无效的排序字段,使用默认排序字段(id) + } + + // 验证排序顺序 + if (!sortOrder.equals("ASC") && !sortOrder.equals("DESC")) { + sortOrder = "DESC"; // 无效的排序顺序,使用默认排序顺序 + } + + // 解析布尔值 + Boolean active = null; + if (!activeStr.isEmpty()) { + active = Boolean.parseBoolean(activeStr); + } + + // 将参数设置到消息头中 + exchange.getIn().setHeader("page", page); + exchange.getIn().setHeader("size", size); + exchange.getIn().setHeader("offset", offset); + exchange.getIn().setHeader("limit", size); + exchange.getIn().setHeader("active", active); + exchange.getIn().setHeader("sortField", sortField); + exchange.getIn().setHeader("sortOrder", sortOrder); + + // 创建参数Map用于SQL查询 + Map params = new HashMap<>(); + params.put("username", username); + params.put("email", email); + params.put("phone", phone); + params.put("active", active); + params.put("fromDate", fromDate); + params.put("toDate", toDate); + params.put("sortField", sortField); + params.put("sortOrder", sortOrder); + params.put("limit", size); + params.put("offset", offset); + + exchange.getIn().setBody(params); + LOG.info("高级查询参数: page={}, size={}, username={}, email={}, active={}, sortField={}, sortOrder={}", + page, size, username, email, active, sortField, sortOrder); + } + + private boolean isValidSortField(String field) { + return field.equals("username") || field.equals("email") || field.equals("createTime"); + } + + private void prepareErrorResponse(Exchange exchange) { + Exception exception = exchange.getProperty(Exchange.EXCEPTION_CAUGHT, Exception.class); + String errorMessage = exception != null ? exception.getMessage() : "未知错误"; + + Map errorResponse = new HashMap<>(); + errorResponse.put("error", true); + errorResponse.put("message", errorMessage); + + exchange.getIn().setBody(errorResponse); + exchange.getIn().setHeader(Exchange.HTTP_RESPONSE_CODE, 500); + } + + private void prepareCreateUserParams(Exchange exchange) { + User user = exchange.getIn().getBody(User.class); + + Map params = new HashMap<>(); + params.put("username", user.getUsername()); + params.put("email", user.getEmail()); + params.put("password", user.getPassword()); + params.put("fullName", user.getFullName()); + params.put("phone", user.getPhone()); + params.put("active", user.isActive()); + + exchange.getIn().setHeader("username", user.getUsername()); + exchange.getIn().setHeader("email", user.getEmail()); + exchange.getIn().setHeader("password", user.getPassword()); + exchange.getIn().setHeader("fullName", user.getFullName()); + exchange.getIn().setHeader("phone", user.getPhone()); + exchange.getIn().setHeader("active", user.isActive()); + + exchange.getIn().setBody(params); + } + + private void prepareUpdateUserParams(Exchange exchange) { + User user = exchange.getIn().getBody(User.class); + String userId = exchange.getIn().getHeader("userId", String.class); + + Map params = new HashMap<>(); + params.put("id", Long.parseLong(userId)); + params.put("username", user.getUsername()); + params.put("email", user.getEmail()); + params.put("password", user.getPassword()); + params.put("fullName", user.getFullName()); + params.put("phone", user.getPhone()); + params.put("active", user.isActive()); + + exchange.getIn().setHeader("id", Long.parseLong(userId)); + exchange.getIn().setHeader("username", user.getUsername()); + exchange.getIn().setHeader("email", user.getEmail()); + exchange.getIn().setHeader("password", user.getPassword()); + exchange.getIn().setHeader("fullName", user.getFullName()); + exchange.getIn().setHeader("phone", user.getPhone()); + exchange.getIn().setHeader("active", user.isActive()); + + exchange.getIn().setBody(params); + } + + private User mapToUser(Map result) { + User user = new User(); + user.setId(((Number) result.get("id")).longValue()); + user.setUsername((String) result.get("username")); + user.setEmail((String) result.get("email")); + user.setPassword(null); // 出于安全考虑,不返回密码 + user.setFullName((String) result.get("full_name")); + user.setPhone((String) result.get("phone")); + user.setCreateTime((java.sql.Timestamp) result.get("create_time")); + user.setUpdateTime((java.sql.Timestamp) result.get("update_time")); + user.setActive((Boolean) result.get("active")); + + return user; + } +} \ No newline at end of file diff --git a/camel-jdbc-yml/application.properties b/camel-jdbc-yml/application.properties new file mode 100644 index 0000000..482ccb4 --- /dev/null +++ b/camel-jdbc-yml/application.properties @@ -0,0 +1,38 @@ +camel.karavan.projectId=camel-jdbc-yml +camel.karavan.projectName=camel-jdbc-yml +camel.jbang.gav=org.camel.karavan.demo:cameljdbcyml:1 +camel.jbang.runtime=camel-main +camel.jbang.version=4.10.0 +camel.jbang.dependencies=camel-console,camel-platform-http-main +camel.jbang.jib-maven-plugin-version=3.4.4 +camel.server.enabled=true +camel.server.healthCheckEnabled=true +camel.server.devConsoleEnabled=true +camel.main.name=camel-jdbc-yml +camel.main.tracingStandby=true +camel.trace.enabled=true +camel.main.autoConfigurationFailFast=false +camel.routecontroller.superviseEnabled=true +camel.routecontroller.backoffDelay=5000 +camel.routecontroller.backoffMaxAttempts=100 +camel.routecontroller.initialDelay=1000 +camel.routecontroller.threadPoolSize=3 +camel.context.dev-console=true +camel.health.enabled=true +camel.health.exposure-level=full +jkube.version=1.18.0 +jib.from.image=gcr.io/distroless/java17@sha256:68e2373f7bef9486c08356bd9ffd3b40b56e6b9316c5f6885eb58b1d9093b43d + +# SQL查询配置 +sqlQueries.getAllUsers=SELECT id, username, email, full_name, phone, create_time, update_time, active FROM users ORDER BY id +sqlQueries.getUserById=SELECT id, username, email, full_name, phone, create_time, update_time, active FROM users WHERE id = :?id +sqlQueries.getUserByUsername=SELECT id, username, email, full_name, phone, create_time, update_time, active FROM users WHERE username = :?username +sqlQueries.getUsersPaged=SELECT id, username, email, full_name, phone, create_time, update_time, active FROM users ORDER BY id LIMIT :?limit OFFSET :?offset +sqlQueries.countUsers=SELECT COUNT(*) as total FROM users + +# 高级分页查询SQL +sqlQueries.getUsersAdvanced=SELECT id, username, email, full_name, phone, create_time, update_time, active FROM users WHERE 1=1 #{if}(:?username != '') AND username LIKE '%' || :?username || '%'#{end} #{if}(:?email != '') AND email LIKE '%' || :?email || '%'#{end} #{if}(:?phone != '') AND phone LIKE '%' || :?phone || '%'#{end} #{if}(:?active != null) AND active = :?active#{end} #{if}(:?fromDate != '') AND create_time >= TO_TIMESTAMP(:?fromDate, 'YYYY-MM-DD')#{end} #{if}(:?toDate != '') AND create_time <= TO_TIMESTAMP(:?toDate, 'YYYY-MM-DD') + INTERVAL '1 day'#{end} ORDER BY #{if}(:?sortField = 'username') username#{end} #{if}(:?sortField = 'email') email#{end} #{if}(:?sortField = 'createTime') create_time#{end} #{if}(:?sortField = '') id#{end} #{if}(:?sortOrder = 'ASC') ASC #{else} DESC#{end} LIMIT :?limit OFFSET :?offset +sqlQueries.countUsersAdvanced=SELECT COUNT(*) as total FROM users WHERE 1=1 #{if}(:?username != '') AND username LIKE '%' || :?username || '%'#{end} #{if}(:?email != '') AND email LIKE '%' || :?email || '%'#{end} #{if}(:?phone != '') AND phone LIKE '%' || :?phone || '%'#{end} #{if}(:?active != null) AND active = :?active#{end} #{if}(:?fromDate != '') AND create_time >= TO_TIMESTAMP(:?fromDate, 'YYYY-MM-DD')#{end} #{if}(:?toDate != '') AND create_time <= TO_TIMESTAMP(:?toDate, 'YYYY-MM-DD') + INTERVAL '1 day'#{end} +sqlQueries.createUser=INSERT INTO users (username, email, password, full_name, phone, active, create_time, update_time) VALUES (:?username, :?email, :?password, :?fullName, :?phone, :?active, NOW(), NOW()) RETURNING id +sqlQueries.updateUser=UPDATE users SET username = :?username, email = :?email, password = CASE WHEN :?password = '' THEN password ELSE :?password END, full_name = :?fullName, phone = :?phone, active = :?active, update_time = NOW() WHERE id = :?id +sqlQueries.deleteUser=DELETE FROM users WHERE id = :?id \ No newline at end of file diff --git a/camel-jdbc-yml/database.camel.yaml b/camel-jdbc-yml/database.camel.yaml new file mode 100644 index 0000000..e06456e --- /dev/null +++ b/camel-jdbc-yml/database.camel.yaml @@ -0,0 +1,44 @@ +- rest: + id: rest-8fb6 + path: /api/db + consumes: application/json + produces: application/json + post: + - id: post-77e8 + description: 初始化数据库 + path: /init + to: direct:initDatabase +- route: + id: route-85b8 + nodePrefixId: route-b60 + from: + id: from-5e76 + uri: direct + parameters: + name: initDatabase + steps: + - log: + id: log-5310 + message: 初始化数据库... + loggingLevel: INFO + logName: com.example.route.init + - process: + id: process-0abf + ref: databaseInitializer + - log: + id: log-5124 + message: 数据库初始化完成 + loggingLevel: INFO + logName: com.example.route.init +- beans: + - name: postgresDatabase + type: "#class:org.apache.commons.dbcp2.BasicDataSource" + properties: + username: postgres + password: 1qaz123$ + url: jdbc:postgresql://192.168.56.12:5432/user_db2 + driverClassName: org.postgresql.Driver + - name: databaseInitializer + type: com.example.util.DatabaseInitializer + properties: + dataSource: "#postgresDatabase" diff --git a/camel-jdbc-yml/docker-compose.yaml b/camel-jdbc-yml/docker-compose.yaml new file mode 100644 index 0000000..0a3c251 --- /dev/null +++ b/camel-jdbc-yml/docker-compose.yaml @@ -0,0 +1,8 @@ +services: + camel-jdbc-yml: + image: camel-jdbc-yml + restart: always + ports: + - "8083:8080" + networks: + - karavan \ No newline at end of file diff --git a/camel-jdbc-yml/jbang.properties b/camel-jdbc-yml/jbang.properties new file mode 100644 index 0000000..beab8db --- /dev/null +++ b/camel-jdbc-yml/jbang.properties @@ -0,0 +1,2 @@ +deps=\ + org.projectlombok:lombok:1.18.30 \ No newline at end of file diff --git a/camel-jdbc-yml/user-manage.camel.yaml b/camel-jdbc-yml/user-manage.camel.yaml new file mode 100644 index 0000000..5b842e8 --- /dev/null +++ b/camel-jdbc-yml/user-manage.camel.yaml @@ -0,0 +1,480 @@ +- rest: + id: rest-07ff + description: 用户管理服务 + path: /api/user + consumes: application/json + produces: application/json + enableCORS: true + delete: + - id: delete-f299 + description: 删除用户 + path: /users/{id} + to: direct:deleteUser + get: + - id: get-9c5f + description: 获取所有用户列表 + path: /users + to: direct:getAllUsers + - id: get-8b43 + description: 分页获取用户列 + path: /users/page + to: direct:getPagedUsers + - id: get-d3ba + description: 高级条件分页查询用户列表 + path: /users/search + to: direct:searchUsers + - id: get-d3be + description: 根据ID获取用户 + path: /users/{id} + to: direct:getUserById + post: + - id: post-1d53 + description: 创建新用户 + path: /users + to: direct:createUser + put: + - id: put-db0e + description: 更新用户信息 + path: /users/{id} + to: direct:updateUser +- route: + id: route-105a + nodePrefixId: route-a43 + from: + id: from-16fb + uri: direct + parameters: + name: getAllUsers + steps: + - log: + id: log-6e8e + message: 获取所有用户 + loggingLevel: INFO + logName: com.example.route.user + - setBody: + id: setBody-77bf + expression: + simple: + id: simple-2c02 + expression: "{{sqlQueries.getAllUsers}}" + - to: + id: to-c4fc + uri: jdbc + parameters: + dataSourceName: postgresDatabase + useHeadersAsParameters: true + - setHeader: + id: setHeader-d25f + name: operation + expression: + constant: + id: constant-2e75 + expression: prepareUsersResponse + - process: + id: process-f54d + disabled: false + ref: userProcessor + - marshal: + id: marshal-e9a1 + json: + id: json-0f7d +- route: + id: getPagedUsers + from: + id: from-5c0c + uri: direct + parameters: + name: getPagedUsers + steps: + - log: + id: log-31eb + message: "分页获取用户, 页码: ${header.page:1}, 每页大小: ${header.size:10}" + loggingLevel: INFO + logName: com.example.route.user + - setHeader: + id: setHeader-d9ec + name: operation + expression: + constant: + id: constant-1c9c + expression: preparePageParams + - process: + id: process-4371 + ref: userProcessor + - setBody: + id: setBody-5589 + expression: + simple: + id: simple-a8ff + expression: "{{sqlQueries.countUsers}}" + - to: + id: to-4340 + uri: jdbc + parameters: + dataSourceName: postgresDatabase + useHeadersAsParameters: true + - setProperty: + id: setProperty-f6b8 + name: totalCount + expression: + simple: + id: simple-1f8a + expression: ${body[0][total]} + - setBody: + id: setBody-c884 + expression: + simple: + id: simple-9c4f + expression: "{{sqlQueries.getUsersPaged}}" + - log: + id: log-90e9 + message: ${header.limit} + - to: + id: to-0f55 + uri: jdbc + parameters: + dataSourceName: postgresDatabase + useHeadersAsParameters: true + - setHeader: + id: setHeader-1efb + name: operation + expression: + constant: + id: constant-2ee8 + expression: preparePagedUsersResponse + - process: + id: process-554a + ref: userProcessor + - marshal: + id: marshal-a1c8 + json: + id: json-5e5d + prettyPrint: true + library: Jackson +- route: + id: searchUsers + from: + id: from-47c2 + uri: direct + parameters: + name: searchUsers + steps: + - log: + id: log-6ff5 + message: "高级条件分页查询用户, 页码: ${header.page:1}, 每页大小: ${header.size:10}" + loggingLevel: INFO + logName: com.example.route.user + - setHeader: + id: setHeader-f797 + name: operation + expression: + constant: + id: constant-f72a + expression: prepareAdvancedSearchParams + - process: + id: process-da37 + ref: userProcessor + - log: + id: log-246f + message: ${body} + - setHeader: + id: setHeader-6296 + name: currentSqlString + expression: + simple: + id: simple-914d + expression: "{{sqlQueries.countUsersAdvanced}}" + - process: + id: process-4968 + ref: sqlTemplateProcessor + - to: + id: to-f0bc + uri: jdbc + parameters: + useHeadersAsParameters: true + dataSourceName: postgresDatabase + - log: + id: log-82f8 + message: ${body} + - setProperty: + id: setProperty-906d + name: totalCount + expression: + simple: + id: simple-e305 + expression: ${body[0][total]} + - log: + id: log-7a44 + message: ${body} + - setHeader: + id: setHeader-68e3 + name: currentSqlString + expression: + simple: + id: simple-89c5 + expression: "{{sqlQueries.getUsersAdvanced}}" + - process: + id: process-f123 + ref: sqlTemplateProcessor + - to: + id: to-6e07 + uri: jdbc + parameters: + useHeadersAsParameters: true + dataSourceName: postgresDatabase + - setHeader: + id: setHeader-8430 + name: operation + expression: + constant: + id: constant-c99d + expression: preparePagedUsersResponse + - process: + id: process-0298 + ref: userProcessor + - marshal: + id: marshal-c907 + json: + id: json-7acc + prettyPrint: true + library: Jackson +- route: + id: getUserById + from: + id: from-23ea + uri: direct + parameters: + name: getUserById + exchangePattern: InOut + bridgeErrorHandler: false + steps: + - setHeader: + id: setHeader-e275 + name: id + expression: + simple: + id: simple-1c32 + expression: ${header.id} + resultType: java.lang.Integer + - log: + id: log-c926 + message: "获取用户, ID: ${header.id}" + loggingLevel: INFO + logName: com.example.route.user + - setBody: + id: setBody-7134 + expression: + simple: + id: simple-f675 + expression: "{{sqlQueries.getUserById}}" + - to: + id: to-8cfb + uri: jdbc + parameters: + dataSourceName: postgresDatabase + useHeadersAsParameters: true + - setHeader: + id: setHeader-0daf + name: operation + expression: + constant: + id: constant-983d + expression: prepareUserResponse + - process: + id: process-17cb + ref: userProcessor + - marshal: + id: marshal-b95e + json: + id: json-a5d8 + prettyPrint: true + library: Jackson +- route: + id: createUser + from: + id: from-1ec8 + uri: direct + parameters: + name: createUser + steps: + - log: + id: log-35e9 + message: 创建新用户 + loggingLevel: INFO + logName: com.example.route.user + - setHeader: + id: setHeader-4c3c + name: operation + expression: + constant: + id: constant-8d18 + expression: transformUserInput + - process: + id: process-245c + ref: userProcessor + - log: + id: log-240e + message: ${body} + - setHeader: + id: setHeader-9207 + name: operation + expression: + constant: + id: constant-faa6 + expression: prepareCreateUserParams + - process: + id: process-e775 + ref: userProcessor + - setBody: + id: setBody-c7e8 + expression: + simple: + id: simple-b71c + expression: "{{sqlQueries.createUser}}" + - to: + id: to-4bb8 + uri: jdbc + parameters: + dataSourceName: postgresDatabase + useHeadersAsParameters: true + - setHeader: + id: setHeader-0faa + name: id + expression: + simple: + id: simple-01ff + expression: ${body[0][id]} + resultType: java.lang.Long + - log: + id: log-15e9 + message: ${body} + - to: + id: to-2c98 + uri: direct + parameters: + name: getUserById +- route: + id: updateUser + from: + id: from-128b + uri: direct + parameters: + name: updateUser + steps: + - log: + id: log-14db + message: "更新用户, ID: ${header.id}" + loggingLevel: INFO + logName: com.example.route.user + - setHeader: + id: setHeader-4af3 + name: userId + expression: + simple: + id: simple-12f9 + expression: ${header.id} + - setHeader: + id: setHeader-a5ac + name: operation + expression: + constant: + id: constant-3706 + expression: transformUserInput + - process: + id: process-12c8 + ref: userProcessor + - setHeader: + id: setHeader-61a6 + name: operation + expression: + constant: + id: constant-93f8 + expression: prepareUpdateUserParams + - process: + id: process-e394 + ref: userProcessor + - setBody: + id: setBody-4800 + expression: + simple: + id: simple-0e51 + expression: "{{sqlQueries.updateUser}}" + - to: + id: to-3638 + uri: jdbc + parameters: + dataSourceName: postgresDatabase + useHeadersAsParameters: true + - to: + id: to-b2b2 + uri: direct + parameters: + name: getUserById +- route: + id: deleteUser + from: + id: from-41af + uri: direct + parameters: + name: deleteUser + steps: + - log: + id: log-11fe + message: "删除用户, ID: ${header.id}" + loggingLevel: INFO + logName: com.example.route.user + - setHeader: + id: setHeader-b17d + name: id + expression: + simple: + id: simple-2279 + expression: ${header.id} + resultType: java.lang.Integer + - setBody: + id: setBody-8640 + expression: + simple: + id: simple-70e3 + expression: "{{sqlQueries.deleteUser}}" + - to: + id: to-0b43 + uri: jdbc + parameters: + dataSourceName: postgresDatabase + useHeadersAsParameters: true + - setBody: + id: setBody-568f + expression: + constant: + id: constant-531e + expression: "{\"message\": \"用户已成功删除\"}" +- route: + id: errorHandler + from: + id: from-e7fa + uri: direct + parameters: + name: errorHandler + steps: + - log: + id: log-1da4 + message: "处理错误: ${exception.message}" + loggingLevel: ERROR + logName: com.example.route.error + - setHeader: + id: setHeader-4be1 + name: operation + expression: + constant: + id: constant-59c3 + expression: prepareErrorResponse + - process: + id: process-17a9 + ref: userProcessor + - marshal: + id: marshal-5aec + json: + id: json-1ef9 + prettyPrint: true + library: Jackson diff --git a/camel-jdbc/User.java b/camel-jdbc/User.java new file mode 100644 index 0000000..5177a56 --- /dev/null +++ b/camel-jdbc/User.java @@ -0,0 +1,20 @@ +//DEPS org.projectlombok:lombok:1.18.30 + +package com.example.model; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class User { + private Long id; + private String username; + private String email; + private String fullName; + private String phone; + private String createTime; + private String updateTime; +} \ No newline at end of file diff --git a/camel-jdbc/application.properties b/camel-jdbc/application.properties new file mode 100644 index 0000000..499d2c8 --- /dev/null +++ b/camel-jdbc/application.properties @@ -0,0 +1,24 @@ +camel.karavan.projectId=camel-jdbc +camel.karavan.projectName=camel-jdbc +camel.jbang.gav=org.camel.karavan.demo:cameljdbc:1 +camel.jbang.runtime=camel-main +camel.jbang.version=4.10.0 +camel.jbang.dependencies=camel-console,camel-platform-http-main, +camel.jbang.jib-maven-plugin-version=3.4.4 +camel.server.enabled=true +camel.server.healthCheckEnabled=true +camel.server.devConsoleEnabled=true +camel.main.name=camel-jdbc +camel.main.tracingStandby=true +camel.trace.enabled=true +camel.main.autoConfigurationFailFast=false +camel.routecontroller.superviseEnabled=true +camel.routecontroller.backoffDelay=5000 +camel.routecontroller.backoffMaxAttempts=100 +camel.routecontroller.initialDelay=1000 +camel.routecontroller.threadPoolSize=3 +camel.context.dev-console=true +camel.health.enabled=true +camel.health.exposure-level=full +jkube.version=1.18.0 +jib.from.image=gcr.io/distroless/java17@sha256:68e2373f7bef9486c08356bd9ffd3b40b56e6b9316c5f6885eb58b1d9093b43d \ No newline at end of file diff --git a/camel-jdbc/camel-jdbc.camel.yaml b/camel-jdbc/camel-jdbc.camel.yaml new file mode 100644 index 0000000..d7d2b20 --- /dev/null +++ b/camel-jdbc/camel-jdbc.camel.yaml @@ -0,0 +1,281 @@ +- rest: + id: user-api + description: 用户服务 + path: /api/users + consumes: application/json + produces: application/json + delete: + - id: delete-984c + description: 删除用户 + path: /deleteUser/{id} + to: direct:deleteUser + outType: java.lang.String + get: + - id: get-8b80 + description: 获取所有用户列表 + path: /getAllUsers + to: direct:getAllUsers + outType: java.util.List + - id: get-95c8 + description: 根据ID获取用户信息 + path: /getUserById/{id} + to: direct:getUserById + post: + - id: post-c96c + description: 创建新用户 + path: /createUser + to: direct:createUser + type: com.example.model.User + outType: com.example.model.User + bindingMode: json + put: + - id: put-fa43 + description: 更新用户信息 + path: /updateUser/{id} + to: direct:updateUser + type: com.example.model.User + outType: com.example.model.User +- route: + id: get-all-users-route + from: + id: from-0b1c + uri: direct + parameters: + name: getAllUsers + steps: + - setBody: + id: setBody-fd7e + expression: + constant: + id: constant-5729 + expression: >- + SELECT id, username, email, full_name, phone, create_time, + update_time FROM users ORDER BY id + - to: + id: to-a097 + uri: jdbc + parameters: + dataSourceName: PostgresDatabase + - marshal: + id: marshal-f876 + json: + id: json-4aff +- route: + id: get-user-by-id-route + from: + id: from-c50a + uri: direct + parameters: + name: getUserById + steps: + - setBody: + id: setBody-ff17 + expression: + simple: + id: simple-137e + expression: >- + SELECT id, username, email, full_name as fullName, phone, + create_time as createTime, update_time as updateTime FROM + users WHERE id = ${header.id} + - to: + id: to-5ad5 + uri: jdbc + parameters: + dataSourceName: dataSource + - choice: + id: choice-4f8d + when: + - id: when-c8e8 + expression: + simple: + id: simple-73fc + expression: ${body.size} > 0 + steps: + - transform: + id: transform-5efd + expression: + simple: + id: simple-84b8 + expression: ${body[0]} + - marshal: + id: marshal-6650 + json: + id: json-7743 + otherwise: + id: otherwise-b227 + steps: + - setHeader: + id: setHeader-15a3 + name: CamelHttpResponseCode + expression: + constant: + id: constant-37e1 + expression: "404" + - setBody: + id: setBody-634d + expression: + constant: + id: constant-50fa + expression: "{\"error\": \"用户不存在\"}" + - marshal: + id: marshal-f5a3 + json: + id: json-cf61 +- route: + id: create-user-route + from: + id: from-b805 + uri: direct + parameters: + name: createUser + steps: + - setBody: + id: setBody-2d9f + expression: + simple: + id: simple-9223 + expression: >- + INSERT INTO users (username, email, full_name, phone) VALUES + ('${body.username}', '${body.email}', '${body.fullName}', + '${body.phone}') RETURNING id, username, email, full_name as + fullName, phone, create_time as createTime, update_time as + updateTime + - to: + id: to-c2d7 + uri: jdbc + parameters: + dataSourceName: dataSource + - transform: + id: transform-47bb + expression: + simple: + id: simple-f601 + expression: ${body[0]} +- route: + id: update-user-route + from: + id: from-72c4 + uri: direct + parameters: + name: updateUser + steps: + - setBody: + id: setBody-67d8 + expression: + simple: + id: simple-a84e + expression: >- + UPDATE users SET username = '${body.username}', + email = '${body.email}', + full_name = '${body.fullName}', + phone = '${body.phone}', + update_time = CURRENT_TIMESTAMP + WHERE id = ${header.id} RETURNING id, username, email, + full_name as fullName, phone, create_time as createTime, + update_time as updateTime + - to: + id: to-183c + uri: jdbc + parameters: + dataSourceName: dataSource + - choice: + id: choice-56d3 + when: + - id: when-ccfc + expression: + simple: + id: simple-5121 + expression: ${body.size} > 0 + steps: + - transform: + id: transform-9765 + expression: + simple: + id: simple-f8e2 + expression: ${body[0]} + otherwise: + id: otherwise-181a + steps: + - setHeader: + id: setHeader-5730 + name: CamelHttpResponseCode + expression: + constant: + id: constant-82c6 + expression: "404" + - setBody: + id: setBody-a681 + expression: + constant: + id: constant-ced6 + expression: "{\"error\": \"用户不存在\"}" + - marshal: + id: marshal-18ea + json: + id: json-c22b +- route: + id: delete-user-route + from: + id: from-59ba + uri: direct + parameters: + name: deleteUser + steps: + - setBody: + id: setBody-ccdd + expression: + simple: + id: simple-e35c + expression: DELETE FROM users WHERE id = ${header.id} RETURNING id + - to: + id: to-737a + uri: jdbc + parameters: + dataSourceName: dataSource + - choice: + id: choice-723e + when: + - id: when-ae6b + expression: + simple: + id: simple-5896 + expression: ${body.size} > 0 + steps: + - setBody: + id: setBody-1279 + expression: + constant: + id: constant-67fc + expression: "{\"message\": \"用户已成功删除\"}" + - marshal: + id: marshal-5a7a + json: + id: json-6243 + otherwise: + id: otherwise-2317 + steps: + - setHeader: + id: setHeader-ff9f + name: CamelHttpResponseCode + expression: + constant: + id: constant-57b7 + expression: "404" + - setBody: + id: setBody-1ee6 + expression: + constant: + id: constant-de9d + expression: "{\"error\": \"用户不存在\"}" + - marshal: + id: marshal-7fca + json: + id: json-ff43 +- beans: + - name: PostgresDatabase + type: "#class:org.apache.commons.dbcp2.BasicDataSource" + properties: + username: postgres + password: 1qaz123$ + url: jdbc:postgresql://192.168.56.12:5432/user_db + driverClassName: org.postgresql.Driver diff --git a/camel-jdbc/docker-compose.yaml b/camel-jdbc/docker-compose.yaml new file mode 100644 index 0000000..5aaa628 --- /dev/null +++ b/camel-jdbc/docker-compose.yaml @@ -0,0 +1,8 @@ +services: + camel-jdbc: + image: camel-jdbc + restart: always + ports: + - "8081:8080" + networks: + - karavan \ No newline at end of file