diff --git a/bruno/findUser.bru b/bruno/findSession.bru similarity index 67% rename from bruno/findUser.bru rename to bruno/findSession.bru index 43364c0..3ca409e 100644 --- a/bruno/findUser.bru +++ b/bruno/findSession.bru @@ -1,11 +1,11 @@ meta { - name: findUser + name: findSession type: http seq: 4 } get { - url: http://localhost:9091/services/api/user/2 + url: http://localhost:9090/services/api/session/a3518555-5a96-42a6-a5ec-958c4963a65e body: none auth: basic } diff --git a/bruno/findUsers.bru b/bruno/findSessions.bru similarity index 69% rename from bruno/findUsers.bru rename to bruno/findSessions.bru index ae9b23d..e7327dc 100644 --- a/bruno/findUsers.bru +++ b/bruno/findSessions.bru @@ -1,11 +1,11 @@ meta { - name: findUsers + name: findSessions type: http seq: 2 } get { - url: http://localhost:9091/services/api/user + url: http://localhost:9090/services/api/session body: none auth: basic } diff --git a/bruno/login.bru b/bruno/login.bru new file mode 100644 index 0000000..0e06db7 --- /dev/null +++ b/bruno/login.bru @@ -0,0 +1,20 @@ +meta { + name: login + type: http + seq: 5 +} + +post { + url: http://localhost:9090/services/api/login/a3518555-5a96-42a6-a5ec-958c4963a65e + body: none + auth: basic +} + +headers { + operationName: findUsers +} + +auth:basic { + username: cxfrs + password: password +} diff --git a/bruno/updateSession.bru b/bruno/updateSession.bru new file mode 100644 index 0000000..fada031 --- /dev/null +++ b/bruno/updateSession.bru @@ -0,0 +1,33 @@ +meta { + name: updateSession + type: http + seq: 3 +} + +post { + url: http://localhost:9090/services/api/session + body: json + auth: basic +} + +headers { + Content-Type: application/json + X-MethodName: updateUser +} + +auth:basic { + username: cxfrs + password: password +} + +body:json { + { + "sessionId": "{{uuid}}", + "username": "admin1", + "password": "password1" + } +} + +script:pre-request { + bru.setVar('uuid', require("uuid").v4()); +} diff --git a/bruno/updateUser.bru b/bruno/updateUser.bru deleted file mode 100644 index 097fdf3..0000000 --- a/bruno/updateUser.bru +++ /dev/null @@ -1,28 +0,0 @@ -meta { - name: updateUser - type: http - seq: 3 -} - -post { - url: http://localhost:9091/services/api/user - body: json - auth: basic -} - -headers { - Content-Type: application/json - X-MethodName: updateUser -} - -auth:basic { - username: cxfrs - password: password -} - -body:json { - { - "id": 4, - "name": "Diana Themyscira" - } -} diff --git a/conf/springboot.yml b/conf/springboot.yml index d6c92af..dddb4a4 100644 --- a/conf/springboot.yml +++ b/conf/springboot.yml @@ -15,10 +15,7 @@ spring: password: secret app: - queue-name: "UserServiceQueue" - zookeeper: - url: "127.0.0.1:2181" - group-name: "UserServiceGroup" + queue-name: "SessionServiceQueue" database: url: "jdbc:h2:tcp://localhost/~/h2/db/appdb" username: "app" diff --git a/conf2/springboot.yml b/conf2/springboot.yml index 1a8d4a5..ccb1071 100644 --- a/conf2/springboot.yml +++ b/conf2/springboot.yml @@ -15,10 +15,7 @@ spring: password: secret app: - queue-name: "UserServiceQueue" - zookeeper: - url: "127.0.0.1:2181" - group-name: "UserServiceGroup" + queue-name: "SessionServiceQueue" database: url: "jdbc:h2:tcp://localhost/~/h2/db/appdb" username: "app" diff --git a/pom.xml b/pom.xml index f03c3e4..679ff11 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ 4.0.0 com.example camel-springboot-activemq6-example - 2.1.2 + 3.0.0 camel-springboot-activemq6-example org.springframework.boot @@ -19,6 +19,8 @@ ${project.parent.version} 3.5.19 3.0.4 + 4.11.1 + 33.1.0-jre @@ -89,11 +91,19 @@ org.apache.camel.springboot - camel-zookeeper-master-starter + camel-mybatis-starter + + - org.apache.camel.springboot - camel-mybatis-starter + com.google.guava + guava + ${guava.version} + + + org.htmlunit + htmlunit + ${htmlunit.version} com.h2database @@ -118,6 +128,10 @@ com.fasterxml.jackson.jakarta.rs jackson-jakarta-rs-json-provider + + org.apache.commons + commons-lang3 + diff --git a/readme.md b/readme.md index 544a12f..6c022ce 100644 --- a/readme.md +++ b/readme.md @@ -5,7 +5,6 @@ ``` ApacheDS Server 2.0.0.AM27 Apache ActiveMQ 6.1.5 - Apache Zookeeper 3.9.3 H2 Database Version 2.3.232 ``` @@ -96,119 +95,7 @@ Loading message broker from: xbean:activemq.xml INFO | ActiveMQ Jolokia REST API available at http://127.0.0.1:8161/api/jolokia/ ``` -**3. Apache Zookeeper 3.9.3** - -``` -C:\Users\XXX\apache-zookeeper-3.9.3-bin>bin\zkServer.cmd - -C:\Users\XXX\apache-zookeeper-3.9.3-bin>call "C:\Users\XXX\graalvm-jdk-17.0.14+8.1"\bin\java "-Dzookeeper.log.dir=C:\Users\XXX\apache-zookeeper-3.9.3-bin\bin\..\logs" "-Dzookeeper.log.file=zookeeper-XXX-server-DESKTOP-66E87L5.log" "-XX:+HeapDumpOnOutOfMemoryError" "-XX:OnOutOfMemoryError=cmd /c taskkill /pid %%p /t /f" -cp "C:\Users\XXX\apache-zookeeper-3.9.3-bin\bin\..\build\classes;C:\Users\XXX\apache-zookeeper-3.9.3-bin\bin\..\build\lib\*;C:\Users\XXX\apache-zookeeper-3.9.3-bin\bin\..\*;C:\Users\XXX\apache-zookeeper-3.9.3-bin\bin\..\lib\*;C:\Users\XXX\apache-zookeeper-3.9.3-bin\bin\..\conf" org.apache.zookeeper.server.quorum.QuorumPeerMain "C:\Users\XXX\apache-zookeeper-3.9.3-bin\bin\..\conf\zoo.cfg" -2025-03-01 15:15:37,456 [myid:] - INFO [main:o.a.z.s.q.QuorumPeerConfig@177] - Reading configuration from: C:\Users\XXX\apache-zookeeper-3.9.3-bin\bin\..\conf\zoo.cfg -2025-03-01 15:15:37,458 [myid:] - WARN [main:o.a.z.s.u.VerifyingFileFactory@65] - data is relative. Prepend .\ to indicate that you're sure! -2025-03-01 15:15:37,460 [myid:] - INFO [main:o.a.z.s.q.QuorumPeerConfig@440] - clientPortAddress is 0.0.0.0:2181 -2025-03-01 15:15:37,460 [myid:] - INFO [main:o.a.z.s.q.QuorumPeerConfig@444] - secureClientPort is not set -2025-03-01 15:15:37,460 [myid:] - INFO [main:o.a.z.s.q.QuorumPeerConfig@460] - observerMasterPort is not set -2025-03-01 15:15:37,460 [myid:] - INFO [main:o.a.z.s.q.QuorumPeerConfig@477] - metricsProvider.className is org.apache.zookeeper.metrics.impl.DefaultMetricsProvider -2025-03-01 15:15:37,460 [myid:] - INFO [main:o.a.z.s.DatadirCleanupManager@78] - autopurge.snapRetainCount set to 3 -2025-03-01 15:15:37,460 [myid:] - INFO [main:o.a.z.s.DatadirCleanupManager@79] - autopurge.purgeInterval set to 0 -2025-03-01 15:15:37,460 [myid:] - INFO [main:o.a.z.s.DatadirCleanupManager@101] - Purge task is not scheduled. -2025-03-01 15:15:37,460 [myid:] - WARN [main:o.a.z.s.q.QuorumPeerMain@139] - Either no config or no quorum defined in config, running in standalone mode -2025-03-01 15:15:37,460 [myid:] - INFO [main:o.a.z.j.ManagedUtil@46] - Log4j 1.2 jmx support not found; jmx disabled. -2025-03-01 15:15:37,460 [myid:] - INFO [main:o.a.z.s.q.QuorumPeerConfig@177] - Reading configuration from: C:\Users\XXX\apache-zookeeper-3.9.3-bin\bin\..\conf\zoo.cfg -2025-03-01 15:15:37,460 [myid:] - WARN [main:o.a.z.s.u.VerifyingFileFactory@65] - data is relative. Prepend .\ to indicate that you're sure! -2025-03-01 15:15:37,460 [myid:] - INFO [main:o.a.z.s.q.QuorumPeerConfig@440] - clientPortAddress is 0.0.0.0:2181 -2025-03-01 15:15:37,460 [myid:] - INFO [main:o.a.z.s.q.QuorumPeerConfig@444] - secureClientPort is not set -2025-03-01 15:15:37,460 [myid:] - INFO [main:o.a.z.s.q.QuorumPeerConfig@460] - observerMasterPort is not set -2025-03-01 15:15:37,460 [myid:] - INFO [main:o.a.z.s.q.QuorumPeerConfig@477] - metricsProvider.className is org.apache.zookeeper.metrics.impl.DefaultMetricsProvider -2025-03-01 15:15:37,460 [myid:] - INFO [main:o.a.z.s.ZooKeeperServerMain@123] - Starting server -2025-03-01 15:15:37,460 [myid:] - INFO [main:o.a.z.s.ServerMetrics@64] - ServerMetrics initialized with provider org.apache.zookeeper.metrics.impl.DefaultMetricsProvider@4c762604 -2025-03-01 15:15:37,478 [myid:] - INFO [main:o.a.z.s.a.DigestAuthenticationProvider@51] - ACL digest algorithm is: SHA1 -2025-03-01 15:15:37,481 [myid:] - INFO [main:o.a.z.s.a.DigestAuthenticationProvider@65] - zookeeper.DigestAuthenticationProvider.enabled = true -2025-03-01 15:15:37,481 [myid:] - INFO [main:o.a.z.s.p.FileTxnSnapLog@124] - zookeeper.snapshot.trust.empty : false -2025-03-01 15:15:37,481 [myid:] - INFO [main:o.a.z.ZookeeperBanner@42] - -2025-03-01 15:15:37,481 [myid:] - INFO [main:o.a.z.ZookeeperBanner@42] - ______ _ -2025-03-01 15:15:37,481 [myid:] - INFO [main:o.a.z.ZookeeperBanner@42] - |___ / | | -2025-03-01 15:15:37,481 [myid:] - INFO [main:o.a.z.ZookeeperBanner@42] - / / ___ ___ | | __ ___ ___ _ __ ___ _ __ -2025-03-01 15:15:37,481 [myid:] - INFO [main:o.a.z.ZookeeperBanner@42] - / / / _ \ / _ \ | |/ / / _ \ / _ \ | '_ \ / _ \ | '__| -2025-03-01 15:15:37,481 [myid:] - INFO [main:o.a.z.ZookeeperBanner@42] - / /__ | (_) | | (_) | | < | __/ | __/ | |_) | | __/ | | -2025-03-01 15:15:37,481 [myid:] - INFO [main:o.a.z.ZookeeperBanner@42] - /_____| \___/ \___/ |_|\_\ \___| \___| | .__/ \___| |_| -2025-03-01 15:15:37,481 [myid:] - INFO [main:o.a.z.ZookeeperBanner@42] - | | -2025-03-01 15:15:37,481 [myid:] - INFO [main:o.a.z.ZookeeperBanner@42] - |_| -2025-03-01 15:15:37,481 [myid:] - INFO [main:o.a.z.ZookeeperBanner@42] - -2025-03-01 15:15:37,492 [myid:] - INFO [main:o.a.z.Environment@98] - Server environment:zookeeper.version=3.9.3-c26634f34490bb0ea7a09cc51e05ede3b4e320ee, built on 2024-10-17 23:21 UTC -2025-03-01 15:15:37,492 [myid:] - INFO [main:o.a.z.Environment@98] - Server environment:host.name=DESKTOP-66E87L5 -2025-03-01 15:15:37,492 [myid:] - INFO [main:o.a.z.Environment@98] - Server environment:java.version=17.0.14 -2025-03-01 15:15:37,492 [myid:] - INFO [main:o.a.z.Environment@98] - Server environment:java.vendor=Oracle Corporation -2025-03-01 15:15:37,492 [myid:] - INFO [main:o.a.z.Environment@98] - Server environment:java.home=C:\Users\XXX\graalvm-jdk-17.0.14+8.1 -2025-03-01 15:15:37,492 [myid:] - INFO [main:o.a.z.Environment@98] - Server environment:java.class.path=C:\Users\XXX\apache-zookeeper-3.9.3-bin\bin\..\build\classes;C:\Users\XXX\apache-zookeeper-3.9.3-bin\bin\..\build\lib\*;C:\Users\XXX\apache-zookeeper-3.9.3-bin\bin\..\*;C:\Users\XXX\apache-zookeeper-3.9.3-bin\bin\..\lib\audience-annotations-0.12.0.jar;C:\Users\XXX\apache-zookeeper-3.9.3-bin\bin\..\lib\commons-cli-1.5.0.jar;C:\Users\XXX\apache-zookeeper-3.9.3-bin\bin\..\lib\commons-io-2.17.0.jar;C:\Users\XXX\apache-zookeeper-3.9.3-bin\bin\..\lib\jackson-annotations-2.15.2.jar;C:\Users\XXX\apache-zookeeper-3.9.3-bin\bin\..\lib\jackson-core-2.15.2.jar;C:\Users\XXX\apache-zookeeper-3.9.3-bin\bin\..\lib\jackson-databind-2.15.2.jar;C:\Users\XXX\apache-zookeeper-3.9.3-bin\bin\..\lib\javax.servlet-api-3.1.0.jar;C:\Users\XXX\apache-zookeeper-3.9.3-bin\bin\..\lib\jetty-http-9.4.56.v20240826.jar;C:\Users\XXX\apache-zookeeper-3.9.3-bin\bin\..\lib\jetty-io-9.4.56.v20240826.jar;C:\Users\XXX\apache-zookeeper-3.9.3-bin\bin\..\lib\jetty-security-9.4.56.v20240826.jar;C:\Users\XXX\apache-zookeeper-3.9.3-bin\bin\..\lib\jetty-server-9.4.56.v20240826.jar;C:\Users\XXX\apache-zookeeper-3.9.3-bin\bin\..\lib\jetty-servlet-9.4.56.v20240826.jar;C:\Users\XXX\apache-zookeeper-3.9.3-bin\bin\..\lib\jetty-util-9.4.56.v20240826.jar;C:\Users\XXX\apache-zookeeper-3.9.3-bin\bin\..\lib\jetty-util-ajax-9.4.56.v20240826.jar;C:\Users\XXX\apache-zookeeper-3.9.3-bin\bin\..\lib\jline-2.14.6.jar;C:\Users\XXX\apache-zookeeper-3.9.3-bin\bin\..\lib\logback-classic-1.2.13.jar;C:\Users\XXX\apache-zookeeper-3.9.3-bin\bin\..\lib\logback-core-1.2.13.jar;C:\Users\XXX\apache-zookeeper-3.9.3-bin\bin\..\lib\metrics-core-4.1.12.1.jar;C:\Users\XXX\apache-zookeeper-3.9.3-bin\bin\..\lib\netty-buffer-4.1.113.Final.jar;C:\Users\XXX\apache-zookeeper-3.9.3-bin\bin\..\lib\netty-codec-4.1.113.Final.jar;C:\Users\XXX\apache-zookeeper-3.9.3-bin\bin\..\lib\netty-common-4.1.113.Final.jar;C:\Users\XXX\apache-zookeeper-3.9.3-bin\bin\..\lib\netty-handler-4.1.113.Final.jar;C:\Users\XXX\apache-zookeeper-3.9.3-bin\bin\..\lib\netty-resolver-4.1.113.Final.jar;C:\Users\XXX\apache-zookeeper-3.9.3-bin\bin\..\lib\netty-tcnative-boringssl-static-2.0.66.Final-linux-aarch_64.jar;C:\Users\XXX\apache-zookeeper-3.9.3-bin\bin\..\lib\netty-tcnative-boringssl-static-2.0.66.Final-linux-x86_64.jar;C:\Users\XXX\apache-zookeeper-3.9.3-bin\bin\..\lib\netty-tcnative-boringssl-static-2.0.66.Final-osx-aarch_64.jar;C:\Users\XXX\apache-zookeeper-3.9.3-bin\bin\..\lib\netty-tcnative-boringssl-static-2.0.66.Final-osx-x86_64.jar;C:\Users\XXX\apache-zookeeper-3.9.3-bin\bin\..\lib\netty-tcnative-boringssl-static-2.0.66.Final-windows-x86_64.jar;C:\Users\XXX\apache-zookeeper-3.9.3-bin\bin\..\lib\netty-tcnative-boringssl-static-2.0.66.Final.jar;C:\Users\XXX\apache-zookeeper-3.9.3-bin\bin\..\lib\netty-tcnative-classes-2.0.66.Final.jar;C:\Users\XXX\apache-zookeeper-3.9.3-bin\bin\..\lib\netty-transport-4.1.113.Final.jar;C:\Users\XXX\apache-zookeeper-3.9.3-bin\bin\..\lib\netty-transport-classes-epoll-4.1.113.Final.jar;C:\Users\XXX\apache-zookeeper-3.9.3-bin\bin\..\lib\netty-transport-native-epoll-4.1.113.Final-linux-x86_64.jar;C:\Users\XXX\apache-zookeeper-3.9.3-bin\bin\..\lib\netty-transport-native-unix-common-4.1.113.Final.jar;C:\Users\XXX\apache-zookeeper-3.9.3-bin\bin\..\lib\simpleclient-0.9.0.jar;C:\Users\XXX\apache-zookeeper-3.9.3-bin\bin\..\lib\simpleclient_common-0.9.0.jar;C:\Users\XXX\apache-zookeeper-3.9.3-bin\bin\..\lib\simpleclient_hotspot-0.9.0.jar;C:\Users\XXX\apache-zookeeper-3.9.3-bin\bin\..\lib\simpleclient_servlet-0.9.0.jar;C:\Users\XXX\apache-zookeeper-3.9.3-bin\bin\..\lib\slf4j-api-1.7.30.jar;C:\Users\XXX\apache-zookeeper-3.9.3-bin\bin\..\lib\snappy-java-1.1.10.5.jar;C:\Users\XXX\apache-zookeeper-3.9.3-bin\bin\..\lib\zookeeper-3.9.3.jar;C:\Users\XXX\apache-zookeeper-3.9.3-bin\bin\..\lib\zookeeper-jute-3.9.3.jar;C:\Users\XXX\apache-zookeeper-3.9.3-bin\bin\..\lib\zookeeper-prometheus-metrics-3.9.3.jar;C:\Users\XXX\apache-zookeeper-3.9.3-bin\bin\..\conf -2025-03-01 15:15:37,492 [myid:] - INFO [main:o.a.z.Environment@98] - Server environment:java.library.path=C:\Users\XXX\graalvm-jdk-17.0.14+8.1\bin;C:\WINDOWS\Sun\Java\bin;C:\WINDOWS\system32;C:\WINDOWS;C:\WINDOWS\system32;C:\WINDOWS;C:\WINDOWS\System32\Wbem;C:\WINDOWS\System32\WindowsPowerShell\v1.0\;C:\WINDOWS\System32\OpenSSH\;C:\Program Files (x86)\NVIDIA Corporation\PhysX\Common;C:\Program Files\NVIDIA Corporation\NVIDIA NvDLISR;C:\Program Files\PuTTY\;C:\Users\XXX\AppData\Local\Microsoft\WindowsApps;C:\Users\XXX\graalvm-jdk-17.0.14+8.1\bin;;C:\Users\XXX\graalvm-jdk-17.0.14+8.1\bin;. -2025-03-01 15:15:37,492 [myid:] - INFO [main:o.a.z.Environment@98] - Server environment:java.io.tmpdir=C:\Users\XXX\AppData\Local\Temp\ -2025-03-01 15:15:37,492 [myid:] - INFO [main:o.a.z.Environment@98] - Server environment:java.compiler= -2025-03-01 15:15:37,492 [myid:] - INFO [main:o.a.z.Environment@98] - Server environment:os.name=Windows 11 -2025-03-01 15:15:37,492 [myid:] - INFO [main:o.a.z.Environment@98] - Server environment:os.arch=amd64 -2025-03-01 15:15:37,492 [myid:] - INFO [main:o.a.z.Environment@98] - Server environment:os.version=10.0 -2025-03-01 15:15:37,492 [myid:] - INFO [main:o.a.z.Environment@98] - Server environment:user.name=XXX -2025-03-01 15:15:37,492 [myid:] - INFO [main:o.a.z.Environment@98] - Server environment:user.home=C:\Users\XXX -2025-03-01 15:15:37,492 [myid:] - INFO [main:o.a.z.Environment@98] - Server environment:user.dir=C:\Users\XXX\apache-zookeeper-3.9.3-bin -2025-03-01 15:15:37,492 [myid:] - INFO [main:o.a.z.Environment@98] - Server environment:os.memory.free=495MB -2025-03-01 15:15:37,492 [myid:] - INFO [main:o.a.z.Environment@98] - Server environment:os.memory.max=8136MB -2025-03-01 15:15:37,492 [myid:] - INFO [main:o.a.z.Environment@98] - Server environment:os.memory.total=512MB -2025-03-01 15:15:37,492 [myid:] - INFO [main:o.a.z.s.ZooKeeperServer@149] - zookeeper.enableEagerACLCheck = false -2025-03-01 15:15:37,492 [myid:] - INFO [main:o.a.z.s.ZooKeeperServer@162] - zookeeper.digest.enabled = true -2025-03-01 15:15:37,492 [myid:] - INFO [main:o.a.z.s.ZooKeeperServer@166] - zookeeper.closeSessionTxn.enabled = true -2025-03-01 15:15:37,492 [myid:] - INFO [main:o.a.z.s.ZooKeeperServer@2242] - zookeeper.serializeLastProcessedZxid.enabled = true -2025-03-01 15:15:37,492 [myid:] - INFO [main:o.a.z.s.ZooKeeperServer@1585] - zookeeper.flushDelay = 0 ms -2025-03-01 15:15:37,492 [myid:] - INFO [main:o.a.z.s.ZooKeeperServer@1594] - zookeeper.maxWriteQueuePollTime = 0 ms -2025-03-01 15:15:37,492 [myid:] - INFO [main:o.a.z.s.ZooKeeperServer@1603] - zookeeper.maxBatchSize=1000 -2025-03-01 15:15:37,492 [myid:] - INFO [main:o.a.z.s.ZooKeeperServer@287] - zookeeper.intBufferStartingSizeBytes = 1024 -2025-03-01 15:15:37,492 [myid:] - INFO [main:o.a.z.s.BlueThrottle@141] - Weighed connection throttling is disabled -2025-03-01 15:15:37,492 [myid:] - INFO [main:o.a.z.s.AuthenticationHelper@66] - zookeeper.enforce.auth.enabled = false -2025-03-01 15:15:37,492 [myid:] - INFO [main:o.a.z.s.AuthenticationHelper@67] - zookeeper.enforce.auth.schemes = [] -2025-03-01 15:15:37,492 [myid:] - INFO [main:o.a.z.s.ZooKeeperServer@1395] - minSessionTimeout set to 4000 ms -2025-03-01 15:15:37,492 [myid:] - INFO [main:o.a.z.s.ZooKeeperServer@1404] - maxSessionTimeout set to 40000 ms -2025-03-01 15:15:37,492 [myid:] - INFO [main:o.a.z.s.ResponseCache@45] - getData response cache size is initialized with value 400. -2025-03-01 15:15:37,492 [myid:] - INFO [main:o.a.z.s.ResponseCache@45] - getChildren response cache size is initialized with value 400. -2025-03-01 15:15:37,492 [myid:] - INFO [main:o.a.z.s.u.RequestPathMetricsCollector@109] - zookeeper.pathStats.slotCapacity = 60 -2025-03-01 15:15:37,492 [myid:] - INFO [main:o.a.z.s.u.RequestPathMetricsCollector@110] - zookeeper.pathStats.slotDuration = 15 -2025-03-01 15:15:37,492 [myid:] - INFO [main:o.a.z.s.u.RequestPathMetricsCollector@111] - zookeeper.pathStats.maxDepth = 6 -2025-03-01 15:15:37,492 [myid:] - INFO [main:o.a.z.s.u.RequestPathMetricsCollector@112] - zookeeper.pathStats.initialDelay = 5 -2025-03-01 15:15:37,492 [myid:] - INFO [main:o.a.z.s.u.RequestPathMetricsCollector@113] - zookeeper.pathStats.delay = 5 -2025-03-01 15:15:37,492 [myid:] - INFO [main:o.a.z.s.u.RequestPathMetricsCollector@114] - zookeeper.pathStats.enabled = false -2025-03-01 15:15:37,492 [myid:] - INFO [main:o.a.z.s.ZooKeeperServer@1622] - The max bytes for all large requests are set to 104857600 -2025-03-01 15:15:37,492 [myid:] - INFO [main:o.a.z.s.ZooKeeperServer@1636] - The large request threshold is set to -1 -2025-03-01 15:15:37,492 [myid:] - INFO [main:o.a.z.s.ZooKeeperServer@385] - Created server with tickTime 2000 ms minSessionTimeout 4000 ms maxSessionTimeout 40000 ms clientPortListenBacklog -1 dataLogdir data\version-2 snapdir data\version-2 -2025-03-01 15:15:37,513 [myid:] - INFO [main:o.e.j.u.l.Log@170] - Logging initialized @220ms to org.eclipse.jetty.util.log.Slf4jLog -2025-03-01 15:15:37,545 [myid:] - WARN [main:o.e.j.s.h.ContextHandler@1662] - o.e.j.s.ServletContextHandler@6cf0e0ba{/,null,STOPPED} contextPath ends with /* -2025-03-01 15:15:37,545 [myid:] - WARN [main:o.e.j.s.h.ContextHandler@1673] - Empty contextPath -2025-03-01 15:15:37,556 [myid:] - INFO [main:o.e.j.s.Server@375] - jetty-9.4.56.v20240826; built: 2024-08-26T17:15:05.868Z; git: ec6782ff5ead824dabdcf47fa98f90a4aedff401; jvm 17.0.14+8-LTS-jvmci-23.0-b54 -2025-03-01 15:15:37,570 [myid:] - INFO [main:o.e.j.s.s.DefaultSessionIdManager@334] - DefaultSessionIdManager workerName=node0 -2025-03-01 15:15:37,570 [myid:] - INFO [main:o.e.j.s.s.DefaultSessionIdManager@339] - No SessionScavenger set, using defaults -2025-03-01 15:15:37,570 [myid:] - INFO [main:o.e.j.s.s.HouseKeeper@132] - node0 Scavenging every 660000ms -2025-03-01 15:15:37,570 [myid:] - WARN [main:o.e.j.s.ConstraintSecurityHandler@759] - ServletContext@o.e.j.s.ServletContextHandler@6cf0e0ba{/,null,STARTING} has uncovered http methods for path: /* -2025-03-01 15:15:37,583 [myid:] - INFO [main:o.e.j.s.h.ContextHandler@921] - Started o.e.j.s.ServletContextHandler@6cf0e0ba{/,null,AVAILABLE} -2025-03-01 15:15:37,647 [myid:] - INFO [main:o.e.j.s.AbstractConnector@333] - Started ServerConnector@3c407114{HTTP/1.1, (http/1.1)}{0.0.0.0:8080} -2025-03-01 15:15:37,647 [myid:] - INFO [main:o.e.j.s.Server@415] - Started @352ms -2025-03-01 15:15:37,647 [myid:] - INFO [main:o.a.z.s.a.JettyAdminServer@201] - Started AdminServer on address 0.0.0.0, port 8080 and command URL /commands -2025-03-01 15:15:37,649 [myid:] - INFO [main:o.a.z.s.ServerCnxnFactory@172] - Using org.apache.zookeeper.server.NIOServerCnxnFactory as server connection factory -2025-03-01 15:15:37,649 [myid:] - WARN [main:o.a.z.s.ServerCnxnFactory@337] - maxCnxns is not configured, using default value 0. -2025-03-01 15:15:37,649 [myid:] - INFO [main:o.a.z.s.NIOServerCnxnFactory@652] - Configuring NIO connection handler with 10s sessionless connection timeout, 3 selector thread(s), 56 worker threads, and 64 kB direct buffers. -2025-03-01 15:15:37,649 [myid:] - INFO [main:o.a.z.s.NIOServerCnxnFactory@660] - binding to port 0.0.0.0/0.0.0.0:2181 -2025-03-01 15:15:37,659 [myid:] - INFO [main:o.a.z.s.w.WatchManagerFactory@42] - Using org.apache.zookeeper.server.watch.WatchManager as watch manager -2025-03-01 15:15:37,660 [myid:] - INFO [main:o.a.z.s.w.WatchManagerFactory@42] - Using org.apache.zookeeper.server.watch.WatchManager as watch manager -2025-03-01 15:15:37,660 [myid:] - INFO [main:o.a.z.s.ZKDatabase@134] - zookeeper.snapshotSizeFactor = 0.33 -2025-03-01 15:15:37,660 [myid:] - INFO [main:o.a.z.s.ZKDatabase@154] - zookeeper.commitLogCount=500 -2025-03-01 15:15:37,664 [myid:] - INFO [main:o.a.z.s.p.SnapStream@61] - zookeeper.snapshot.compression.method = CHECKED -2025-03-01 15:15:37,664 [myid:] - INFO [main:o.a.z.s.p.FileTxnSnapLog@480] - Snapshotting: 0x0 to data\version-2\snapshot.0 -2025-03-01 15:15:37,665 [myid:] - INFO [main:o.a.z.s.ZKDatabase@291] - Snapshot loaded in 5 ms, highest zxid is 0x0, digest is 1371985504 -2025-03-01 15:15:37,666 [myid:] - INFO [main:o.a.z.s.p.FileTxnSnapLog@480] - Snapshotting: 0x0 to data\version-2\snapshot.0 -2025-03-01 15:15:37,667 [myid:] - INFO [main:o.a.z.s.ZooKeeperServer@589] - Snapshot taken in 0 ms -2025-03-01 15:15:37,670 [myid:] - INFO [ProcessThread(sid:0 cport:2181)::o.a.z.s.PrepRequestProcessor@138] - PrepRequestProcessor (sid:0) started, reconfigEnabled=false -2025-03-01 15:15:37,670 [myid:] - INFO [main:o.a.z.s.RequestThrottler@75] - zookeeper.request_throttler.shutdownTimeout = 10000 ms -2025-03-01 15:15:37,719 [myid:] - INFO [main:o.a.z.s.ContainerManager@83] - Using checkIntervalMs=60000 maxPerMinute=10000 maxNeverUsedIntervalMs=0 -2025-03-01 15:15:37,720 [myid:] - INFO [main:o.a.z.a.ZKAuditProvider@42] - ZooKeeper audit is disabled. -2025-03-01 15:28:22,213 [myid:] - INFO [SyncThread:0:o.a.z.s.p.FileTxnLog@291] - Creating new log file: log.1 -``` - -**4. H2 Database Version 2.3.232** +**3. H2 Database Version 2.3.232** ``` C:\Users\XXX\Desktop>SET JAVA_HOME=C:\Users\XXX\graalvm-jdk-17.0.14+8.1 diff --git a/src/main/java/com/example/sbcamel/User.java b/src/main/java/com/example/sbcamel/User.java deleted file mode 100644 index 1c39d0c..0000000 --- a/src/main/java/com/example/sbcamel/User.java +++ /dev/null @@ -1,52 +0,0 @@ -package com.example.sbcamel; - -import java.io.Serializable; -import java.util.StringJoiner; - -import jakarta.validation.constraints.NotNull; -import jakarta.validation.constraints.Size; - -/** - * User entity - * - */ -@SuppressWarnings("serial") -public class User implements Serializable { - - @NotNull(message = "custom message") - private Integer id; - - @NotNull - @Size(min = 3, max = 20) - private String name; - - public User() { - } - - public User(Integer id, String name) { - this.id = id; - this.name = name; - } - - public Integer getId() { - return id; - } - - public void setId(Integer id) { - this.id = id; - } - - public String getName() { - return name; - } - - public void setName(String name) { - this.name = name; - } - - @Override - public String toString() { - return new StringJoiner(", ", User.class.getSimpleName() + "[", "]").add("id=" + id).add("name='" + name + "'") - .toString(); - } -} \ No newline at end of file diff --git a/src/main/java/com/example/sbcamel/UserService.java b/src/main/java/com/example/sbcamel/UserService.java deleted file mode 100644 index 2aef174..0000000 --- a/src/main/java/com/example/sbcamel/UserService.java +++ /dev/null @@ -1,50 +0,0 @@ -package com.example.sbcamel; - -import java.util.Collection; - -import jakarta.validation.Valid; -import jakarta.ws.rs.Consumes; -import jakarta.ws.rs.GET; -import jakarta.ws.rs.POST; -import jakarta.ws.rs.Path; -import jakarta.ws.rs.PathParam; -import jakarta.ws.rs.Produces; -import jakarta.ws.rs.core.MediaType; - -/** - * Service interface for managing users. - */ -public interface UserService { - - /** - * Find a user by the given ID - * - * @param id the ID of the user - * @return the user, or null if user not found. - */ - @GET - @Path("/user/{id}") - @Produces(MediaType.APPLICATION_JSON) - User findUser(@PathParam("id") Integer id); - - /** - * Find all users - * - * @return a collection of all users - */ - @GET - @Path("/user") - @Produces(MediaType.APPLICATION_JSON) - Collection findUsers(); - - /** - * Update the given user - * - * @param user the user - */ - @POST - @Path("/user") - @Consumes(MediaType.APPLICATION_JSON) - User updateUser(@Valid User user); - -} \ No newline at end of file diff --git a/src/main/java/com/example/sbcamel/init/AppConfig.java b/src/main/java/com/example/sbcamel/init/AppConfig.java new file mode 100644 index 0000000..350e820 --- /dev/null +++ b/src/main/java/com/example/sbcamel/init/AppConfig.java @@ -0,0 +1,21 @@ +package com.example.sbcamel.init; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +import com.example.sbcamel.processor.LoginProcessor; +import com.fasterxml.jackson.jakarta.rs.json.JacksonJsonProvider; + +@Configuration +public class AppConfig { + + @Bean + public JacksonJsonProvider jaxrsProvider() { + return new JacksonJsonProvider(); + } + + @Bean + public LoginProcessor loginProcessor() { + return new LoginProcessor(); + } +} diff --git a/src/main/java/com/example/sbcamel/CamelRouter.java b/src/main/java/com/example/sbcamel/init/CamelRouter.java similarity index 65% rename from src/main/java/com/example/sbcamel/CamelRouter.java rename to src/main/java/com/example/sbcamel/init/CamelRouter.java index 50a61c6..e7bda4d 100644 --- a/src/main/java/com/example/sbcamel/CamelRouter.java +++ b/src/main/java/com/example/sbcamel/init/CamelRouter.java @@ -1,11 +1,10 @@ -package com.example.sbcamel; +package com.example.sbcamel.init; import org.apache.camel.Exchange; import org.apache.camel.builder.RouteBuilder; import org.apache.camel.component.bean.BeanConstants; import org.apache.camel.component.bean.validator.BeanValidationException; import org.apache.camel.component.cxf.common.message.CxfConstants; -import org.apache.camel.component.zookeepermaster.policy.MasterRoutePolicy; import org.apache.camel.model.dataformat.JsonLibrary; import org.springframework.beans.factory.annotation.Autowired; @@ -13,30 +12,31 @@ import org.springframework.beans.factory.annotation.Value; import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.stereotype.Component; +import com.example.sbcamel.mapper.SessionMapper; +import com.example.sbcamel.processor.LoginProcessor; +import com.example.sbcamel.service.SessionService; + import jakarta.annotation.PostConstruct; import jakarta.ws.rs.core.Response; @Component public class CamelRouter extends RouteBuilder { - private static final String createUserSql = "CREATE TABLE IF NOT EXISTS public.\"user\" (id BIGINT not null, " - + "name CHARACTER VARYING not null, PRIMARY KEY (id))"; + private static final String createSessionSql = "CREATE TABLE IF NOT EXISTS public.session (sessionId UUID not null, " + + "username CHARACTER VARYING not null, password CHARACTER VARYING not null, PRIMARY KEY (sessionId))"; @Value("${app.queue-name}") private String queueName; - @Value("${app.zookeeper.url}") - private String zookeeperUrl; - - @Value("${app.zookeeper.group-name}") - private String groupName; - @Autowired private JdbcTemplate jdbcTemplate; + @Autowired + protected LoginProcessor loginProcessor; + @PostConstruct private void init() { org.apache.ibatis.logging.LogFactory.useSlf4jLogging(); - jdbcTemplate.execute(createUserSql); + jdbcTemplate.execute(createSessionSql); } @Override @@ -50,7 +50,7 @@ public class CamelRouter extends RouteBuilder { .setHeader(Exchange.HTTP_RESPONSE_CODE, constant(Response.Status.NOT_FOUND.getStatusCode())) .setBody(simple("${exchangeProperty.CamelExceptionCaught.getMessage()}")); - from("cxfrs:/api?resourceClasses=" + UserService.class.getName() + "&bindingStyle=Default" + from("cxfrs:/api?resourceClasses=" + SessionService.class.getName() + "&bindingStyle=Default" + "&providers=jaxrsProvider&loggingFeatureEnabled=true").to("log:cxfrs?showAll=true") .to("bean-validator:user").to("activemq6:queue:" + queueName).process(exchange -> { if (exchange.getMessage().getBody() != null && exchange.getMessage().getBody() instanceof byte[] @@ -61,21 +61,19 @@ public class CamelRouter extends RouteBuilder { } }); - MasterRoutePolicy masterRoutePolicy = new MasterRoutePolicy(); - masterRoutePolicy.setZooKeeperUrl(zookeeperUrl); - masterRoutePolicy.setGroupName(groupName); - - from("activemq6:queue:" + queueName).autoStartup("false").routePolicy(masterRoutePolicy) + from("activemq6:queue:" + queueName) .process(exchange -> exchange.getIn().setHeader(BeanConstants.BEAN_METHOD_NAME, exchange.getIn().getHeader(CxfConstants.OPERATION_NAME.toLowerCase()))) .to("log:activemq?showAll=true").transacted("propagationRequired").choice() - .when(header(BeanConstants.BEAN_METHOD_NAME).isEqualTo("updateUser")) - .to("mybatis:com.example.sbcamel.mapper.UserMapper.updateUser?statementType=Update") - .when(header(BeanConstants.BEAN_METHOD_NAME).isEqualTo("findUsers")) - .to("mybatis:com.example.sbcamel.mapper.UserMapper.findUsers?statementType=SelectList") - .when(header(BeanConstants.BEAN_METHOD_NAME).isEqualTo("findUser")) - .to("mybatis:com.example.sbcamel.mapper.UserMapper.findUser?statementType=SelectOne") - .end().marshal().json(JsonLibrary.Jackson); + .when(header(BeanConstants.BEAN_METHOD_NAME).isEqualTo("updateSession")) + .to("mybatis:" + SessionMapper.class.getName() + ".updateSession?statementType=Update") + .when(header(BeanConstants.BEAN_METHOD_NAME).isEqualTo("findSessions")) + .to("mybatis:" + SessionMapper.class.getName() + ".findSessions?statementType=SelectList") + .when(header(BeanConstants.BEAN_METHOD_NAME).isEqualTo("findSession")) + .to("mybatis:" + SessionMapper.class.getName() + ".findSession?statementType=SelectOne") + .when(header(BeanConstants.BEAN_METHOD_NAME).isEqualTo("login")) + .to("mybatis:" + SessionMapper.class.getName() + ".findSession?statementType=SelectOne") + .process(loginProcessor).end().marshal().json(JsonLibrary.Jackson); } } \ No newline at end of file diff --git a/src/main/java/com/example/sbcamel/DatabaseConfig.java b/src/main/java/com/example/sbcamel/init/DatabaseConfig.java similarity index 96% rename from src/main/java/com/example/sbcamel/DatabaseConfig.java rename to src/main/java/com/example/sbcamel/init/DatabaseConfig.java index 07f6b9e..9e289f7 100644 --- a/src/main/java/com/example/sbcamel/DatabaseConfig.java +++ b/src/main/java/com/example/sbcamel/init/DatabaseConfig.java @@ -1,4 +1,4 @@ -package com.example.sbcamel; +package com.example.sbcamel.init; import java.io.IOException; import java.util.Objects; diff --git a/src/main/java/com/example/sbcamel/SecurityConfig.java b/src/main/java/com/example/sbcamel/init/SecurityConfig.java similarity index 90% rename from src/main/java/com/example/sbcamel/SecurityConfig.java rename to src/main/java/com/example/sbcamel/init/SecurityConfig.java index 5607fa2..e3493f2 100644 --- a/src/main/java/com/example/sbcamel/SecurityConfig.java +++ b/src/main/java/com/example/sbcamel/init/SecurityConfig.java @@ -1,4 +1,4 @@ -package com.example.sbcamel; +package com.example.sbcamel.init; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Bean; @@ -13,8 +13,6 @@ import org.springframework.security.ldap.userdetails.DefaultLdapAuthoritiesPopul import org.springframework.security.ldap.userdetails.LdapAuthoritiesPopulator; import org.springframework.security.web.SecurityFilterChain; -import com.fasterxml.jackson.jakarta.rs.json.JacksonJsonProvider; - @Configuration public class SecurityConfig { @@ -57,10 +55,5 @@ public class SecurityConfig { factory.setUserSearchFilter(userSearchFilter); factory.setLdapAuthoritiesPopulator(authorities); return factory.createAuthenticationManager(); - } - - @Bean - public JacksonJsonProvider jaxrsProvider() { - return new JacksonJsonProvider(); - } + } } \ No newline at end of file diff --git a/src/main/java/com/example/sbcamel/mapper/SessionMapper.java b/src/main/java/com/example/sbcamel/mapper/SessionMapper.java new file mode 100644 index 0000000..53806e5 --- /dev/null +++ b/src/main/java/com/example/sbcamel/mapper/SessionMapper.java @@ -0,0 +1,34 @@ +package com.example.sbcamel.mapper; + +import java.util.Collection; +import java.util.UUID; + +import org.apache.ibatis.annotations.Insert; +import org.apache.ibatis.annotations.Result; +import org.apache.ibatis.annotations.Results; +import org.apache.ibatis.annotations.Select; +import org.apache.ibatis.type.JdbcType; + +import com.example.sbcamel.service.Session; +import com.example.sbcamel.service.UuidTypeHandler; + +public interface SessionMapper { + + @Insert({ "" }) + Session updateSession(Session session); + + @Results({ @Result(property = "sessionId", column = "sessionId", javaType=UUID.class, jdbcType=JdbcType.OTHER, typeHandler=UuidTypeHandler.class), + @Result(property = "username", column = "username"), @Result(property = "password", column = "password") }) + @Select({ "" }) + Session findSession(UUID sessionId); + + @Results({ @Result(property = "sessionId", column = "sessionId", javaType=UUID.class, jdbcType=JdbcType.OTHER, typeHandler=UuidTypeHandler.class), + @Result(property = "username", column = "username"), @Result(property = "password", column = "password") }) + @Select({ "" }) + Collection findSessions(); +} diff --git a/src/main/java/com/example/sbcamel/mapper/UserMapper.java b/src/main/java/com/example/sbcamel/mapper/UserMapper.java deleted file mode 100644 index 3f66dd4..0000000 --- a/src/main/java/com/example/sbcamel/mapper/UserMapper.java +++ /dev/null @@ -1,24 +0,0 @@ -package com.example.sbcamel.mapper; - -import java.util.Collection; - -import org.apache.ibatis.annotations.Insert; -import org.apache.ibatis.annotations.Result; -import org.apache.ibatis.annotations.Results; -import org.apache.ibatis.annotations.Select; - -import com.example.sbcamel.User; - -public interface UserMapper { - - @Insert({ "" }) - User updateUser(User user); - - @Results({ @Result(property = "id", column = "id"), @Result(property = "name", column = "name") }) - @Select({ "" }) - User findUser(Integer id); - - @Results({ @Result(property = "id", column = "id"), @Result(property = "name", column = "name") }) - @Select({ "" }) - Collection findUsers(); -} diff --git a/src/main/java/com/example/sbcamel/processor/LoginProcessor.java b/src/main/java/com/example/sbcamel/processor/LoginProcessor.java new file mode 100644 index 0000000..3a39ec3 --- /dev/null +++ b/src/main/java/com/example/sbcamel/processor/LoginProcessor.java @@ -0,0 +1,17 @@ +package com.example.sbcamel.processor; + +import org.apache.camel.Exchange; +import org.apache.camel.Processor; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class LoginProcessor implements Processor { + + private static final Logger logger = LoggerFactory.getLogger(LoginProcessor.class); + + @Override + public void process(Exchange exchange) throws Exception { + logger.info("response body: {}", exchange.getMessage().getBody()); + } + +} diff --git a/src/main/java/com/example/sbcamel/service/Session.java b/src/main/java/com/example/sbcamel/service/Session.java new file mode 100644 index 0000000..5ec68b6 --- /dev/null +++ b/src/main/java/com/example/sbcamel/service/Session.java @@ -0,0 +1,66 @@ +package com.example.sbcamel.service; + +import java.io.Serializable; +import java.util.UUID; + +import org.apache.commons.lang3.builder.ReflectionToStringBuilder; + +import jakarta.validation.constraints.NotNull; +import jakarta.validation.constraints.Size; + +/** + * User entity + * + */ +@SuppressWarnings("serial") +public class Session implements Serializable { + + private UUID sessionId; + + @NotNull + @Size(min = 3, max = 40) + private String username; + + @NotNull + @Size(min = 3, max = 40) + private String password; + + public Session() { + } + + public Session(UUID sessionId, @NotNull @Size(min = 3, max = 40) String username, + @NotNull @Size(min = 3, max = 40) String password) { + this.sessionId = sessionId; + this.username = username; + this.password = password; + } + + public UUID getSessionId() { + return sessionId; + } + + public void setSessionId(UUID sessionId) { + this.sessionId = sessionId; + } + + public String getUsername() { + return username; + } + + public void setUsername(String username) { + this.username = username; + } + + public String getPassword() { + return password; + } + + public void setPassword(String password) { + this.password = password; + } + + @Override + public String toString() { + return ReflectionToStringBuilder.toString(this); + } +} \ No newline at end of file diff --git a/src/main/java/com/example/sbcamel/service/SessionService.java b/src/main/java/com/example/sbcamel/service/SessionService.java new file mode 100644 index 0000000..700140e --- /dev/null +++ b/src/main/java/com/example/sbcamel/service/SessionService.java @@ -0,0 +1,39 @@ +package com.example.sbcamel.service; + +import java.util.Collection; +import java.util.UUID; + +import jakarta.validation.Valid; +import jakarta.ws.rs.Consumes; +import jakarta.ws.rs.GET; +import jakarta.ws.rs.POST; +import jakarta.ws.rs.Path; +import jakarta.ws.rs.PathParam; +import jakarta.ws.rs.Produces; +import jakarta.ws.rs.core.MediaType; + +/** + * Service interface for managing sessions. + */ +public interface SessionService { + + @POST + @Path("/session") + @Consumes(MediaType.APPLICATION_JSON) + Session updateSession(@Valid Session session); + + @GET + @Path("/session/{sessionId}") + @Produces(MediaType.APPLICATION_JSON) + Session findSession(@PathParam("sessionId") UUID sessionId); + + @GET + @Path("/session") + @Produces(MediaType.APPLICATION_JSON) + Collection findSessions(); + + @POST + @Path("/login/{sessionId}") + @Produces(MediaType.APPLICATION_JSON) + Session login(@PathParam("sessionId") UUID sessionId); +} \ No newline at end of file diff --git a/src/main/java/com/example/sbcamel/service/UuidTypeHandler.java b/src/main/java/com/example/sbcamel/service/UuidTypeHandler.java new file mode 100644 index 0000000..45b87d1 --- /dev/null +++ b/src/main/java/com/example/sbcamel/service/UuidTypeHandler.java @@ -0,0 +1,33 @@ +package com.example.sbcamel.service; + +import java.sql.CallableStatement; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.UUID; + +import org.apache.ibatis.type.BaseTypeHandler; +import org.apache.ibatis.type.JdbcType; + +public class UuidTypeHandler extends BaseTypeHandler { + @Override + public void setNonNullParameter(PreparedStatement ps, int i, UUID parameter, JdbcType jdbcType) + throws SQLException { + ps.setObject(i, parameter); + } + + @Override + public UUID getNullableResult(ResultSet rs, String columnName) throws SQLException { + return rs.getObject(columnName, UUID.class); + } + + @Override + public UUID getNullableResult(ResultSet rs, int columnIndex) throws SQLException { + return rs.getObject(columnIndex, UUID.class); + } + + @Override + public UUID getNullableResult(CallableStatement cs, int columnIndex) throws SQLException { + return cs.getObject(columnIndex, UUID.class); + } +} \ No newline at end of file