<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:blogger='http://schemas.google.com/blogger/2008' xmlns:georss='http://www.georss.org/georss' xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-8219113377173546175</id><updated>2026-08-20T05:48:31.908+01:00</updated><category term="java"/><category term="Computer/Technology Tips"/><category term="Android"/><category term="Numerical Methods C/C++ Code"/><category term="Java Interview QA"/><category term="Database and SQL"/><category term="Image Processing"/><category term="spring-framework"/><category term="Data Structure C++"/><category term="OpenCV-JavaCV"/><category term="Project Configuration IDE"/><category term="jquery"/><category term="jquery basic tutorial series"/><category term="MongoDB"/><category term="Audio Processing"/><category term="Campus Assignments"/><category term="Java-EE"/><category term="My Views"/><category term="SQL Reference Guide"/><category term="hidden markov model"/><category term="Maven"/><category term="spring-mvc-framework"/><category term="Groovy Grails"/><category term="Hibernate"/><category term="XML"/><category term="Dependency Injection"/><category term="Video"/><category term="computer project ideas"/><category term="git"/><category term="AWS"/><category term="quotes"/><category term="HTML/Web"/><category term="Matlab"/><category term="ibatis"/><category term="linux"/><category term="movie"/><category term="pdf"/><category term="ubuntu"/><title type='text'>GT&#39;s Blog</title><subtitle type='html'>Code snippets, technical articles, tips on computing and programming...</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://blog.gtiwari333.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8219113377173546175/posts/default?redirect=false'/><link rel='alternate' type='text/html' href='http://blog.gtiwari333.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><link rel='next' type='application/atom+xml' href='http://www.blogger.com/feeds/8219113377173546175/posts/default?start-index=26&amp;max-results=25&amp;redirect=false'/><author><name>GT</name><uri>http://www.blogger.com/profile/16923656636145211711</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>306</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-8219113377173546175.post-1810049245710937846</id><published>2026-08-02T21:57:29.545+01:00</published><updated>2026-08-02T21:57:29.545+01:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="java"/><title type='text'>Manually Analyze JFR Files to Find Optimization Targets</title><content type='html'>&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p dir=&quot;auto&quot;&gt;&lt;strong&gt;A systematic guide to reading Java Flight Recorder
 dumps and turning the data into faster startup, lower memory pressure, 
and higher throughput.&lt;/strong&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;p dir=&quot;auto&quot;&gt;When your Java application takes too long to start or 
burns too much CPU under load, intuition is a poor compass. Guessing at 
bottlenecks — &quot;maybe it&#39;s the database queries,&quot; &quot;maybe we have too many
 objects to wire up&quot; — leads to wasted effort. You need data.&lt;/p&gt;
&lt;p dir=&quot;auto&quot;&gt;A &lt;strong&gt;profiler&lt;/strong&gt; is a tool that records what a 
program is actually doing while it runs. Unlike logs, which tell you 
only what your application chose to report, a profiler observes the JVM 
itself — where CPU time goes, what objects get allocated, which methods 
get compiled, where threads wait, and how memory changes over time. Java
 Flight Recorder (JFR) is the JVM&#39;s built-in profiler, designed to run 
with very low overhead (typically well under 1–2% with default settings,
 and still modest with the fuller &lt;code&gt;profile&lt;/code&gt; configuration). 
It captures an extraordinary breadth of telemetry: CPU sampling, 
allocation profiling, GC behavior, lock contention, I/O activity, class 
loading, JIT compilation — all from a single recording file. A single &lt;code&gt;.jfr&lt;/code&gt; file is a rich forensic trace of what your JVM did during the recording window.&lt;/p&gt;
&lt;p dir=&quot;auto&quot;&gt;But a JFR file is not a report. It&#39;s a dense, binary event
 log containing over a hundred built-in event types. The skill is 
knowing &lt;strong&gt;which events to extract, how to interpret them, and what optimization they point to&lt;/strong&gt;.&lt;/p&gt;
&lt;p dir=&quot;auto&quot;&gt;This post walks through a manual, systematic methodology 
for analyzing a JFR recording. You can follow along using the JDK&#39;s 
built-in &lt;code&gt;jfr&lt;/code&gt; CLI, JDK Mission Control (JMC), or an IDE profiler such as IntelliJ&#39;s. The goal is not just to &lt;em&gt;run&lt;/em&gt; a tool, but to understand &lt;em&gt;what you&#39;re looking at&lt;/em&gt; and &lt;em&gt;what to do about it&lt;/em&gt;.&lt;/p&gt;
&lt;hr /&gt;
&lt;div class=&quot;markdown-heading&quot; dir=&quot;auto&quot;&gt;&lt;h2 class=&quot;heading-element&quot; dir=&quot;auto&quot; tabindex=&quot;-1&quot;&gt;1. Capturing a Useful JFR Recording&lt;/h2&gt;&lt;a aria-label=&quot;Permalink: 1. Capturing a Useful JFR Recording&quot; class=&quot;anchor&quot; href=&quot;https://github.com/gtiwari333/mono-micro-service/blob/main/docs/jfr-blog1.md#1-capturing-a-useful-jfr-recording&quot; id=&quot;user-content-1-capturing-a-useful-jfr-recording&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; class=&quot;octicon octicon-link&quot; data-component=&quot;Octicon&quot; height=&quot;16&quot; viewbox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p dir=&quot;auto&quot;&gt;Before you can analyze anything, you need a good 
recording. The default JFR configuration captures a minimal set of 
events. For startup or performance analysis, use the &lt;code&gt;profile&lt;/code&gt; setting, which adds allocation sampling and other detail on top of the default:&lt;/p&gt;
&lt;div class=&quot;highlight highlight-source-shell notranslate position-relative overflow-auto&quot; dir=&quot;auto&quot;&gt;&lt;pre&gt;&lt;span class=&quot;pl-c&quot;&gt;&lt;span class=&quot;pl-c&quot;&gt;#&lt;/span&gt; Attach to a running JVM&lt;/span&gt;
jcmd &lt;span class=&quot;pl-k&quot;&gt;&amp;lt;&lt;/span&gt;PID&lt;span class=&quot;pl-k&quot;&gt;&amp;gt;&lt;/span&gt; JFR.start settings=profile name=startup-analysis

&lt;span class=&quot;pl-c&quot;&gt;&lt;span class=&quot;pl-c&quot;&gt;#&lt;/span&gt; Wait for the event you care about (startup, request burst, etc.)&lt;/span&gt;
&lt;span class=&quot;pl-c&quot;&gt;&lt;span class=&quot;pl-c&quot;&gt;#&lt;/span&gt; then stop and dump to disk:&lt;/span&gt;
jcmd &lt;span class=&quot;pl-k&quot;&gt;&amp;lt;&lt;/span&gt;PID&lt;span class=&quot;pl-k&quot;&gt;&amp;gt;&lt;/span&gt; JFR.stop name=startup-analysis filename=recording.jfr&lt;/pre&gt;&lt;div class=&quot;zeroclipboard-container&quot;&gt;
    
      
    

      
    
  &lt;/div&gt;&lt;/div&gt;
&lt;p dir=&quot;auto&quot;&gt;For startup analysis specifically, pass JFR flags directly to the JVM so recording begins at launch:&lt;/p&gt;
&lt;div class=&quot;highlight highlight-source-shell notranslate position-relative overflow-auto&quot; dir=&quot;auto&quot;&gt;&lt;pre&gt;java -XX:StartFlightRecording=settings=profile,filename=startup.jfr \
     -jar my-application.jar&lt;/pre&gt;&lt;div class=&quot;zeroclipboard-container&quot;&gt;
    
      
    

      
    
  &lt;/div&gt;&lt;/div&gt;
&lt;p dir=&quot;auto&quot;&gt;&lt;strong&gt;Key principle&lt;/strong&gt;: Record exactly the window 
you care about. A 30-second recording during startup is far more 
actionable than a 5-minute recording that mixes startup, steady-state, 
and idle periods. The metrics become averages over too many phases, and 
the signal washes out.&lt;/p&gt;
&lt;p dir=&quot;auto&quot;&gt;&lt;strong&gt;A note on warmup&lt;/strong&gt;: during startup the JVM 
is doing several expensive things at once — loading and linking classes,
 compiling hot methods, allocating the objects that make up your object 
graph, and initializing caches and connection pools. All of that 
activity is concentrated into a short window, which is exactly why 
startup recordings look so different from steady-state recordings: 
heavier class-loading and compilation cost, a burst of allocation, and 
comparatively little of the request-handling activity you&#39;d see later. 
Don&#39;t be surprised if a startup profile and a steady-state profile of 
the same application barely resemble each other — they&#39;re capturing 
different phases of the JVM&#39;s life, and both are &quot;correct.&quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div class=&quot;markdown-heading&quot; dir=&quot;auto&quot;&gt;&lt;h2 class=&quot;heading-element&quot; dir=&quot;auto&quot; tabindex=&quot;-1&quot;&gt;2. The Analysis Framework: 12 Dimensions&lt;/h2&gt;&lt;a aria-label=&quot;Permalink: 2. The Analysis Framework: 12 Dimensions&quot; class=&quot;anchor&quot; href=&quot;https://github.com/gtiwari333/mono-micro-service/blob/main/docs/jfr-blog1.md#2-the-analysis-framework-12-dimensions&quot; id=&quot;user-content-2-the-analysis-framework-12-dimensions&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; class=&quot;octicon octicon-link&quot; data-component=&quot;Octicon&quot; height=&quot;16&quot; viewbox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p dir=&quot;auto&quot;&gt;A JFR recording spans several distinct dimensions of JVM 
behavior. Each answers a different question about your application. 
Rather than jumping between them haphazardly, work through them in this 
order — each section&#39;s findings inform the next:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;#&lt;/th&gt;
&lt;th&gt;Dimension&lt;/th&gt;
&lt;th&gt;Key Question&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;CPU Hotspots&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;em&gt;Where is CPU time actually being spent?&lt;/em&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Memory Allocation&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;em&gt;What objects are being created, and from where?&lt;/em&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;GC / Heap Timeline&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;em&gt;How is the heap growing, and how much time is spent collecting?&lt;/em&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;GC Pause Times&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;em&gt;How long are stop-the-world pauses, and which GC phases cause them?&lt;/em&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Class Loading&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;em&gt;How many classes are loaded, and is that excessive?&lt;/em&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;6&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Thread Creation&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;em&gt;How many threads are spawned, and by which subsystems?&lt;/em&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;7&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Lock Contention&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;em&gt;Where are threads blocking each other?&lt;/em&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;8&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;JIT Compilation&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;em&gt;How much CPU goes into compiling bytecode, and which methods cost the most?&lt;/em&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;9&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Socket / File I/O&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;em&gt;How much I/O is happening, to what, and how long does it wait?&lt;/em&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;10&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;CPU Load Timeline&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;em&gt;Is the JVM CPU-bound, I/O-bound, or uncontested?&lt;/em&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;11&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Thread Idle / Sleep Time&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;em&gt;Which threads are idle or waiting, and for how long?&lt;/em&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;12&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Before/After Comparison&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;em&gt;Did your optimization actually help?&lt;/em&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p dir=&quot;auto&quot;&gt;Let&#39;s walk through each dimension with concrete examples 
of what to extract, what patterns to look for, and what optimizations 
each pattern suggests.&lt;/p&gt;
&lt;hr /&gt;
&lt;div class=&quot;markdown-heading&quot; dir=&quot;auto&quot;&gt;&lt;h2 class=&quot;heading-element&quot; dir=&quot;auto&quot; tabindex=&quot;-1&quot;&gt;3. Dimension 1: CPU Execution Hotspots&lt;/h2&gt;&lt;a aria-label=&quot;Permalink: 3. Dimension 1: CPU Execution Hotspots&quot; class=&quot;anchor&quot; href=&quot;https://github.com/gtiwari333/mono-micro-service/blob/main/docs/jfr-blog1.md#3-dimension-1-cpu-execution-hotspots&quot; id=&quot;user-content-3-dimension-1-cpu-execution-hotspots&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; class=&quot;octicon octicon-link&quot; data-component=&quot;Octicon&quot; height=&quot;16&quot; viewbox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p dir=&quot;auto&quot;&gt;JFR does &lt;strong&gt;sampling profiling&lt;/strong&gt;, not 
instrumentation. Instead of measuring every single method call — which 
would slow the application down considerably and change the very 
behavior you&#39;re trying to observe — the JVM periodically interrupts each
 running thread and records what it&#39;s doing. If a method shows up in a 
large share of the samples, it probably consumed a significant amount of
 CPU time; a method that never shows up may still have run, just not 
enough (or not at the right moments) to be caught.&lt;/p&gt;
&lt;p dir=&quot;auto&quot;&gt;&lt;strong&gt;Data source&lt;/strong&gt;: &lt;code&gt;jdk.ExecutionSample&lt;/code&gt;
 events. These are periodic thread samples that capture the full stack 
trace of a running thread. The sampling interval depends on your 
recording configuration and JDK version rather than a single fixed 
number — check the settings file (e.g., &lt;code&gt;profile.jfc&lt;/code&gt;) or the
 recording metadata if you need the exact value for your run. Each 
sample counts as one &quot;vote&quot; — a method appearing in 500 samples was 
on-CPU for roughly 500 sampling periods, so treat the resulting time 
estimate as approximate, not exact.&lt;/p&gt;
&lt;p dir=&quot;auto&quot;&gt;&lt;strong&gt;A limitation worth knowing&lt;/strong&gt;: sampling 
profilers can&#39;t reliably measure very short-lived methods, because a 
method can start and finish entirely between two samples and never get 
caught. A method with only a handful of samples in a large recording 
isn&#39;t necessarily unimportant — but it also isn&#39;t necessarily important.
 Don&#39;t over-interpret single-digit sample counts either way; focus your 
attention on methods with enough samples that the pattern is 
statistically meaningful.&lt;/p&gt;
&lt;div class=&quot;markdown-heading&quot; dir=&quot;auto&quot;&gt;&lt;h3 class=&quot;heading-element&quot; dir=&quot;auto&quot; tabindex=&quot;-1&quot;&gt;What to Extract&lt;/h3&gt;&lt;a aria-label=&quot;Permalink: What to Extract&quot; class=&quot;anchor&quot; href=&quot;https://github.com/gtiwari333/mono-micro-service/blob/main/docs/jfr-blog1.md#what-to-extract&quot; id=&quot;user-content-what-to-extract&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; class=&quot;octicon octicon-link&quot; data-component=&quot;Octicon&quot; height=&quot;16&quot; viewbox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p dir=&quot;auto&quot;&gt;Using the JDK&#39;s &lt;code&gt;jfr&lt;/code&gt; CLI:&lt;/p&gt;
&lt;div class=&quot;highlight highlight-source-shell notranslate position-relative overflow-auto&quot; dir=&quot;auto&quot;&gt;&lt;pre&gt;&lt;span class=&quot;pl-c&quot;&gt;&lt;span class=&quot;pl-c&quot;&gt;#&lt;/span&gt; Text mode gives full stack traces in a readable format&lt;/span&gt;
jfr print --events jdk.ExecutionSample recording.jfr&lt;/pre&gt;&lt;div class=&quot;zeroclipboard-container&quot;&gt;
    
      
    

      
    
  &lt;/div&gt;&lt;/div&gt;
&lt;p dir=&quot;auto&quot;&gt;Each block looks like this:&lt;/p&gt;
&lt;div class=&quot;snippet-clipboard-content notranslate position-relative overflow-auto&quot;&gt;&lt;pre class=&quot;notranslate&quot;&gt;&lt;code&gt;jdk.ExecutionSample {
  sampledThread = &quot;main&quot; (javaThreadId = 1)
  state = &quot;STATE_RUNNABLE&quot;
  stackTrace = [
    java.lang.ClassLoader.defineClass1(ClassLoader.java:0)     ← LEAF (hottest)
    java.lang.ClassLoader.defineClass(ClassLoader.java:539)
    java.security.SecureClassLoader.defineClass(...)
    java.net.URLClassLoader.defineClass(...)
    java.net.URLClassLoader$1.run(...)
    ...
  ]
}
&lt;/code&gt;&lt;/pre&gt;&lt;div class=&quot;zeroclipboard-container&quot;&gt;
    
      
    

      
    
  &lt;/div&gt;&lt;/div&gt;
&lt;p dir=&quot;auto&quot;&gt;A quick glossary, since the rest of this post leans on this terminology constantly. A &lt;strong&gt;stack trace&lt;/strong&gt; is the chain of method calls active at a single point in time — each individual call in that chain is a &lt;strong&gt;stack frame&lt;/strong&gt;. Using a simplified example:&lt;/p&gt;
&lt;div class=&quot;snippet-clipboard-content notranslate position-relative overflow-auto&quot;&gt;&lt;pre class=&quot;notranslate&quot;&gt;&lt;code&gt;main()
 └── loadUsers()
      └── parseJson()
           └── StringBuilder.append()
&lt;/code&gt;&lt;/pre&gt;&lt;div class=&quot;zeroclipboard-container&quot;&gt;
    
      
    

      
    
  &lt;/div&gt;&lt;/div&gt;
&lt;p dir=&quot;auto&quot;&gt;The &lt;strong&gt;root frame&lt;/strong&gt; is the entry point (&lt;code&gt;main()&lt;/code&gt; here). The &lt;strong&gt;leaf frame&lt;/strong&gt; is the innermost, most-recently-called method (&lt;code&gt;StringBuilder.append()&lt;/code&gt; here) — it&#39;s the one that was actually executing, on the CPU, at the instant the sample was taken.&lt;/p&gt;
&lt;p dir=&quot;auto&quot;&gt;The &lt;strong&gt;leaf frame&lt;/strong&gt; (index 0 in the JFR output) tells you &lt;em&gt;what&lt;/em&gt; is burning CPU. The &lt;strong&gt;full stack&lt;/strong&gt; tells you &lt;em&gt;why&lt;/em&gt;
 — the call chain that led there. Both matter: the same leaf method can 
appear under very different stacks, and grouping by leaf-only can hide 
the fact that two unrelated code paths are converging on the same 
expensive call.&lt;/p&gt;
&lt;div class=&quot;markdown-heading&quot; dir=&quot;auto&quot;&gt;&lt;h3 class=&quot;heading-element&quot; dir=&quot;auto&quot; tabindex=&quot;-1&quot;&gt;Patterns and What They Mean&lt;/h3&gt;&lt;a aria-label=&quot;Permalink: Patterns and What They Mean&quot; class=&quot;anchor&quot; href=&quot;https://github.com/gtiwari333/mono-micro-service/blob/main/docs/jfr-blog1.md#patterns-and-what-they-mean&quot; id=&quot;user-content-patterns-and-what-they-mean&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; class=&quot;octicon octicon-link&quot; data-component=&quot;Octicon&quot; height=&quot;16&quot; viewbox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p dir=&quot;auto&quot;&gt;&lt;strong&gt;Pattern A: &lt;code&gt;ClassLoader.defineClass1&lt;/code&gt; dominates the leaf samples&lt;/strong&gt;&lt;/p&gt;
&lt;p dir=&quot;auto&quot;&gt;This means the JVM is spending a large share of its CPU 
defining classes — reading bytes from JAR files, parsing the classfile 
format, verifying bytecode, and linking into the runtime. On a cold 
startup of any JVM application with a non-trivial classpath, this can be
 a substantial fraction of samples, though the exact share varies widely
 by application size and JAR count.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p dir=&quot;auto&quot;&gt;&lt;strong&gt;Optimization&lt;/strong&gt;: Use &lt;strong&gt;Class Data Sharing (CDS)&lt;/strong&gt;.
 CDS creates a shared archive containing preprocessed class metadata 
from a prior run. On later JVM starts, many of those classes can be 
mapped directly from the archive instead of being repeatedly read from 
JARs, parsed, verified, and linked from scratch — the expensive work 
happens once, when the archive is built, rather than on every single 
startup:&lt;/p&gt;
&lt;div class=&quot;highlight highlight-source-shell notranslate position-relative overflow-auto&quot; dir=&quot;auto&quot;&gt;&lt;pre&gt;java -XX:ArchiveClassesAtExit=app-cds.jsa -jar my-app.jar
java -XX:SharedArchiveFile=app-cds.jsa -jar my-app.jar&lt;/pre&gt;&lt;div class=&quot;zeroclipboard-container&quot;&gt;
    
      
    

      
    
  &lt;/div&gt;&lt;/div&gt;
&lt;p dir=&quot;auto&quot;&gt;This typically produces a meaningful reduction in 
class-loading CPU time. Treat any specific percentage as a rough 
expectation, not a guarantee — measure before/after on your own app (see
 Dimension 12).&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p dir=&quot;auto&quot;&gt;&lt;strong&gt;Pattern B: &lt;code&gt;Inflater.inflateBytes&lt;/code&gt; high in the stacks&lt;/strong&gt;&lt;/p&gt;
&lt;p dir=&quot;auto&quot;&gt;This is JAR decompression overhead. Every JAR entry is 
typically compressed; reading a class means decompressing it first. The 
more JARs on your classpath, the more inflation CPU you pay.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p dir=&quot;auto&quot;&gt;&lt;strong&gt;Optimization&lt;/strong&gt;: CDS helps here too — the 
shared archive stores classes in an already-processed form so they don&#39;t
 need to be decompressed and parsed again on every startup. Also 
consider trimming unused JARs from your classpath.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p dir=&quot;auto&quot;&gt;&lt;strong&gt;Pattern C: Classpath/annotation-scanning code appears prominently&lt;/strong&gt;&lt;/p&gt;
&lt;p dir=&quot;auto&quot;&gt;If your application uses a dependency-injection or 
component-scanning framework (Spring, Micronaut, Quarkus/Jakarta CDI, 
Guice with classpath scanning, etc.), startup often involves walking the
 classpath looking for annotated types, reading &lt;code&gt;.class&lt;/code&gt; 
files, and building object-graph or bean metadata from what it finds. In
 stack traces this typically shows up as framework-internal 
classpath-scanner or annotation-reader classes.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p dir=&quot;auto&quot;&gt;&lt;strong&gt;Optimization&lt;/strong&gt;: Most DI frameworks offer a 
way to avoid runtime scanning — build-time indexing (e.g., Spring&#39;s 
context indexer generates a component index at compile time), 
ahead-of-time processing (Spring AOT, Micronaut and Quarkus both compute
 much of this at build time by design), or simply scoping the scan to a 
narrower set of packages instead of the whole classpath. Check your 
framework&#39;s documentation for its specific mechanism.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p dir=&quot;auto&quot;&gt;&lt;strong&gt;Pattern D: &lt;code&gt;Constructor.newInstance&lt;/code&gt; or &lt;code&gt;Method.invoke&lt;/code&gt; appear heavily&lt;/strong&gt;&lt;/p&gt;
&lt;p dir=&quot;auto&quot;&gt;This is reflection-driven instantiation. DI containers, 
ORMs, and serialization libraries (Spring, Hibernate/JPA, Guice, 
Jackson, and others) commonly use reflection for object creation, proxy 
generation, and field/property access.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p dir=&quot;auto&quot;&gt;&lt;strong&gt;Optimization&lt;/strong&gt;: Many frameworks offer 
reflection-reduced or reflection-free code paths for common cases (e.g.,
 Spring AOT, Micronaut&#39;s compile-time DI, Quarkus&#39;s build-time 
processing). A more drastic option is &lt;strong&gt;GraalVM Native Image&lt;/strong&gt;,
 which compiles your application ahead-of-time into a standalone native 
executable — this eliminates JIT compilation and most runtime class 
loading entirely, since nearly all of that work happens at build time 
instead of at every startup. The trade-off: build times are much longer,
 you generally give up the JIT&#39;s runtime, profile-guided optimizations 
(so peak steady-state throughput can be lower than a warmed-up JVM), and
 anything relying on dynamic behavior — reflection, dynamic proxies, 
resources loaded by name, JNI — needs to be explicitly declared in 
build-time configuration, since native image can&#39;t discover it at 
runtime the way the JVM can.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p dir=&quot;auto&quot;&gt;&lt;strong&gt;Pattern E: Deep framework call chains with the same root pattern across many leaf methods&lt;/strong&gt;&lt;/p&gt;
&lt;p dir=&quot;auto&quot;&gt;Look at the &lt;strong&gt;full stack signatures&lt;/strong&gt;, not just the leaf. If you see the same multi-frame prefix (e.g., &lt;code&gt;DispatcherServlet → Interceptor → Controller → Service → Repository&lt;/code&gt;)
 with different leaves, the framework dispatch itself is a non-trivial, 
if normal, cost. Worth quantifying, rarely worth fighting.&lt;/p&gt;
&lt;div class=&quot;markdown-heading&quot; dir=&quot;auto&quot;&gt;&lt;h3 class=&quot;heading-element&quot; dir=&quot;auto&quot; tabindex=&quot;-1&quot;&gt;Thread Distribution&lt;/h3&gt;&lt;a aria-label=&quot;Permalink: Thread Distribution&quot; class=&quot;anchor&quot; href=&quot;https://github.com/gtiwari333/mono-micro-service/blob/main/docs/jfr-blog1.md#thread-distribution&quot; id=&quot;user-content-thread-distribution&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; class=&quot;octicon octicon-link&quot; data-component=&quot;Octicon&quot; height=&quot;16&quot; viewbox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p dir=&quot;auto&quot;&gt;Also check which threads accumulate samples:&lt;/p&gt;
&lt;div class=&quot;highlight highlight-source-shell notranslate position-relative overflow-auto&quot; dir=&quot;auto&quot;&gt;&lt;pre&gt;&lt;span class=&quot;pl-c&quot;&gt;&lt;span class=&quot;pl-c&quot;&gt;#&lt;/span&gt; Group samples by thread name&lt;/span&gt;
jfr print --events jdk.ExecutionSample recording.jfr &lt;span class=&quot;pl-k&quot;&gt;|&lt;/span&gt; \
  grep &lt;span class=&quot;pl-s&quot;&gt;&lt;span class=&quot;pl-pds&quot;&gt;&quot;&lt;/span&gt;sampledThread&lt;span class=&quot;pl-pds&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;pl-k&quot;&gt;|&lt;/span&gt; sort &lt;span class=&quot;pl-k&quot;&gt;|&lt;/span&gt; uniq -c &lt;span class=&quot;pl-k&quot;&gt;|&lt;/span&gt; sort -rn&lt;/pre&gt;&lt;div class=&quot;zeroclipboard-container&quot;&gt;
    
      
    

      
    
  &lt;/div&gt;&lt;/div&gt;
&lt;ul dir=&quot;auto&quot;&gt;&lt;li&gt;&lt;strong&gt;&lt;code&gt;main&lt;/code&gt; thread dominates&lt;/strong&gt; → Startup analysis: the main thread is doing the heavy lifting (object graph construction, class loading, initialization).&lt;/li&gt;&lt;li&gt;&lt;strong&gt;&lt;code&gt;http-nio-*&lt;/code&gt; (or equivalent) threads dominate&lt;/strong&gt; → Steady-state analysis: your request-handling threads are the bottleneck.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;&lt;code&gt;C2 CompilerThread*&lt;/code&gt; appears heavily&lt;/strong&gt; → JIT compilation is consuming significant CPU (see Dimension 8).&lt;/li&gt;&lt;/ul&gt;
&lt;div class=&quot;markdown-heading&quot; dir=&quot;auto&quot;&gt;&lt;h3 class=&quot;heading-element&quot; dir=&quot;auto&quot; tabindex=&quot;-1&quot;&gt;When NOT to Optimize&lt;/h3&gt;&lt;a aria-label=&quot;Permalink: When NOT to Optimize&quot; class=&quot;anchor&quot; href=&quot;https://github.com/gtiwari333/mono-micro-service/blob/main/docs/jfr-blog1.md#when-not-to-optimize&quot; id=&quot;user-content-when-not-to-optimize&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; class=&quot;octicon octicon-link&quot; data-component=&quot;Octicon&quot; height=&quot;16&quot; viewbox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p dir=&quot;auto&quot;&gt;Not every hot method deserves your attention. Before spending time on something you found in a CPU profile, ask:&lt;/p&gt;
&lt;ul dir=&quot;auto&quot;&gt;&lt;li&gt;&lt;strong&gt;Is it on a path that actually matters?&lt;/strong&gt; A method that&#39;s hot exclusively during a one-time startup sequence matters a lot less than one that&#39;s hot on every request.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Does it consume a meaningful share of samples?&lt;/strong&gt; A method with a handful of samples out of tens of thousands is noise, not signal (see the sampling-bias note above).&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Is it actually user-visible?&lt;/strong&gt; Shaving milliseconds off something nobody waits on doesn&#39;t move any metric that matters.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Is it unavoidable framework overhead?&lt;/strong&gt; Plenty of 
methods show up as &quot;hot&quot; simply because the framework you chose does 
real, necessary work on every call. Fighting that is often 
lower-leverage than fixing something in your own code, or accepting it 
as the cost of the framework.&lt;/li&gt;&lt;/ul&gt;
&lt;p dir=&quot;auto&quot;&gt;It&#39;s easy to spend an afternoon optimizing the 
third-hottest method in a profile only to discover it accounted for 2% 
of total time. Chase the few things that materially move the numbers you
 actually care about — not everything the profiler happens to surface.&lt;/p&gt;
&lt;hr /&gt;
&lt;div class=&quot;markdown-heading&quot; dir=&quot;auto&quot;&gt;&lt;h2 class=&quot;heading-element&quot; dir=&quot;auto&quot; tabindex=&quot;-1&quot;&gt;4. Dimension 2: Memory Allocation Hotspots&lt;/h2&gt;&lt;a aria-label=&quot;Permalink: 4. Dimension 2: Memory Allocation Hotspots&quot; class=&quot;anchor&quot; href=&quot;https://github.com/gtiwari333/mono-micro-service/blob/main/docs/jfr-blog1.md#4-dimension-2-memory-allocation-hotspots&quot; id=&quot;user-content-4-dimension-2-memory-allocation-hotspots&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; class=&quot;octicon octicon-link&quot; data-component=&quot;Octicon&quot; height=&quot;16&quot; viewbox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p dir=&quot;auto&quot;&gt;&lt;strong&gt;Data source&lt;/strong&gt;: &lt;code&gt;jdk.ObjectAllocationSample&lt;/code&gt; events (available from JDK 16 onward). The JVM samples object allocations, recording the type, an estimated size (&lt;code&gt;weight&lt;/code&gt;),
 and the allocation-site stack trace. This is a statistical profile of 
allocation throughput, not a heap dump — it doesn&#39;t tell you what&#39;s 
still alive, only what&#39;s being created.&lt;/p&gt;
&lt;div class=&quot;markdown-heading&quot; dir=&quot;auto&quot;&gt;&lt;h3 class=&quot;heading-element&quot; dir=&quot;auto&quot; tabindex=&quot;-1&quot;&gt;What to Extract&lt;/h3&gt;&lt;a aria-label=&quot;Permalink: What to Extract&quot; class=&quot;anchor&quot; href=&quot;https://github.com/gtiwari333/mono-micro-service/blob/main/docs/jfr-blog1.md#what-to-extract-1&quot; id=&quot;user-content-what-to-extract-1&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; class=&quot;octicon octicon-link&quot; data-component=&quot;Octicon&quot; height=&quot;16&quot; viewbox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div class=&quot;highlight highlight-source-shell notranslate position-relative overflow-auto&quot; dir=&quot;auto&quot;&gt;&lt;pre&gt;jfr print --events jdk.ObjectAllocationSample --json recording.jfr&lt;/pre&gt;&lt;div class=&quot;zeroclipboard-container&quot;&gt;
    
      
    

      
    
  &lt;/div&gt;&lt;/div&gt;
&lt;p dir=&quot;auto&quot;&gt;The JSON output includes &lt;code&gt;objectClass.name&lt;/code&gt; and &lt;code&gt;weight&lt;/code&gt; (an estimate of bytes allocated) for each sample, plus &lt;code&gt;stackTrace.frames&lt;/code&gt; showing the allocation site.&lt;/p&gt;
&lt;div class=&quot;markdown-heading&quot; dir=&quot;auto&quot;&gt;&lt;h3 class=&quot;heading-element&quot; dir=&quot;auto&quot; tabindex=&quot;-1&quot;&gt;Patterns and What They Mean&lt;/h3&gt;&lt;a aria-label=&quot;Permalink: Patterns and What They Mean&quot; class=&quot;anchor&quot; href=&quot;https://github.com/gtiwari333/mono-micro-service/blob/main/docs/jfr-blog1.md#patterns-and-what-they-mean-1&quot; id=&quot;user-content-patterns-and-what-they-mean-1&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; class=&quot;octicon octicon-link&quot; data-component=&quot;Octicon&quot; height=&quot;16&quot; viewbox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p dir=&quot;auto&quot;&gt;&lt;strong&gt;Pattern A: &lt;code&gt;byte[]&lt;/code&gt; is a large share of allocated bytes&lt;/strong&gt;&lt;/p&gt;
&lt;p dir=&quot;auto&quot;&gt;This is extremely common in JVM applications. Almost everything allocates &lt;code&gt;byte[]&lt;/code&gt;:
 reading class files from JARs, deserializing JSON/XML, reading files, 
building response buffers, processing request bodies. The question is 
not really &lt;em&gt;whether&lt;/em&gt; &lt;code&gt;byte[]&lt;/code&gt; shows up near the top, but &lt;em&gt;from where&lt;/em&gt;.&lt;/p&gt;
&lt;p dir=&quot;auto&quot;&gt;To find the allocation sites:&lt;/p&gt;
&lt;div class=&quot;highlight highlight-source-shell notranslate position-relative overflow-auto&quot; dir=&quot;auto&quot;&gt;&lt;pre&gt;&lt;span class=&quot;pl-c&quot;&gt;&lt;span class=&quot;pl-c&quot;&gt;#&lt;/span&gt; Filter allocation stacks to only byte[] allocations&lt;/span&gt;
jfr print --events jdk.ObjectAllocationSample --json recording.jfr &lt;span class=&quot;pl-k&quot;&gt;|&lt;/span&gt; \
  python3 -c &lt;span class=&quot;pl-s&quot;&gt;&lt;span class=&quot;pl-pds&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;pl-s&quot;&gt;import json, sys&lt;/span&gt;
&lt;span class=&quot;pl-s&quot;&gt;from collections import Counter&lt;/span&gt;
&lt;span class=&quot;pl-s&quot;&gt;data = json.load(sys.stdin)&lt;/span&gt;
&lt;span class=&quot;pl-s&quot;&gt;stacks = Counter()&lt;/span&gt;
&lt;span class=&quot;pl-s&quot;&gt;for e in data[&#39;recording&#39;][&#39;events&#39;]:&lt;/span&gt;
&lt;span class=&quot;pl-s&quot;&gt;    v = e[&#39;values&#39;]&lt;/span&gt;
&lt;span class=&quot;pl-s&quot;&gt;    cls = v.get(&#39;objectClass&#39;, {}).get(&#39;name&#39;, &#39;&#39;)&lt;/span&gt;
&lt;span class=&quot;pl-s&quot;&gt;    if &#39;byte&#39; in str(cls):&lt;/span&gt;
&lt;span class=&quot;pl-s&quot;&gt;        frames = v.get(&#39;stackTrace&#39;, {}).get(&#39;frames&#39;, [])&lt;/span&gt;
&lt;span class=&quot;pl-s&quot;&gt;        sig = &#39; -&amp;gt; &#39;.join(f[&#39;method&#39;][&#39;type&#39;][&#39;name&#39;] + &#39;.&#39; + f[&#39;method&#39;][&#39;name&#39;] for f in frames[:4])&lt;/span&gt;
&lt;span class=&quot;pl-s&quot;&gt;        stacks[sig] += v.get(&#39;weight&#39;, 0)&lt;/span&gt;
&lt;span class=&quot;pl-s&quot;&gt;for sig, w in stacks.most_common(20):&lt;/span&gt;
&lt;span class=&quot;pl-s&quot;&gt;    print(f&#39;{w:&amp;gt;12,d}  {sig}&#39;)&lt;/span&gt;
&lt;span class=&quot;pl-s&quot;&gt;&lt;span class=&quot;pl-pds&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;div class=&quot;zeroclipboard-container&quot;&gt;
    
      
    

      
    
  &lt;/div&gt;&lt;/div&gt;
&lt;p dir=&quot;auto&quot;&gt;Typical culprits and their fixes:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Allocation site&lt;/th&gt;
&lt;th&gt;Root cause&lt;/th&gt;
&lt;th&gt;Fix&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Resource.getBytes&lt;/code&gt; → &lt;code&gt;ClassLoader.defineClass&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Reading class bytes from JARs&lt;/td&gt;
&lt;td&gt;CDS (pre-loaded classes)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;StreamDecoder.readBytes&lt;/code&gt; → &lt;code&gt;SocketChannel.read&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Network I/O buffers&lt;/td&gt;
&lt;td&gt;Defer or cache HTTP calls&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;ByteArrayOutputStream.write&lt;/code&gt; → Jackson/JSON&lt;/td&gt;
&lt;td&gt;Serialization&lt;/td&gt;
&lt;td&gt;Streaming/incremental serialization where feasible&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ASM class-reading internals → &lt;code&gt;ClassReader.accept&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Bytecode parsing&lt;/td&gt;
&lt;td&gt;Build-time/AOT processing where your framework supports it (reduces runtime parsing)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p dir=&quot;auto&quot;&gt;&lt;strong&gt;Pattern B: Framework internals dominate — annotation metadata, reflective &lt;code&gt;Field&lt;/code&gt;/&lt;code&gt;Method&lt;/code&gt; wrappers, proxy-related objects&lt;/strong&gt;&lt;/p&gt;
&lt;p dir=&quot;auto&quot;&gt;These are your framework&#39;s internal representation of your
 object graph, annotations, and reflective access points, produced 
because the framework is doing runtime annotation processing and 
reflection to wire things up.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p dir=&quot;auto&quot;&gt;&lt;strong&gt;Optimization&lt;/strong&gt;: Where available, 
build-time/AOT processing (offered in some form by most major DI 
frameworks) pre-computes much of this metadata instead of building it at
 runtime. CDS complements this by archiving the resulting classes and 
reducing re-parsing on subsequent runs.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p dir=&quot;auto&quot;&gt;&lt;strong&gt;Pattern C: Domain objects (your entities/DTOs) dominate&lt;/strong&gt;&lt;/p&gt;
&lt;p dir=&quot;auto&quot;&gt;Your own data objects are the allocation leaders. This is application-level churn — consider:&lt;/p&gt;
&lt;ul dir=&quot;auto&quot;&gt;&lt;li&gt;Object pooling for frequently created/discarded objects (only where profiling justifies it — pooling has its own costs)&lt;/li&gt;&lt;li&gt;Reducing unnecessary DTO copies&lt;/li&gt;&lt;li&gt;Using primitive fields over boxed types where it matters&lt;/li&gt;&lt;li&gt;Caching instead of re-creating&lt;/li&gt;&lt;/ul&gt;
&lt;div class=&quot;markdown-heading&quot; dir=&quot;auto&quot;&gt;&lt;h3 class=&quot;heading-element&quot; dir=&quot;auto&quot; tabindex=&quot;-1&quot;&gt;The GC Connection&lt;/h3&gt;&lt;a aria-label=&quot;Permalink: The GC Connection&quot; class=&quot;anchor&quot; href=&quot;https://github.com/gtiwari333/mono-micro-service/blob/main/docs/jfr-blog1.md#the-gc-connection&quot; id=&quot;user-content-the-gc-connection&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; class=&quot;octicon octicon-link&quot; data-component=&quot;Octicon&quot; height=&quot;16&quot; viewbox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p dir=&quot;auto&quot;&gt;A quick clarification before going further, because it&#39;s a common source of confusion: &lt;strong&gt;allocation is not the same thing as memory usage.&lt;/strong&gt; Allocation rate measures how much memory you &lt;em&gt;create&lt;/em&gt; over time, regardless of how long any of it survives. Heap usage measures how much is &lt;em&gt;currently retained&lt;/em&gt;.
 You can allocate 100MB of short-lived objects, immediately discard 99MB
 of it, and end up with only 1MB actually sitting in the heap — the 
allocation rate was 100MB, but the retained footprint was 1MB. Both 
numbers matter, but they answer different questions: allocation rate 
tells you how hard the GC has to work; heap usage tells you how large 
your working set actually is.&lt;/p&gt;
&lt;p dir=&quot;auto&quot;&gt;That connects directly to &lt;strong&gt;GC pressure&lt;/strong&gt;: 
the amount of work the garbage collector has to do because the 
application keeps creating new objects. High allocation rates generally 
translate to high GC pressure — more frequent young-generation 
collections — even when the application&#39;s overall heap usage stays 
modest, because it&#39;s the &lt;em&gt;rate&lt;/em&gt; of churn that drives collection frequency, not the retained size.&lt;/p&gt;
&lt;p dir=&quot;auto&quot;&gt;Putting the two together: allocation rate is a primary 
driver of young-generation GC frequency, so the more you allocate, the 
more often minor collections run. Reducing total allocation generally 
reduces GC pause time and frequency, though the relationship isn&#39;t 
perfectly linear — &lt;strong&gt;look at allocation hotspots first; GC improvements often follow.&lt;/strong&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;div class=&quot;markdown-heading&quot; dir=&quot;auto&quot;&gt;&lt;h2 class=&quot;heading-element&quot; dir=&quot;auto&quot; tabindex=&quot;-1&quot;&gt;5. Dimensions 3 &amp;amp; 4: GC / Heap Timeline and Pause Times&lt;/h2&gt;&lt;a aria-label=&quot;Permalink: 5. Dimensions 3 &amp;amp; 4: GC / Heap Timeline and Pause Times&quot; class=&quot;anchor&quot; href=&quot;https://github.com/gtiwari333/mono-micro-service/blob/main/docs/jfr-blog1.md#5-dimensions-3--4-gc--heap-timeline-and-pause-times&quot; id=&quot;user-content-5-dimensions-3--4-gc--heap-timeline-and-pause-times&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; class=&quot;octicon octicon-link&quot; data-component=&quot;Octicon&quot; height=&quot;16&quot; viewbox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p dir=&quot;auto&quot;&gt;&lt;strong&gt;Data sources&lt;/strong&gt;:&lt;/p&gt;
&lt;ul dir=&quot;auto&quot;&gt;&lt;li&gt;&lt;code&gt;jdk.GCHeapSummary&lt;/code&gt; — periodic snapshots of heap usage&lt;/li&gt;&lt;li&gt;&lt;code&gt;jdk.GCPhasePause&lt;/code&gt; — stop-the-world pause events, with phase-level detail&lt;/li&gt;&lt;/ul&gt;
&lt;p dir=&quot;auto&quot;&gt;Not every GC-related event is enabled under every JFR 
configuration — the default recording is intentionally minimal. If these
 events come back empty, confirm you recorded with the &lt;code&gt;profile&lt;/code&gt; settings template (or explicitly enabled the events you need), not the default one.&lt;/p&gt;
&lt;div class=&quot;markdown-heading&quot; dir=&quot;auto&quot;&gt;&lt;h3 class=&quot;heading-element&quot; dir=&quot;auto&quot; tabindex=&quot;-1&quot;&gt;What to Extract&lt;/h3&gt;&lt;a aria-label=&quot;Permalink: What to Extract&quot; class=&quot;anchor&quot; href=&quot;https://github.com/gtiwari333/mono-micro-service/blob/main/docs/jfr-blog1.md#what-to-extract-2&quot; id=&quot;user-content-what-to-extract-2&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; class=&quot;octicon octicon-link&quot; data-component=&quot;Octicon&quot; height=&quot;16&quot; viewbox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div class=&quot;highlight highlight-source-shell notranslate position-relative overflow-auto&quot; dir=&quot;auto&quot;&gt;&lt;pre&gt;&lt;span class=&quot;pl-c&quot;&gt;&lt;span class=&quot;pl-c&quot;&gt;#&lt;/span&gt; Heap growth over time&lt;/span&gt;
jfr print --events jdk.GCHeapSummary --json recording.jfr

&lt;span class=&quot;pl-c&quot;&gt;&lt;span class=&quot;pl-c&quot;&gt;#&lt;/span&gt; GC pauses with phase breakdown&lt;/span&gt;
jfr print --events jdk.GCPhasePause --json recording.jfr&lt;/pre&gt;&lt;div class=&quot;zeroclipboard-container&quot;&gt;
    
      
    

      
    
  &lt;/div&gt;&lt;/div&gt;
&lt;div class=&quot;markdown-heading&quot; dir=&quot;auto&quot;&gt;&lt;h3 class=&quot;heading-element&quot; dir=&quot;auto&quot; tabindex=&quot;-1&quot;&gt;Reading the Heap Timeline&lt;/h3&gt;&lt;a aria-label=&quot;Permalink: Reading the Heap Timeline&quot; class=&quot;anchor&quot; href=&quot;https://github.com/gtiwari333/mono-micro-service/blob/main/docs/jfr-blog1.md#reading-the-heap-timeline&quot; id=&quot;user-content-reading-the-heap-timeline&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; class=&quot;octicon octicon-link&quot; data-component=&quot;Octicon&quot; height=&quot;16&quot; viewbox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p dir=&quot;auto&quot;&gt;Plot &lt;code&gt;heapUsed&lt;/code&gt; over &lt;code&gt;startTime&lt;/code&gt;. The shape tells a story:&lt;/p&gt;
&lt;ul dir=&quot;auto&quot;&gt;&lt;li&gt;&lt;strong&gt;Rapid ramp-up then flat&lt;/strong&gt; → Normal startup. The heap grows as beans, caches, and connection pools initialize, then stabilizes at steady-state.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Sawtooth pattern&lt;/strong&gt; → Healthy GC. The heap grows between collections, then drops.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Ever-increasing with no drops&lt;/strong&gt; → Possible memory leak or heap under sustained pressure. The heap grows because objects are outliving what you&#39;d expect.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;High peak usage relative to &lt;code&gt;-Xmx&lt;/code&gt;&lt;/strong&gt; → You&#39;re close to an &lt;code&gt;OutOfMemoryError&lt;/code&gt;. Either increase the heap or reduce allocation.&lt;/li&gt;&lt;/ul&gt;
&lt;div class=&quot;markdown-heading&quot; dir=&quot;auto&quot;&gt;&lt;h3 class=&quot;heading-element&quot; dir=&quot;auto&quot; tabindex=&quot;-1&quot;&gt;Reading GC Pause Statistics&lt;/h3&gt;&lt;a aria-label=&quot;Permalink: Reading GC Pause Statistics&quot; class=&quot;anchor&quot; href=&quot;https://github.com/gtiwari333/mono-micro-service/blob/main/docs/jfr-blog1.md#reading-gc-pause-statistics&quot; id=&quot;user-content-reading-gc-pause-statistics&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; class=&quot;octicon octicon-link&quot; data-component=&quot;Octicon&quot; height=&quot;16&quot; viewbox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p dir=&quot;auto&quot;&gt;Aggregate then break down by phase:&lt;/p&gt;
&lt;div class=&quot;snippet-clipboard-content notranslate position-relative overflow-auto&quot;&gt;&lt;pre class=&quot;notranslate&quot;&gt;&lt;code&gt;Pause count:      45
Total pause time: 1,230 ms
Avg pause:        27.3 ms
Max pause:        180 ms
Pause % of recording: 4.1%
&lt;/code&gt;&lt;/pre&gt;&lt;div class=&quot;zeroclipboard-container&quot;&gt;
    
      
    

      
    
  &lt;/div&gt;&lt;/div&gt;
&lt;p dir=&quot;auto&quot;&gt;&lt;strong&gt;Rough rules of thumb&lt;/strong&gt; (these vary by GC 
algorithm and workload, so treat as starting points, not thresholds): 
total pause time well under 5% of the recording, with only 
young-generation pauses, is generally healthy for most workloads. What&#39;s
 more concerning:&lt;/p&gt;
&lt;ul dir=&quot;auto&quot;&gt;&lt;li&gt;&lt;strong&gt;Total pause time climbing well past 5–10%&lt;/strong&gt; → GC is 
struggling. Check allocation hotspots first (Dimension 2); reducing 
allocation is usually the cheapest way to reduce GC time.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Individual pauses well above your latency budget&lt;/strong&gt; 
(e.g., over 100ms for a service targeting sub-200ms p95 latency) → At 
least one long stop-the-world event is impacting user-facing latency.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Any full/old-generation GC pause appears&lt;/strong&gt; (naming depends on the collector — G1&#39;s &lt;code&gt;Pause Full&lt;/code&gt;,
 or full/major cycles under other collectors) → The old generation is 
under pressure. This is typically the most expensive kind of collection.
 Investigate:
&lt;ul dir=&quot;auto&quot;&gt;&lt;li&gt;Long-lived objects that should be short-lived (caching too aggressively?)&lt;/li&gt;&lt;li&gt;Objects prematurely promoted to old gen (young gen too small relative to allocation rate?)&lt;/li&gt;&lt;li&gt;A genuine memory leak (unbounded cache, unclosed resources)&lt;/li&gt;&lt;/ul&gt;
&lt;/li&gt;&lt;/ul&gt;
&lt;p dir=&quot;auto&quot;&gt;&lt;strong&gt;By-phase breakdown&lt;/strong&gt; tells you which type of collection dominates:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Phase&lt;/th&gt;
&lt;th&gt;Indicates&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Young-generation pauses dominate&lt;/td&gt;
&lt;td&gt;Heavy short-lived allocation churn (normal)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Full/old-gen pauses appear&lt;/td&gt;
&lt;td&gt;Old-gen pressure (investigate)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Remark/reference-processing phases are large&lt;/td&gt;
&lt;td&gt;Large heap + many references to scan&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;blockquote&gt;
&lt;p dir=&quot;auto&quot;&gt;&lt;strong&gt;Optimization for young-gen dominance&lt;/strong&gt;: Tune young generation sizing (e.g., &lt;code&gt;-XX:NewRatio&lt;/code&gt;, or your collector&#39;s equivalent) so objects die young instead of being promoted, or reduce allocation (Dimension 2).&lt;/p&gt;
&lt;p dir=&quot;auto&quot;&gt;&lt;strong&gt;Optimization for old-gen/full GCs&lt;/strong&gt;: Increase old generation headroom, tune promotion thresholds, or fix the underlying leak.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p dir=&quot;auto&quot;&gt;&lt;em&gt;Note: the exact event and phase names above depend on 
which GC you&#39;re running (G1 is the default in modern JDKs; ZGC and 
Shenandoah expose different, mostly-concurrent phase events). Confirm 
the phase names in your own recording rather than assuming G1&#39;s naming.&lt;/em&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;div class=&quot;markdown-heading&quot; dir=&quot;auto&quot;&gt;&lt;h2 class=&quot;heading-element&quot; dir=&quot;auto&quot; tabindex=&quot;-1&quot;&gt;6. Dimension 5: Class Loading&lt;/h2&gt;&lt;a aria-label=&quot;Permalink: 6. Dimension 5: Class Loading&quot; class=&quot;anchor&quot; href=&quot;https://github.com/gtiwari333/mono-micro-service/blob/main/docs/jfr-blog1.md#6-dimension-5-class-loading&quot; id=&quot;user-content-6-dimension-5-class-loading&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; class=&quot;octicon octicon-link&quot; data-component=&quot;Octicon&quot; height=&quot;16&quot; viewbox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p dir=&quot;auto&quot;&gt;&lt;strong&gt;Data source&lt;/strong&gt;: &lt;code&gt;jdk.ClassLoadingStatistics&lt;/code&gt; — cumulative counters of loaded and unloaded classes.&lt;/p&gt;
&lt;div class=&quot;markdown-heading&quot; dir=&quot;auto&quot;&gt;&lt;h3 class=&quot;heading-element&quot; dir=&quot;auto&quot; tabindex=&quot;-1&quot;&gt;What to Extract&lt;/h3&gt;&lt;a aria-label=&quot;Permalink: What to Extract&quot; class=&quot;anchor&quot; href=&quot;https://github.com/gtiwari333/mono-micro-service/blob/main/docs/jfr-blog1.md#what-to-extract-3&quot; id=&quot;user-content-what-to-extract-3&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; class=&quot;octicon octicon-link&quot; data-component=&quot;Octicon&quot; height=&quot;16&quot; viewbox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div class=&quot;highlight highlight-source-shell notranslate position-relative overflow-auto&quot; dir=&quot;auto&quot;&gt;&lt;pre&gt;jfr print --events jdk.ClassLoadingStatistics --json recording.jfr&lt;/pre&gt;&lt;div class=&quot;zeroclipboard-container&quot;&gt;
    
      
    

      
    
  &lt;/div&gt;&lt;/div&gt;
&lt;p dir=&quot;auto&quot;&gt;The last event in the series gives the final tally:&lt;/p&gt;
&lt;div class=&quot;snippet-clipboard-content notranslate position-relative overflow-auto&quot;&gt;&lt;pre class=&quot;notranslate&quot;&gt;&lt;code&gt;Classes loaded (final):    18,423
Classes unloaded (final):      47
&lt;/code&gt;&lt;/pre&gt;&lt;div class=&quot;zeroclipboard-container&quot;&gt;
    
      
    

      
    
  &lt;/div&gt;&lt;/div&gt;
&lt;div class=&quot;markdown-heading&quot; dir=&quot;auto&quot;&gt;&lt;h3 class=&quot;heading-element&quot; dir=&quot;auto&quot; tabindex=&quot;-1&quot;&gt;What&#39;s Typical&lt;/h3&gt;&lt;a aria-label=&quot;Permalink: What&#39;s Typical&quot; class=&quot;anchor&quot; href=&quot;https://github.com/gtiwari333/mono-micro-service/blob/main/docs/jfr-blog1.md#whats-typical&quot; id=&quot;user-content-whats-typical&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; class=&quot;octicon octicon-link&quot; data-component=&quot;Octicon&quot; height=&quot;16&quot; viewbox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p dir=&quot;auto&quot;&gt;Class counts vary a lot by application, but as a rough sense of scale:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Application type&lt;/th&gt;
&lt;th&gt;Illustrative class count&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Small app with a web server + a handful of libraries&lt;/td&gt;
&lt;td&gt;Low thousands to ~15,000&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Typical app-server app with several framework integrations (web, DI, ORM, messaging, etc.)&lt;/td&gt;
&lt;td&gt;Higher, often 15,000–25,000+&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Large monolith with many modules and dependencies&lt;/td&gt;
&lt;td&gt;Can exceed 25,000–30,000&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Minimal, dependency-light app&lt;/td&gt;
&lt;td&gt;A few thousand&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p dir=&quot;auto&quot;&gt;Every class you load costs:&lt;/p&gt;
&lt;ol dir=&quot;auto&quot;&gt;&lt;li&gt;&lt;strong&gt;Startup time&lt;/strong&gt; — parsing, verifying, and linking the bytecode&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Metaspace memory&lt;/strong&gt; — class metadata is stored 
off-heap in Metaspace (typically on the order of a few hundred bytes to a
 few KB per class, depending on the class)&lt;/li&gt;&lt;li&gt;&lt;strong&gt;JIT compilation&lt;/strong&gt; — more classes means more code that could potentially be compiled&lt;/li&gt;&lt;/ol&gt;
&lt;p dir=&quot;auto&quot;&gt;Treat any &quot;X classes ≈ Y MB of Metaspace&quot; estimate as a 
ballpark, not a precise conversion — actual metadata size per class 
varies with class complexity.&lt;/p&gt;
&lt;div class=&quot;markdown-heading&quot; dir=&quot;auto&quot;&gt;&lt;h3 class=&quot;heading-element&quot; dir=&quot;auto&quot; tabindex=&quot;-1&quot;&gt;Patterns&lt;/h3&gt;&lt;a aria-label=&quot;Permalink: Patterns&quot; class=&quot;anchor&quot; href=&quot;https://github.com/gtiwari333/mono-micro-service/blob/main/docs/jfr-blog1.md#patterns&quot; id=&quot;user-content-patterns&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; class=&quot;octicon octicon-link&quot; data-component=&quot;Octicon&quot; height=&quot;16&quot; viewbox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p dir=&quot;auto&quot;&gt;&lt;strong&gt;High loaded count relative to app size&lt;/strong&gt; → You may have more dependencies on the classpath than you need. Audit with:&lt;/p&gt;
&lt;div class=&quot;highlight highlight-source-shell notranslate position-relative overflow-auto&quot; dir=&quot;auto&quot;&gt;&lt;pre&gt;&lt;span class=&quot;pl-c&quot;&gt;&lt;span class=&quot;pl-c&quot;&gt;#&lt;/span&gt; Count classes in each JAR&lt;/span&gt;
jar tf your-app.jar &lt;span class=&quot;pl-k&quot;&gt;|&lt;/span&gt; grep &lt;span class=&quot;pl-s&quot;&gt;&lt;span class=&quot;pl-pds&quot;&gt;&#39;&lt;/span&gt;\.class$&lt;span class=&quot;pl-pds&quot;&gt;&#39;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;pl-k&quot;&gt;|&lt;/span&gt; awk -F/ &lt;span class=&quot;pl-s&quot;&gt;&lt;span class=&quot;pl-pds&quot;&gt;&#39;&lt;/span&gt;{print $1}&lt;span class=&quot;pl-pds&quot;&gt;&#39;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;pl-k&quot;&gt;|&lt;/span&gt; sort &lt;span class=&quot;pl-k&quot;&gt;|&lt;/span&gt; uniq -c &lt;span class=&quot;pl-k&quot;&gt;|&lt;/span&gt; sort -rn&lt;/pre&gt;&lt;div class=&quot;zeroclipboard-container&quot;&gt;
    
      
    

      
    
  &lt;/div&gt;&lt;/div&gt;
&lt;blockquote&gt;
&lt;p dir=&quot;auto&quot;&gt;&lt;strong&gt;Optimization&lt;/strong&gt;: Trim unused dependencies. 
Convenience dependency bundles (framework &quot;starters,&quot; fat client 
libraries, umbrella artifacts) often pull in far more transitive classes
 than you actually use. Depend on narrower artifacts where available, or
 exclude unused transitive dependencies explicitly. CDS also reduces the
 runtime cost of each class regardless of count.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p dir=&quot;auto&quot;&gt;&lt;strong&gt;Nonzero or growing unloaded count&lt;/strong&gt; → In 
many applications a small number of unloaded classes is unremarkable. If
 the unloaded count keeps growing over the life of a long-running 
process, that can indicate a classloader leak — a classloader being 
created and discarded repeatedly, often from dynamic proxies, scripting 
engines, or redeployed contexts. Worth investigating if it trends upward
 over time rather than staying flat.&lt;/p&gt;
&lt;hr /&gt;
&lt;div class=&quot;markdown-heading&quot; dir=&quot;auto&quot;&gt;&lt;h2 class=&quot;heading-element&quot; dir=&quot;auto&quot; tabindex=&quot;-1&quot;&gt;7. Dimension 6: Thread Creation&lt;/h2&gt;&lt;a aria-label=&quot;Permalink: 7. Dimension 6: Thread Creation&quot; class=&quot;anchor&quot; href=&quot;https://github.com/gtiwari333/mono-micro-service/blob/main/docs/jfr-blog1.md#7-dimension-6-thread-creation&quot; id=&quot;user-content-7-dimension-6-thread-creation&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; class=&quot;octicon octicon-link&quot; data-component=&quot;Octicon&quot; height=&quot;16&quot; viewbox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p dir=&quot;auto&quot;&gt;&lt;strong&gt;Data sources&lt;/strong&gt;: &lt;code&gt;jdk.ThreadStart&lt;/code&gt; and &lt;code&gt;jdk.ThreadEnd&lt;/code&gt; events.&lt;/p&gt;
&lt;div class=&quot;markdown-heading&quot; dir=&quot;auto&quot;&gt;&lt;h3 class=&quot;heading-element&quot; dir=&quot;auto&quot; tabindex=&quot;-1&quot;&gt;What to Extract&lt;/h3&gt;&lt;a aria-label=&quot;Permalink: What to Extract&quot; class=&quot;anchor&quot; href=&quot;https://github.com/gtiwari333/mono-micro-service/blob/main/docs/jfr-blog1.md#what-to-extract-4&quot; id=&quot;user-content-what-to-extract-4&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; class=&quot;octicon octicon-link&quot; data-component=&quot;Octicon&quot; height=&quot;16&quot; viewbox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div class=&quot;highlight highlight-source-shell notranslate position-relative overflow-auto&quot; dir=&quot;auto&quot;&gt;&lt;pre&gt;jfr print --events jdk.ThreadStart --json recording.jfr
jfr print --events jdk.ThreadEnd --json recording.jfr&lt;/pre&gt;&lt;div class=&quot;zeroclipboard-container&quot;&gt;
    
      
    

      
    
  &lt;/div&gt;&lt;/div&gt;
&lt;div class=&quot;markdown-heading&quot; dir=&quot;auto&quot;&gt;&lt;h3 class=&quot;heading-element&quot; dir=&quot;auto&quot; tabindex=&quot;-1&quot;&gt;Grouping Threads by Pool&lt;/h3&gt;&lt;a aria-label=&quot;Permalink: Grouping Threads by Pool&quot; class=&quot;anchor&quot; href=&quot;https://github.com/gtiwari333/mono-micro-service/blob/main/docs/jfr-blog1.md#grouping-threads-by-pool&quot; id=&quot;user-content-grouping-threads-by-pool&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; class=&quot;octicon octicon-link&quot; data-component=&quot;Octicon&quot; height=&quot;16&quot; viewbox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p dir=&quot;auto&quot;&gt;Thread names typically follow conventions: &lt;code&gt;http-nio-8080-exec-1&lt;/code&gt;, &lt;code&gt;http-nio-8080-exec-2&lt;/code&gt; are the same pool. Strip trailing numbers to group them:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Pool prefix (typical examples)&lt;/th&gt;
&lt;th&gt;What it represents&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;http-nio-*-exec&lt;/code&gt;, &lt;code&gt;qtp*&lt;/code&gt; (Jetty), &lt;code&gt;undertow-*&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Web-server request-handling threads&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;HikariPool-*&lt;/code&gt;, &lt;code&gt;c3p0-*&lt;/code&gt;, or your driver/pool&#39;s naming&lt;/td&gt;
&lt;td&gt;Database connection pool threads&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;scheduling-*&lt;/code&gt;, &lt;code&gt;quartz-*&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Scheduled/cron task executor threads&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;reactor-http-*&lt;/code&gt;, Netty event-loop names&lt;/td&gt;
&lt;td&gt;Reactive/async I/O event-loop threads&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;C2 CompilerThread&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;JIT compiler threads (normal)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;ForkJoinPool.commonPool-*&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Parallel stream / CompletableFuture workers&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p dir=&quot;auto&quot;&gt;Exact naming depends on your web server, connection pool, 
and scheduler libraries — the table above shows common examples, but the
 grouping principle (strip trailing numbers, bucket by prefix) applies 
regardless of which ones you&#39;re running.&lt;/p&gt;
&lt;div class=&quot;markdown-heading&quot; dir=&quot;auto&quot;&gt;&lt;h3 class=&quot;heading-element&quot; dir=&quot;auto&quot; tabindex=&quot;-1&quot;&gt;What&#39;s Normal vs. Concerning&lt;/h3&gt;&lt;a aria-label=&quot;Permalink: What&#39;s Normal vs. Concerning&quot; class=&quot;anchor&quot; href=&quot;https://github.com/gtiwari333/mono-micro-service/blob/main/docs/jfr-blog1.md#whats-normal-vs-concerning&quot; id=&quot;user-content-whats-normal-vs-concerning&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; class=&quot;octicon octicon-link&quot; data-component=&quot;Octicon&quot; height=&quot;16&quot; viewbox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/div&gt;
&lt;ul dir=&quot;auto&quot;&gt;&lt;li&gt;&lt;strong&gt;A few dozen threads&lt;/strong&gt; is normal for a typical 
server-side app (a web-server thread pool + a database connection pool +
 a handful of schedulers + GC/JIT threads).&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Hundreds of threads&lt;/strong&gt; → Check for thread leaks or an 
oversized pool configuration. Each platform thread carries stack-space 
and scheduling overhead. Look for executors that create threads but 
never shut down, or pools configured with an unnecessarily high &lt;code&gt;maximumPoolSize&lt;/code&gt;. And the same caution applies in the other direction: if contention analysis (Dimension 7) points you toward &lt;em&gt;increasing&lt;/em&gt;
 a pool size, verify the fix with a before/after measurement rather than
 just cranking the number up — an oversized pool can itself increase 
contention and context-switching overhead, trading one bottleneck for 
another.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;One-off threads&lt;/strong&gt; (names that don&#39;t group into pools) → Each one has creation overhead. Consider a shared executor if they&#39;re frequent.&lt;/li&gt;&lt;/ul&gt;
&lt;p dir=&quot;auto&quot;&gt;&lt;strong&gt;A note on virtual threads (JDK 21+):&lt;/strong&gt; everything above assumes &lt;strong&gt;platform threads&lt;/strong&gt; — a platform thread maps one-to-one to an OS thread, which is why each one is relatively expensive to create and hold. A &lt;strong&gt;virtual thread&lt;/strong&gt;
 is different: it&#39;s a lightweight, JVM-managed thread that gets 
multiplexed onto a much smaller pool of platform threads (called &lt;strong&gt;carrier threads&lt;/strong&gt;), so the JVM can support enormous numbers of them cheaply.&lt;/p&gt;
&lt;p dir=&quot;auto&quot;&gt;If your application uses virtual threads, raw thread 
counts stop being a reliable signal on their own — seeing thousands of 
virtual threads is normal and by design, not a leak. The concerning 
pattern shifts from &quot;how many threads exist&quot; to &lt;strong&gt;pinning&lt;/strong&gt; (a virtual thread blocking its carrier thread instead of yielding it, often due to a &lt;code&gt;synchronized&lt;/code&gt; block or certain native calls) and &lt;strong&gt;carrier-thread starvation&lt;/strong&gt; (too few carrier threads available for the work being scheduled onto them). Those show up differently in a JFR recording — via &lt;code&gt;jdk.VirtualThreadPinned&lt;/code&gt; events and general scheduling delay — rather than through simple thread-count totals.&lt;/p&gt;
&lt;hr /&gt;
&lt;div class=&quot;markdown-heading&quot; dir=&quot;auto&quot;&gt;&lt;h2 class=&quot;heading-element&quot; dir=&quot;auto&quot; tabindex=&quot;-1&quot;&gt;8. Dimension 7: Lock Contention&lt;/h2&gt;&lt;a aria-label=&quot;Permalink: 8. Dimension 7: Lock Contention&quot; class=&quot;anchor&quot; href=&quot;https://github.com/gtiwari333/mono-micro-service/blob/main/docs/jfr-blog1.md#8-dimension-7-lock-contention&quot; id=&quot;user-content-8-dimension-7-lock-contention&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; class=&quot;octicon octicon-link&quot; data-component=&quot;Octicon&quot; height=&quot;16&quot; viewbox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p dir=&quot;auto&quot;&gt;&lt;strong&gt;Data sources&lt;/strong&gt;:&lt;/p&gt;
&lt;ul dir=&quot;auto&quot;&gt;&lt;li&gt;&lt;code&gt;jdk.JavaMonitorEnter&lt;/code&gt; — recorded when a thread blocks waiting to enter a &lt;code&gt;synchronized&lt;/code&gt; block/method (intrinsic lock contention)&lt;/li&gt;&lt;li&gt;&lt;code&gt;jdk.ThreadPark&lt;/code&gt; — waits on &lt;code&gt;java.util.concurrent&lt;/code&gt; primitives (&lt;code&gt;ReentrantLock&lt;/code&gt;, &lt;code&gt;CountDownLatch&lt;/code&gt;, &lt;code&gt;Semaphore&lt;/code&gt;, etc.)&lt;/li&gt;&lt;/ul&gt;
&lt;p dir=&quot;auto&quot;&gt;By default, JFR only records monitor-contention events 
above a threshold (commonly 20ms) — shorter contention won&#39;t show up 
unless you lower that threshold when starting the recording, at the cost
 of more overhead.&lt;/p&gt;
&lt;div class=&quot;markdown-heading&quot; dir=&quot;auto&quot;&gt;&lt;h3 class=&quot;heading-element&quot; dir=&quot;auto&quot; tabindex=&quot;-1&quot;&gt;What to Extract&lt;/h3&gt;&lt;a aria-label=&quot;Permalink: What to Extract&quot; class=&quot;anchor&quot; href=&quot;https://github.com/gtiwari333/mono-micro-service/blob/main/docs/jfr-blog1.md#what-to-extract-5&quot; id=&quot;user-content-what-to-extract-5&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; class=&quot;octicon octicon-link&quot; data-component=&quot;Octicon&quot; height=&quot;16&quot; viewbox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div class=&quot;highlight highlight-source-shell notranslate position-relative overflow-auto&quot; dir=&quot;auto&quot;&gt;&lt;pre&gt;jfr print --events jdk.JavaMonitorEnter --json recording.jfr
jfr print --events jdk.ThreadPark --json recording.jfr&lt;/pre&gt;&lt;div class=&quot;zeroclipboard-container&quot;&gt;
    
      
    

      
    
  &lt;/div&gt;&lt;/div&gt;
&lt;p dir=&quot;auto&quot;&gt;For each event, extract the contended/parked class name and the wait duration.&lt;/p&gt;
&lt;p dir=&quot;auto&quot;&gt;Worth keeping in mind: a &lt;code&gt;jdk.ThreadPark&lt;/code&gt; event by itself is not automatically a problem. Parking is the normal, intended mechanism behind most &lt;code&gt;java.util.concurrent&lt;/code&gt;
 waiting — a thread sitting idle in an executor waiting for work, or a 
scheduled task waiting for its next run, will generate park events 
constantly without indicating anything wrong. What makes park time worth
 investigating is the &lt;em&gt;combination&lt;/em&gt; of where it&#39;s happening (the 
stack trace) and how much of it there is relative to the work being done
 — a thread parking while genuinely idle is fine; a thread parking while
 it&#39;s supposed to be actively serving requests is the pattern to chase.&lt;/p&gt;
&lt;div class=&quot;markdown-heading&quot; dir=&quot;auto&quot;&gt;&lt;h3 class=&quot;heading-element&quot; dir=&quot;auto&quot; tabindex=&quot;-1&quot;&gt;Patterns&lt;/h3&gt;&lt;a aria-label=&quot;Permalink: Patterns&quot; class=&quot;anchor&quot; href=&quot;https://github.com/gtiwari333/mono-micro-service/blob/main/docs/jfr-blog1.md#patterns-1&quot; id=&quot;user-content-patterns-1&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; class=&quot;octicon octicon-link&quot; data-component=&quot;Octicon&quot; height=&quot;16&quot; viewbox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p dir=&quot;auto&quot;&gt;&lt;strong&gt;Monitor enter on &lt;code&gt;java.lang.Class&lt;/code&gt; objects&lt;/strong&gt; → Static synchronized methods or &lt;code&gt;synchronized(MyClass.class)&lt;/code&gt;
 blocks. Class-level locks are particularly bad because they serialize 
all threads contending on that class, not just per-instance callers.&lt;/p&gt;
&lt;p dir=&quot;auto&quot;&gt;&lt;strong&gt;Monitor enter on &lt;code&gt;Logger&lt;/code&gt; / logging internals&lt;/strong&gt; → Synchronized logging. Consider an async logger (e.g., Log4j2&#39;s async loggers) if this shows up as significant contention.&lt;/p&gt;
&lt;p dir=&quot;auto&quot;&gt;&lt;strong&gt;Park on a connection-pool&#39;s internal lock (HikariCP, c3p0, or others)&lt;/strong&gt;
 → Connection pool contention. If threads are parking waiting for a 
database connection, consider increasing the pool&#39;s max size (only after
 checking whether the DB and queries can actually support more 
concurrent connections) or investigate slow queries holding connections 
longer than necessary.&lt;/p&gt;
&lt;p dir=&quot;auto&quot;&gt;&lt;strong&gt;Park on &lt;code&gt;CountDownLatch&lt;/code&gt; / &lt;code&gt;CyclicBarrier&lt;/code&gt; with high counts&lt;/strong&gt;
 → Thread coordination that&#39;s spending more time waiting than working. 
Check if the parallelism is appropriate for your hardware.&lt;/p&gt;
&lt;div class=&quot;markdown-heading&quot; dir=&quot;auto&quot;&gt;&lt;h3 class=&quot;heading-element&quot; dir=&quot;auto&quot; tabindex=&quot;-1&quot;&gt;How to Read the Numbers&lt;/h3&gt;&lt;a aria-label=&quot;Permalink: How to Read the Numbers&quot; class=&quot;anchor&quot; href=&quot;https://github.com/gtiwari333/mono-micro-service/blob/main/docs/jfr-blog1.md#how-to-read-the-numbers&quot; id=&quot;user-content-how-to-read-the-numbers&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; class=&quot;octicon octicon-link&quot; data-component=&quot;Octicon&quot; height=&quot;16&quot; viewbox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div class=&quot;snippet-clipboard-content notranslate position-relative overflow-auto&quot;&gt;&lt;pre class=&quot;notranslate&quot;&gt;&lt;code&gt;Monitor enter events:   847    total wait:   342.1 ms
Thread park events:   2,103    total park:  1,892.6 ms
&lt;/code&gt;&lt;/pre&gt;&lt;div class=&quot;zeroclipboard-container&quot;&gt;
    
      
    

      
    
  &lt;/div&gt;&lt;/div&gt;
&lt;ul dir=&quot;auto&quot;&gt;&lt;li&gt;&lt;strong&gt;Park time notably higher than monitor-enter time&lt;/strong&gt; → Contention is more concentrated in &lt;code&gt;java.util.concurrent&lt;/code&gt; structures than &lt;code&gt;synchronized&lt;/code&gt; blocks — common in modern applications and frameworks that lean on the concurrency utilities rather than intrinsic locks.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Total wait a meaningful fraction of recording time&lt;/strong&gt; 
(rough guide: worth a look above roughly 5%) → Contention is meaningful.
 Below 1–2%, it&#39;s usually not worth chasing — the wins will be marginal 
relative to the effort.&lt;/li&gt;&lt;/ul&gt;
&lt;hr /&gt;
&lt;div class=&quot;markdown-heading&quot; dir=&quot;auto&quot;&gt;&lt;h2 class=&quot;heading-element&quot; dir=&quot;auto&quot; tabindex=&quot;-1&quot;&gt;9. Dimension 8: JIT Compilation&lt;/h2&gt;&lt;a aria-label=&quot;Permalink: 9. Dimension 8: JIT Compilation&quot; class=&quot;anchor&quot; href=&quot;https://github.com/gtiwari333/mono-micro-service/blob/main/docs/jfr-blog1.md#9-dimension-8-jit-compilation&quot; id=&quot;user-content-9-dimension-8-jit-compilation&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; class=&quot;octicon octicon-link&quot; data-component=&quot;Octicon&quot; height=&quot;16&quot; viewbox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p dir=&quot;auto&quot;&gt;&lt;strong&gt;Data source&lt;/strong&gt;: &lt;code&gt;jdk.Compilation&lt;/code&gt; events. One event per compiled method, recording the method signature, compile level, and compilation duration.&lt;/p&gt;
&lt;div class=&quot;markdown-heading&quot; dir=&quot;auto&quot;&gt;&lt;h3 class=&quot;heading-element&quot; dir=&quot;auto&quot; tabindex=&quot;-1&quot;&gt;What to Extract&lt;/h3&gt;&lt;a aria-label=&quot;Permalink: What to Extract&quot; class=&quot;anchor&quot; href=&quot;https://github.com/gtiwari333/mono-micro-service/blob/main/docs/jfr-blog1.md#what-to-extract-6&quot; id=&quot;user-content-what-to-extract-6&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; class=&quot;octicon octicon-link&quot; data-component=&quot;Octicon&quot; height=&quot;16&quot; viewbox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div class=&quot;highlight highlight-source-shell notranslate position-relative overflow-auto&quot; dir=&quot;auto&quot;&gt;&lt;pre&gt;jfr print --events jdk.Compilation --json recording.jfr&lt;/pre&gt;&lt;div class=&quot;zeroclipboard-container&quot;&gt;
    
      
    

      
    
  &lt;/div&gt;&lt;/div&gt;
&lt;div class=&quot;markdown-heading&quot; dir=&quot;auto&quot;&gt;&lt;h3 class=&quot;heading-element&quot; dir=&quot;auto&quot; tabindex=&quot;-1&quot;&gt;Understanding Compile Levels&lt;/h3&gt;&lt;a aria-label=&quot;Permalink: Understanding Compile Levels&quot; class=&quot;anchor&quot; href=&quot;https://github.com/gtiwari333/mono-micro-service/blob/main/docs/jfr-blog1.md#understanding-compile-levels&quot; id=&quot;user-content-understanding-compile-levels&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; class=&quot;octicon octicon-link&quot; data-component=&quot;Octicon&quot; height=&quot;16&quot; viewbox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p dir=&quot;auto&quot;&gt;Modern JVMs don&#39;t compile everything the same way. Instead, &lt;strong&gt;tiered compilation&lt;/strong&gt; runs code through progressively more sophisticated compilers as it proves itself &quot;hot&quot; enough to be worth the investment:&lt;/p&gt;
&lt;div class=&quot;snippet-clipboard-content notranslate position-relative overflow-auto&quot;&gt;&lt;pre class=&quot;notranslate&quot;&gt;&lt;code&gt;Interpreter  →  C1  →  C2
(slow to run,   (fast to compile,   (expensive to compile,
 no compile      moderately         most optimized,
 delay)          optimized)         best steady-state speed)
&lt;/code&gt;&lt;/pre&gt;&lt;div class=&quot;zeroclipboard-container&quot;&gt;
    
      
    

      
    
  &lt;/div&gt;&lt;/div&gt;
&lt;p dir=&quot;auto&quot;&gt;New code starts in the interpreter, which runs slowly but 
has zero compilation delay. Code that gets called often is compiled by &lt;strong&gt;C1&lt;/strong&gt;,
 a quick compiler that produces reasonably fast code without spending 
much time compiling. Code that&#39;s still hot after that gets recompiled by
 &lt;strong&gt;C2&lt;/strong&gt;, a much more thorough optimizing compiler that 
takes longer to run but produces the fastest possible code, using the 
profiling data gathered along the way. This staged approach is why a 
JVM&#39;s startup performance and its long-running, steady-state performance
 are genuinely different regimes — a short-lived process may never get 
past C1 for most of its code, while a long-running server eventually 
gets its hot paths onto C2.&lt;/p&gt;
&lt;p dir=&quot;auto&quot;&gt;Broken down into JFR&#39;s numeric compile levels:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Level&lt;/th&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;Interpreter&lt;/td&gt;
&lt;td&gt;No compilation — interpreted bytecode&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;C1, no profiling&lt;/td&gt;
&lt;td&gt;Simple C1 compile, fastest to produce&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;C1, limited profiling&lt;/td&gt;
&lt;td&gt;C1 with basic invocation/loop counters&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;C1, full profiling&lt;/td&gt;
&lt;td&gt;C1 with full profiling (gathers data used to decide on C2)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;C2&lt;/td&gt;
&lt;td&gt;Full optimizing compiler — most expensive to produce, highest steady-state performance&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;div class=&quot;markdown-heading&quot; dir=&quot;auto&quot;&gt;&lt;h3 class=&quot;heading-element&quot; dir=&quot;auto&quot; tabindex=&quot;-1&quot;&gt;The Startup Compilation Trade-off&lt;/h3&gt;&lt;a aria-label=&quot;Permalink: The Startup Compilation Trade-off&quot; class=&quot;anchor&quot; href=&quot;https://github.com/gtiwari333/mono-micro-service/blob/main/docs/jfr-blog1.md#the-startup-compilation-trade-off&quot; id=&quot;user-content-the-startup-compilation-trade-off&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; class=&quot;octicon octicon-link&quot; data-component=&quot;Octicon&quot; height=&quot;16&quot; viewbox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p dir=&quot;auto&quot;&gt;During startup, hot methods are typically compiled first 
at cheaper C1 levels, then re-compiled at level 4 once the JIT has 
gathered enough profiling data to justify it. This tiered approach 
favors faster ramp-up at the cost of some methods being compiled more 
than once.&lt;/p&gt;
&lt;div class=&quot;snippet-clipboard-content notranslate position-relative overflow-auto&quot;&gt;&lt;pre class=&quot;notranslate&quot;&gt;&lt;code&gt;Compilations:      2,847
Total compile time: 3,452 ms
Compile time % of recording: 11.5%
&lt;/code&gt;&lt;/pre&gt;&lt;div class=&quot;zeroclipboard-container&quot;&gt;
    
      
    

      
    
  &lt;/div&gt;&lt;/div&gt;
&lt;ul dir=&quot;auto&quot;&gt;&lt;li&gt;&lt;strong&gt;Few or no level-4 compilations&lt;/strong&gt; → Code isn&#39;t reaching full optimization. Peak throughput may suffer if the process runs long enough to matter.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Heavy, sustained level-4 activity&lt;/strong&gt; → The JIT is 
working hard. For startup-sensitive, short-lived, or CLI-style 
applications where peak throughput matters less than 
time-to-first-response, consider &lt;strong&gt;C1-only mode&lt;/strong&gt;:&lt;/li&gt;&lt;/ul&gt;
&lt;div class=&quot;highlight highlight-source-shell notranslate position-relative overflow-auto&quot; dir=&quot;auto&quot;&gt;&lt;pre&gt;java -XX:TieredStopAtLevel=1 -jar my-app.jar&lt;/pre&gt;&lt;div class=&quot;zeroclipboard-container&quot;&gt;
    
      
    

      
    
  &lt;/div&gt;&lt;/div&gt;
&lt;p dir=&quot;auto&quot;&gt;This disables C2 entirely. You give up C2&#39;s deeper 
optimizations (aggressive inlining, loop unrolling, escape analysis, 
etc.) in exchange for saving all C2 compilation CPU. Worth it for batch 
jobs, CLI tools, or anything where the process exits before C2 would 
have paid for itself — not a good default for a long-running, 
throughput-sensitive service.&lt;/p&gt;
&lt;p dir=&quot;auto&quot;&gt;&lt;strong&gt;Top compiled methods by time&lt;/strong&gt; show which 
code paths trigger the most expensive compilations. Application methods 
appearing here (as opposed to framework code) are hot paths the JIT 
considers worth optimizing — probably worth a look regardless of your 
JIT tuning.&lt;/p&gt;
&lt;hr /&gt;
&lt;div class=&quot;markdown-heading&quot; dir=&quot;auto&quot;&gt;&lt;h2 class=&quot;heading-element&quot; dir=&quot;auto&quot; tabindex=&quot;-1&quot;&gt;10. Dimension 9: Socket / File I/O&lt;/h2&gt;&lt;a aria-label=&quot;Permalink: 10. Dimension 9: Socket / File I/O&quot; class=&quot;anchor&quot; href=&quot;https://github.com/gtiwari333/mono-micro-service/blob/main/docs/jfr-blog1.md#10-dimension-9-socket--file-io&quot; id=&quot;user-content-10-dimension-9-socket--file-io&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; class=&quot;octicon octicon-link&quot; data-component=&quot;Octicon&quot; height=&quot;16&quot; viewbox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p dir=&quot;auto&quot;&gt;&lt;strong&gt;Data sources&lt;/strong&gt;:&lt;/p&gt;
&lt;ul dir=&quot;auto&quot;&gt;&lt;li&gt;&lt;code&gt;jdk.SocketRead&lt;/code&gt; / &lt;code&gt;jdk.SocketWrite&lt;/code&gt; — network I/O with host, bytes, and duration&lt;/li&gt;&lt;li&gt;&lt;code&gt;jdk.FileRead&lt;/code&gt; / &lt;code&gt;jdk.FileWrite&lt;/code&gt; — file I/O with path, bytes, and duration&lt;/li&gt;&lt;/ul&gt;
&lt;div class=&quot;markdown-heading&quot; dir=&quot;auto&quot;&gt;&lt;h3 class=&quot;heading-element&quot; dir=&quot;auto&quot; tabindex=&quot;-1&quot;&gt;What to Extract&lt;/h3&gt;&lt;a aria-label=&quot;Permalink: What to Extract&quot; class=&quot;anchor&quot; href=&quot;https://github.com/gtiwari333/mono-micro-service/blob/main/docs/jfr-blog1.md#what-to-extract-7&quot; id=&quot;user-content-what-to-extract-7&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; class=&quot;octicon octicon-link&quot; data-component=&quot;Octicon&quot; height=&quot;16&quot; viewbox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div class=&quot;highlight highlight-source-shell notranslate position-relative overflow-auto&quot; dir=&quot;auto&quot;&gt;&lt;pre&gt;jfr print --events jdk.SocketRead,jdk.SocketWrite --json recording.jfr
jfr print --events jdk.FileRead,jdk.FileWrite --json recording.jfr&lt;/pre&gt;&lt;div class=&quot;zeroclipboard-container&quot;&gt;
    
      
    

      
    
  &lt;/div&gt;&lt;/div&gt;
&lt;div class=&quot;markdown-heading&quot; dir=&quot;auto&quot;&gt;&lt;h3 class=&quot;heading-element&quot; dir=&quot;auto&quot; tabindex=&quot;-1&quot;&gt;Reading I/O Patterns&lt;/h3&gt;&lt;a aria-label=&quot;Permalink: Reading I/O Patterns&quot; class=&quot;anchor&quot; href=&quot;https://github.com/gtiwari333/mono-micro-service/blob/main/docs/jfr-blog1.md#reading-io-patterns&quot; id=&quot;user-content-reading-io-patterns&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; class=&quot;octicon octicon-link&quot; data-component=&quot;Octicon&quot; height=&quot;16&quot; viewbox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p dir=&quot;auto&quot;&gt;&lt;strong&gt;Socket I/O during startup&lt;/strong&gt; — every network call during &lt;code&gt;ApplicationRunner&lt;/code&gt; / &lt;code&gt;@PostConstruct&lt;/code&gt; delays readiness. Look for:&lt;/p&gt;
&lt;ul dir=&quot;auto&quot;&gt;&lt;li&gt;Database connection establishment (expected, but should happen once)&lt;/li&gt;&lt;li&gt;HTTP calls to external services (configuration fetching, health checks, service discovery)&lt;/li&gt;&lt;li&gt;Redis/Memcached connection setup (expected)&lt;/li&gt;&lt;li&gt;Unexpected HTTP calls (e.g., XML schema validation fetching remote DTDs)&lt;/li&gt;&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p dir=&quot;auto&quot;&gt;&lt;strong&gt;Optimization&lt;/strong&gt;: Defer non-critical network calls to after the application is ready (&lt;code&gt;ApplicationReadyEvent&lt;/code&gt;). Cache responses that don&#39;t change between restarts. Use connection pooling to amortize handshake cost.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p dir=&quot;auto&quot;&gt;&lt;strong&gt;File I/O duration&lt;/strong&gt; — the &lt;code&gt;duration&lt;/code&gt; field on &lt;code&gt;FileRead&lt;/code&gt;/&lt;code&gt;FileWrite&lt;/code&gt; events captures the time the call took, including any blocking wait, not just CPU-side processing. High wait time on:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Path pattern&lt;/th&gt;
&lt;th&gt;Suggests&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;*.jar&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Classpath scanning — CDS can help&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;*.class&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Class loading from exploded directories — CDS or packaging as a jar can help&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;application*.yml&lt;/code&gt; / &lt;code&gt;*.properties&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Config file loading — normal, but check for excessive includes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;/etc/&lt;/code&gt;, &lt;code&gt;/usr/&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;System-level file access — unusual, worth investigating&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Database files&lt;/td&gt;
&lt;td&gt;If using an embedded DB (e.g., H2), the DB files are being read directly&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr /&gt;
&lt;div class=&quot;markdown-heading&quot; dir=&quot;auto&quot;&gt;&lt;h2 class=&quot;heading-element&quot; dir=&quot;auto&quot; tabindex=&quot;-1&quot;&gt;11. Dimension 10: CPU Load Timeline&lt;/h2&gt;&lt;a aria-label=&quot;Permalink: 11. Dimension 10: CPU Load Timeline&quot; class=&quot;anchor&quot; href=&quot;https://github.com/gtiwari333/mono-micro-service/blob/main/docs/jfr-blog1.md#11-dimension-10-cpu-load-timeline&quot; id=&quot;user-content-11-dimension-10-cpu-load-timeline&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; class=&quot;octicon octicon-link&quot; data-component=&quot;Octicon&quot; height=&quot;16&quot; viewbox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p dir=&quot;auto&quot;&gt;&lt;strong&gt;Data source&lt;/strong&gt;: &lt;code&gt;jdk.CPULoad&lt;/code&gt; — periodic snapshots of JVM user CPU, JVM system CPU, and total machine CPU.&lt;/p&gt;
&lt;div class=&quot;markdown-heading&quot; dir=&quot;auto&quot;&gt;&lt;h3 class=&quot;heading-element&quot; dir=&quot;auto&quot; tabindex=&quot;-1&quot;&gt;What to Extract&lt;/h3&gt;&lt;a aria-label=&quot;Permalink: What to Extract&quot; class=&quot;anchor&quot; href=&quot;https://github.com/gtiwari333/mono-micro-service/blob/main/docs/jfr-blog1.md#what-to-extract-8&quot; id=&quot;user-content-what-to-extract-8&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; class=&quot;octicon octicon-link&quot; data-component=&quot;Octicon&quot; height=&quot;16&quot; viewbox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div class=&quot;highlight highlight-source-shell notranslate position-relative overflow-auto&quot; dir=&quot;auto&quot;&gt;&lt;pre&gt;jfr print --events jdk.CPULoad --json recording.jfr&lt;/pre&gt;&lt;div class=&quot;zeroclipboard-container&quot;&gt;
    
      
    

      
    
  &lt;/div&gt;&lt;/div&gt;
&lt;div class=&quot;markdown-heading&quot; dir=&quot;auto&quot;&gt;&lt;h3 class=&quot;heading-element&quot; dir=&quot;auto&quot; tabindex=&quot;-1&quot;&gt;Interpreting the Three Numbers&lt;/h3&gt;&lt;a aria-label=&quot;Permalink: Interpreting the Three Numbers&quot; class=&quot;anchor&quot; href=&quot;https://github.com/gtiwari333/mono-micro-service/blob/main/docs/jfr-blog1.md#interpreting-the-three-numbers&quot; id=&quot;user-content-interpreting-the-three-numbers&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; class=&quot;octicon octicon-link&quot; data-component=&quot;Octicon&quot; height=&quot;16&quot; viewbox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/div&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Metric&lt;/th&gt;
&lt;th&gt;Meaning&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;JVM user%&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;CPU spent in JVM user-mode code (your app + framework + JIT)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;JVM system%&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;CPU spent in kernel on behalf of the JVM (I/O syscalls, thread scheduling, some GC activity)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Machine total%&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Total CPU utilization across all processes on the host&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p dir=&quot;auto&quot;&gt;&lt;strong&gt;Patterns&lt;/strong&gt;:&lt;/p&gt;
&lt;ul dir=&quot;auto&quot;&gt;&lt;li&gt;&lt;strong&gt;JVM user% + system% ≈ machine total%&lt;/strong&gt; → The JVM is the dominant CPU consumer on the box. You&#39;re compute-bound — optimize CPU hotspots (Dimension 1).&lt;/li&gt;&lt;li&gt;&lt;strong&gt;High system% relative to user%&lt;/strong&gt; → The JVM is 
spending an unusual amount of time in kernel space. Points toward heavy 
I/O (Dimension 9) or heavy thread context switching (Dimension 6).&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Machine total% near 100% but JVM% is comparatively low&lt;/strong&gt; → Something else on the host is consuming CPU. Your JVM isn&#39;t the bottleneck — look at co-located processes.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Low JVM% and low machine%&lt;/strong&gt; → The JVM is waiting on something external (I/O, locks, or genuinely idle). Check thread idle time (Dimension 11).&lt;/li&gt;&lt;/ul&gt;
&lt;hr /&gt;
&lt;div class=&quot;markdown-heading&quot; dir=&quot;auto&quot;&gt;&lt;h2 class=&quot;heading-element&quot; dir=&quot;auto&quot; tabindex=&quot;-1&quot;&gt;12. Dimension 11: Thread Idle / Sleep Time&lt;/h2&gt;&lt;a aria-label=&quot;Permalink: 12. Dimension 11: Thread Idle / Sleep Time&quot; class=&quot;anchor&quot; href=&quot;https://github.com/gtiwari333/mono-micro-service/blob/main/docs/jfr-blog1.md#12-dimension-11-thread-idle--sleep-time&quot; id=&quot;user-content-12-dimension-11-thread-idle--sleep-time&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; class=&quot;octicon octicon-link&quot; data-component=&quot;Octicon&quot; height=&quot;16&quot; viewbox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p dir=&quot;auto&quot;&gt;&lt;strong&gt;Data sources&lt;/strong&gt;: &lt;code&gt;jdk.ThreadSleep&lt;/code&gt; (explicit &lt;code&gt;Thread.sleep()&lt;/code&gt; calls) and &lt;code&gt;jdk.JavaMonitorWait&lt;/code&gt; (&lt;code&gt;Object.wait()&lt;/code&gt;), alongside &lt;code&gt;jdk.ThreadPark&lt;/code&gt; already covered in Dimension 7 for &lt;code&gt;java.util.concurrent&lt;/code&gt;
 waits. Together these three event types cover most of the ways a thread
 can be voluntarily idle rather than blocked on I/O or a contended lock.&lt;/p&gt;
&lt;p dir=&quot;auto&quot;&gt;&lt;em&gt;A note on terminology: some third-party profilers 
(notably async-profiler&#39;s wall-clock mode) offer a more general &quot;wall 
clock&quot; sampling approach that periodically samples every thread&#39;s state 
regardless of whether it&#39;s running, sleeping, or blocked — useful for a 
single unified idle-time view. Standard JFR doesn&#39;t have one combined 
event for this; you assemble the picture from the events above.&lt;/em&gt;&lt;/p&gt;
&lt;div class=&quot;markdown-heading&quot; dir=&quot;auto&quot;&gt;&lt;h3 class=&quot;heading-element&quot; dir=&quot;auto&quot; tabindex=&quot;-1&quot;&gt;What to Extract&lt;/h3&gt;&lt;a aria-label=&quot;Permalink: What to Extract&quot; class=&quot;anchor&quot; href=&quot;https://github.com/gtiwari333/mono-micro-service/blob/main/docs/jfr-blog1.md#what-to-extract-9&quot; id=&quot;user-content-what-to-extract-9&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; class=&quot;octicon octicon-link&quot; data-component=&quot;Octicon&quot; height=&quot;16&quot; viewbox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div class=&quot;highlight highlight-source-shell notranslate position-relative overflow-auto&quot; dir=&quot;auto&quot;&gt;&lt;pre&gt;jfr print --events jdk.ThreadSleep,jdk.JavaMonitorWait,jdk.ThreadPark --json recording.jfr&lt;/pre&gt;&lt;div class=&quot;zeroclipboard-container&quot;&gt;
    
      
    

      
    
  &lt;/div&gt;&lt;/div&gt;
&lt;p dir=&quot;auto&quot;&gt;Each event&#39;s &lt;code&gt;duration&lt;/code&gt; field tells you how long the thread was idle, and its stack trace shows where the thread entered that state.&lt;/p&gt;
&lt;div class=&quot;markdown-heading&quot; dir=&quot;auto&quot;&gt;&lt;h3 class=&quot;heading-element&quot; dir=&quot;auto&quot; tabindex=&quot;-1&quot;&gt;Patterns&lt;/h3&gt;&lt;a aria-label=&quot;Permalink: Patterns&quot; class=&quot;anchor&quot; href=&quot;https://github.com/gtiwari333/mono-micro-service/blob/main/docs/jfr-blog1.md#patterns-2&quot; id=&quot;user-content-patterns-2&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; class=&quot;octicon octicon-link&quot; data-component=&quot;Octicon&quot; height=&quot;16&quot; viewbox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p dir=&quot;auto&quot;&gt;&lt;strong&gt;&lt;code&gt;main&lt;/code&gt; thread has high idle/sleep time during startup&lt;/strong&gt; → The main thread is waiting on something. Check what the top frame is:&lt;/p&gt;
&lt;ul dir=&quot;auto&quot;&gt;&lt;li&gt;&lt;code&gt;Socket.connect&lt;/code&gt; or a related network call → Waiting for a network connection&lt;/li&gt;&lt;li&gt;&lt;code&gt;FileInputStream.read&lt;/code&gt; → Waiting for file I/O&lt;/li&gt;&lt;li&gt;&lt;code&gt;CountDownLatch.await&lt;/code&gt; → Waiting for another thread to complete initialization&lt;/li&gt;&lt;li&gt;&lt;code&gt;Thread.sleep&lt;/code&gt; → Explicit sleep (sometimes intentional — 
e.g., a documented retry backoff — sometimes worth questioning if it&#39;s 
on the startup critical path)&lt;/li&gt;&lt;/ul&gt;
&lt;p dir=&quot;auto&quot;&gt;&lt;strong&gt;Thread-pool threads dominate idle time&lt;/strong&gt; → 
Those threads are spending most of their time waiting for work. Normal 
during idle periods for request-handling pools; if you&#39;re profiling a &lt;em&gt;busy&lt;/em&gt;
 period and pool threads are still mostly idle, the bottleneck is 
upstream — not enough requests arriving, or work isn&#39;t being distributed
 to them.&lt;/p&gt;
&lt;p dir=&quot;auto&quot;&gt;&lt;strong&gt;Longest individual idle events&lt;/strong&gt; — look at 
the top 10–15 by duration. These are your &quot;long poles&quot; — single events 
that dominate the timeline. Each is a candidate for targeted 
optimization:&lt;/p&gt;
&lt;div class=&quot;snippet-clipboard-content notranslate position-relative overflow-auto&quot;&gt;&lt;pre class=&quot;notranslate&quot;&gt;&lt;code&gt;Duration  Thread    Top Frame
 8,234 ms  main      java.net.Socket.connect
 4,102 ms  main      java.io.FileInputStream.read
 1,892 ms  main      java.util.concurrent.CountDownLatch.await
&lt;/code&gt;&lt;/pre&gt;&lt;div class=&quot;zeroclipboard-container&quot;&gt;
    
      
    

      
    
  &lt;/div&gt;&lt;/div&gt;
&lt;p dir=&quot;auto&quot;&gt;In an example like this, the socket connect and file read 
alone could account for the majority of a short startup window — a 
strong signal that those two call sites are worth optimizing first.&lt;/p&gt;
&lt;hr /&gt;
&lt;div class=&quot;markdown-heading&quot; dir=&quot;auto&quot;&gt;&lt;h2 class=&quot;heading-element&quot; dir=&quot;auto&quot; tabindex=&quot;-1&quot;&gt;13. Dimension 12: Before/After Comparison&lt;/h2&gt;&lt;a aria-label=&quot;Permalink: 13. Dimension 12: Before/After Comparison&quot; class=&quot;anchor&quot; href=&quot;https://github.com/gtiwari333/mono-micro-service/blob/main/docs/jfr-blog1.md#13-dimension-12-beforeafter-comparison&quot; id=&quot;user-content-13-dimension-12-beforeafter-comparison&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; class=&quot;octicon octicon-link&quot; data-component=&quot;Octicon&quot; height=&quot;16&quot; viewbox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p dir=&quot;auto&quot;&gt;The most rigorous way to validate an optimization is to 
compare two JFR recordings — one before the change, one after — captured
 under the same workload and conditions.&lt;/p&gt;
&lt;div class=&quot;markdown-heading&quot; dir=&quot;auto&quot;&gt;&lt;h3 class=&quot;heading-element&quot; dir=&quot;auto&quot; tabindex=&quot;-1&quot;&gt;Methodology&lt;/h3&gt;&lt;a aria-label=&quot;Permalink: Methodology&quot; class=&quot;anchor&quot; href=&quot;https://github.com/gtiwari333/mono-micro-service/blob/main/docs/jfr-blog1.md#methodology&quot; id=&quot;user-content-methodology&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; class=&quot;octicon octicon-link&quot; data-component=&quot;Octicon&quot; height=&quot;16&quot; viewbox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/div&gt;
&lt;ol dir=&quot;auto&quot;&gt;&lt;li&gt;&lt;strong&gt;Record Before&lt;/strong&gt;: Capture a JFR recording of the baseline.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Make exactly one change&lt;/strong&gt;: &lt;code&gt;-XX:TieredStopAtLevel=1&lt;/code&gt;, or CDS, or AOT, or dependency trimming.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Record After&lt;/strong&gt;: Capture a second recording with the same JFR settings, same duration, same workload.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Compare across all dimensions&lt;/strong&gt;: Don&#39;t cherry-pick. 
Check every section — an optimization that improves CPU but worsens 
allocation may be a net negative depending on your priorities.&lt;/li&gt;&lt;/ol&gt;
&lt;div class=&quot;markdown-heading&quot; dir=&quot;auto&quot;&gt;&lt;h3 class=&quot;heading-element&quot; dir=&quot;auto&quot; tabindex=&quot;-1&quot;&gt;What to Compare (and What&#39;s Noise)&lt;/h3&gt;&lt;a aria-label=&quot;Permalink: What to Compare (and What&#39;s Noise)&quot; class=&quot;anchor&quot; href=&quot;https://github.com/gtiwari333/mono-micro-service/blob/main/docs/jfr-blog1.md#what-to-compare-and-whats-noise&quot; id=&quot;user-content-what-to-compare-and-whats-noise&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; class=&quot;octicon octicon-link&quot; data-component=&quot;Octicon&quot; height=&quot;16&quot; viewbox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p dir=&quot;auto&quot;&gt;&lt;strong&gt;High-signal metrics&lt;/strong&gt; (deltas worth taking seriously, roughly &amp;gt;10%):&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Metric&lt;/th&gt;
&lt;th&gt;Why it matters&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Total allocation (bytes)&lt;/td&gt;
&lt;td&gt;Directly drives GC pressure&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GC pause count + total time&lt;/td&gt;
&lt;td&gt;Directly impacts responsiveness&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Classes loaded&lt;/td&gt;
&lt;td&gt;Impacts startup time + Metaspace&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;JIT compile time&lt;/td&gt;
&lt;td&gt;Impacts startup CPU&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Thread idle/sleep time&lt;/td&gt;
&lt;td&gt;Impacts latency / readiness&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p dir=&quot;auto&quot;&gt;&lt;strong&gt;Medium-signal metrics&lt;/strong&gt; (look for larger deltas, roughly &amp;gt;30%, before drawing conclusions):&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Metric&lt;/th&gt;
&lt;th&gt;Why it matters&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;CPU sample count&lt;/td&gt;
&lt;td&gt;Rough proxy for total work done&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;byte[]&lt;/code&gt; allocation specifically&lt;/td&gt;
&lt;td&gt;Primary GC driver for many apps&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Lock contention wait time&lt;/td&gt;
&lt;td&gt;Impacts throughput under concurrency&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;File I/O bytes + wait time&lt;/td&gt;
&lt;td&gt;Impacts startup latency&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Socket I/O bytes + wait time&lt;/td&gt;
&lt;td&gt;Impacts network-dependent readiness&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p dir=&quot;auto&quot;&gt;&lt;strong&gt;Low-signal metrics&lt;/strong&gt; (small deltas here are often sampling noise — pay attention mainly when something appears or disappears entirely):&lt;/p&gt;
&lt;ul dir=&quot;auto&quot;&gt;&lt;li&gt;Small allocation-type deltas (on the order of a few MB or less, depending on total recording size)&lt;/li&gt;&lt;li&gt;Individual hot methods with only a handful of samples in either recording&lt;/li&gt;&lt;li&gt;Thread count changes of one or two&lt;/li&gt;&lt;/ul&gt;
&lt;div class=&quot;markdown-heading&quot; dir=&quot;auto&quot;&gt;&lt;h3 class=&quot;heading-element&quot; dir=&quot;auto&quot; tabindex=&quot;-1&quot;&gt;The Eliminated / New Pattern&lt;/h3&gt;&lt;a aria-label=&quot;Permalink: The Eliminated / New Pattern&quot; class=&quot;anchor&quot; href=&quot;https://github.com/gtiwari333/mono-micro-service/blob/main/docs/jfr-blog1.md#the-eliminated--new-pattern&quot; id=&quot;user-content-the-eliminated--new-pattern&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; class=&quot;octicon octicon-link&quot; data-component=&quot;Octicon&quot; height=&quot;16&quot; viewbox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p dir=&quot;auto&quot;&gt;In the comparison, flag items that were significant in the
 Before recording but are essentially absent in After, and vice versa. 
These are often the clearest wins — not &quot;we reduced this by 15%,&quot; but 
&quot;this cost is gone.&quot;&lt;/p&gt;
&lt;div class=&quot;snippet-clipboard-content notranslate position-relative overflow-auto&quot;&gt;&lt;pre class=&quot;notranslate&quot;&gt;&lt;code&gt;Type                         Before          After          Delta
byte[]                       48,123,456           0    -48,123,456 (-100%) ◀◀ ELIMINATED
TypeMappedAnnotations        12,456,789     892,123    -11,564,666 (-92.8%)
&lt;/code&gt;&lt;/pre&gt;&lt;div class=&quot;zeroclipboard-container&quot;&gt;
    
      
    

      
    
  &lt;/div&gt;&lt;/div&gt;
&lt;p dir=&quot;auto&quot;&gt;An eliminated &lt;code&gt;byte[]&lt;/code&gt; allocation like that is 
consistent with what CDS does for class-loading-related allocations — 
the class bytes come from the shared archive instead of being read and 
inflated at runtime. A large drop in annotation-metadata allocation is 
consistent with AOT pre-computing that metadata instead of building it 
at runtime. (As always, correlation from a before/after diff is a strong
 hint, not proof — confirm against the change you actually made.)&lt;/p&gt;
&lt;hr /&gt;
&lt;div class=&quot;markdown-heading&quot; dir=&quot;auto&quot;&gt;&lt;h2 class=&quot;heading-element&quot; dir=&quot;auto&quot; tabindex=&quot;-1&quot;&gt;14. Putting It All Together: A Systematic Analysis Protocol&lt;/h2&gt;&lt;a aria-label=&quot;Permalink: 14. Putting It All Together: A Systematic Analysis Protocol&quot; class=&quot;anchor&quot; href=&quot;https://github.com/gtiwari333/mono-micro-service/blob/main/docs/jfr-blog1.md#14-putting-it-all-together-a-systematic-analysis-protocol&quot; id=&quot;user-content-14-putting-it-all-together-a-systematic-analysis-protocol&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; class=&quot;octicon octicon-link&quot; data-component=&quot;Octicon&quot; height=&quot;16&quot; viewbox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p dir=&quot;auto&quot;&gt;Here&#39;s a workflow for approaching a &lt;code&gt;.jfr&lt;/code&gt; file when the question is &quot;why is this slow&quot;:&lt;/p&gt;
&lt;div class=&quot;markdown-heading&quot; dir=&quot;auto&quot;&gt;&lt;h3 class=&quot;heading-element&quot; dir=&quot;auto&quot; tabindex=&quot;-1&quot;&gt;Step 1: Orient&lt;/h3&gt;&lt;a aria-label=&quot;Permalink: Step 1: Orient&quot; class=&quot;anchor&quot; href=&quot;https://github.com/gtiwari333/mono-micro-service/blob/main/docs/jfr-blog1.md#step-1-orient&quot; id=&quot;user-content-step-1-orient&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; class=&quot;octicon octicon-link&quot; data-component=&quot;Octicon&quot; height=&quot;16&quot; viewbox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p dir=&quot;auto&quot;&gt;Read the recording metadata — JVM version, JVM arguments, 
recording duration. A very short recording doesn&#39;t have enough samples 
to be reliable. A recording with a small &lt;code&gt;-Xmx&lt;/code&gt; explains why GC is thrashing. Know the context first.&lt;/p&gt;
&lt;div class=&quot;markdown-heading&quot; dir=&quot;auto&quot;&gt;&lt;h3 class=&quot;heading-element&quot; dir=&quot;auto&quot; tabindex=&quot;-1&quot;&gt;Step 2: Profile CPU&lt;/h3&gt;&lt;a aria-label=&quot;Permalink: Step 2: Profile CPU&quot; class=&quot;anchor&quot; href=&quot;https://github.com/gtiwari333/mono-micro-service/blob/main/docs/jfr-blog1.md#step-2-profile-cpu&quot; id=&quot;user-content-step-2-profile-cpu&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; class=&quot;octicon octicon-link&quot; data-component=&quot;Octicon&quot; height=&quot;16&quot; viewbox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p dir=&quot;auto&quot;&gt;Extract &lt;code&gt;ExecutionSample&lt;/code&gt; events (text mode for stack traces). Identify the top leaf methods and top stack signatures. If &lt;code&gt;ClassLoader.defineClass&lt;/code&gt;
 dominates → CDS. If annotation scanning dominates → indexer/AOT. If 
application code dominates → profile deeper into those methods.&lt;/p&gt;
&lt;div class=&quot;markdown-heading&quot; dir=&quot;auto&quot;&gt;&lt;h3 class=&quot;heading-element&quot; dir=&quot;auto&quot; tabindex=&quot;-1&quot;&gt;Step 3: Profile Allocation&lt;/h3&gt;&lt;a aria-label=&quot;Permalink: Step 3: Profile Allocation&quot; class=&quot;anchor&quot; href=&quot;https://github.com/gtiwari333/mono-micro-service/blob/main/docs/jfr-blog1.md#step-3-profile-allocation&quot; id=&quot;user-content-step-3-profile-allocation&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; class=&quot;octicon octicon-link&quot; data-component=&quot;Octicon&quot; height=&quot;16&quot; viewbox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p dir=&quot;auto&quot;&gt;Extract &lt;code&gt;ObjectAllocationSample&lt;/code&gt; events (JSON mode for weights). Identify the top allocation types by bytes. For &lt;code&gt;byte[]&lt;/code&gt;,
 drill into allocation-site stacks. Map each major allocation site to a 
fix (CDS → class bytes, AOT → annotation metadata, caching → repeated 
object creation).&lt;/p&gt;
&lt;div class=&quot;markdown-heading&quot; dir=&quot;auto&quot;&gt;&lt;h3 class=&quot;heading-element&quot; dir=&quot;auto&quot; tabindex=&quot;-1&quot;&gt;Step 4: Check GC Health&lt;/h3&gt;&lt;a aria-label=&quot;Permalink: Step 4: Check GC Health&quot; class=&quot;anchor&quot; href=&quot;https://github.com/gtiwari333/mono-micro-service/blob/main/docs/jfr-blog1.md#step-4-check-gc-health&quot; id=&quot;user-content-step-4-check-gc-health&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; class=&quot;octicon octicon-link&quot; data-component=&quot;Octicon&quot; height=&quot;16&quot; viewbox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p dir=&quot;auto&quot;&gt;Extract &lt;code&gt;GCHeapSummary&lt;/code&gt; + &lt;code&gt;GCPhasePause&lt;/code&gt;.
 Plot the heap curve; look at pause statistics. If pause time is a large
 share of the recording, return to Step 3 — the fix is usually reducing 
allocation. If old-gen/full GCs appear, investigate separately.&lt;/p&gt;
&lt;div class=&quot;markdown-heading&quot; dir=&quot;auto&quot;&gt;&lt;h3 class=&quot;heading-element&quot; dir=&quot;auto&quot; tabindex=&quot;-1&quot;&gt;Step 5: Audit the Rest&lt;/h3&gt;&lt;a aria-label=&quot;Permalink: Step 5: Audit the Rest&quot; class=&quot;anchor&quot; href=&quot;https://github.com/gtiwari333/mono-micro-service/blob/main/docs/jfr-blog1.md#step-5-audit-the-rest&quot; id=&quot;user-content-step-5-audit-the-rest&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; class=&quot;octicon octicon-link&quot; data-component=&quot;Octicon&quot; height=&quot;16&quot; viewbox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p dir=&quot;auto&quot;&gt;Work through class loading, threads, locks, JIT, I/O, and 
idle time. Each may reveal a secondary bottleneck. The longest 
individual idle events often point to &quot;long pole&quot; optimizations — single
 changes that remove seconds of waiting.&lt;/p&gt;
&lt;div class=&quot;markdown-heading&quot; dir=&quot;auto&quot;&gt;&lt;h3 class=&quot;heading-element&quot; dir=&quot;auto&quot; tabindex=&quot;-1&quot;&gt;Step 6: Compare (if you have Before/After)&lt;/h3&gt;&lt;a aria-label=&quot;Permalink: Step 6: Compare (if you have Before/After)&quot; class=&quot;anchor&quot; href=&quot;https://github.com/gtiwari333/mono-micro-service/blob/main/docs/jfr-blog1.md#step-6-compare-if-you-have-beforeafter&quot; id=&quot;user-content-step-6-compare-if-you-have-beforeafter&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; class=&quot;octicon octicon-link&quot; data-component=&quot;Octicon&quot; height=&quot;16&quot; viewbox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p dir=&quot;auto&quot;&gt;Run every section side-by-side. Focus on eliminated items 
and large-magnitude deltas. Verify that improvements in one dimension 
didn&#39;t regress another.&lt;/p&gt;
&lt;hr /&gt;
&lt;div class=&quot;markdown-heading&quot; dir=&quot;auto&quot;&gt;&lt;h2 class=&quot;heading-element&quot; dir=&quot;auto&quot; tabindex=&quot;-1&quot;&gt;15. A Worked Example&lt;/h2&gt;&lt;a aria-label=&quot;Permalink: 15. A Worked Example&quot; class=&quot;anchor&quot; href=&quot;https://github.com/gtiwari333/mono-micro-service/blob/main/docs/jfr-blog1.md#15-a-worked-example&quot; id=&quot;user-content-15-a-worked-example&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; class=&quot;octicon octicon-link&quot; data-component=&quot;Octicon&quot; height=&quot;16&quot; viewbox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p dir=&quot;auto&quot;&gt;To make the protocol concrete, here&#39;s an illustrative 
(simplified, representative-of-the-shape-not-exact-numbers) walkthrough 
of applying it to a slow-starting application.&lt;/p&gt;
&lt;p dir=&quot;auto&quot;&gt;&lt;strong&gt;Baseline&lt;/strong&gt;: Startup takes 18 seconds.&lt;/p&gt;
&lt;p dir=&quot;auto&quot;&gt;&lt;strong&gt;Step 2 — CPU&lt;/strong&gt;: &lt;code&gt;ExecutionSample&lt;/code&gt; shows &lt;code&gt;ClassLoader.defineClass1&lt;/code&gt; accounting for roughly 45% of samples during the startup window — Pattern A from Dimension 1.&lt;/p&gt;
&lt;p dir=&quot;auto&quot;&gt;&lt;strong&gt;Step 3 — Allocation&lt;/strong&gt;: &lt;code&gt;ObjectAllocationSample&lt;/code&gt; shows &lt;code&gt;byte[]&lt;/code&gt;
 at roughly 38% of allocated bytes, with the allocation-site stacks 
tracing back through class-file reading — consistent with the CPU 
finding.&lt;/p&gt;
&lt;p dir=&quot;auto&quot;&gt;&lt;strong&gt;Step 4 — GC&lt;/strong&gt;: 17 young-generation 
collections over the recording, unremarkable pause times, no full GCs. 
GC isn&#39;t the bottleneck here — the allocation churn is a symptom of 
class loading, not a separate problem.&lt;/p&gt;
&lt;p dir=&quot;auto&quot;&gt;&lt;strong&gt;Diagnosis&lt;/strong&gt;: Both the CPU profile and the allocation profile point at the same root cause — class loading and parsing dominates startup.&lt;/p&gt;
&lt;p dir=&quot;auto&quot;&gt;&lt;strong&gt;Change made&lt;/strong&gt;: Enable CDS (&lt;code&gt;-XX:ArchiveClassesAtExit&lt;/code&gt; / &lt;code&gt;-XX:SharedArchiveFile&lt;/code&gt;), one change, nothing else.&lt;/p&gt;
&lt;p dir=&quot;auto&quot;&gt;&lt;strong&gt;After&lt;/strong&gt;: Startup takes 11 seconds.&lt;/p&gt;
&lt;div class=&quot;snippet-clipboard-content notranslate position-relative overflow-auto&quot;&gt;&lt;pre class=&quot;notranslate&quot;&gt;&lt;code&gt;Metric                Before      After      Delta
Startup time           18.0 s     11.0 s     -39%
CPU: ClassLoader          45%         14%     -31 pts
Allocation: byte[]        38%          9%     -29 pts
Minor GCs                  17          8      -9
&lt;/code&gt;&lt;/pre&gt;&lt;div class=&quot;zeroclipboard-container&quot;&gt;
    
      
    

      
    
  &lt;/div&gt;&lt;/div&gt;
&lt;p dir=&quot;auto&quot;&gt;&lt;strong&gt;Step 6 — Verify&lt;/strong&gt;: The CPU share, the 
allocation share, and the GC count all moved together in the direction 
the diagnosis predicted, and the change made (CDS) is a plausible 
mechanism for exactly that combination of effects — class-loading CPU 
down, class-byte allocation down, and fewer minor GCs because there&#39;s 
less churn to collect. That consistency across independent dimensions is
 what turns &quot;we made a change and it got faster&quot; into a reasonably 
confident causal story, rather than a coincidence.&lt;/p&gt;
&lt;p dir=&quot;auto&quot;&gt;Notice what this example does &lt;em&gt;not&lt;/em&gt; do: it doesn&#39;t 
stop at &quot;startup got faster,&quot; it checks that the mechanism (less 
class-loading work) is visible in more than one independent dimension of
 the data. A change that improves one number while an unrelated number 
gets worse is worth a second look before declaring victory.&lt;/p&gt;
&lt;hr /&gt;
&lt;div class=&quot;markdown-heading&quot; dir=&quot;auto&quot;&gt;&lt;h2 class=&quot;heading-element&quot; dir=&quot;auto&quot; tabindex=&quot;-1&quot;&gt;16. Common JFR Mistakes&lt;/h2&gt;&lt;a aria-label=&quot;Permalink: 16. Common JFR Mistakes&quot; class=&quot;anchor&quot; href=&quot;https://github.com/gtiwari333/mono-micro-service/blob/main/docs/jfr-blog1.md#16-common-jfr-mistakes&quot; id=&quot;user-content-16-common-jfr-mistakes&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; class=&quot;octicon octicon-link&quot; data-component=&quot;Octicon&quot; height=&quot;16&quot; viewbox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p dir=&quot;auto&quot;&gt;A few patterns that undermine an otherwise sound analysis:&lt;/p&gt;
&lt;ul dir=&quot;auto&quot;&gt;&lt;li&gt;&lt;strong&gt;Recording too long.&lt;/strong&gt; A five-minute recording 
spanning startup, steady-state, and idle time averages all three 
together — none of the resulting numbers describe any single phase well.
 Record the specific window you care about.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Comparing different workloads.&lt;/strong&gt; A before/after 
comparison is only meaningful if both recordings saw the same requests, 
the same data, and the same duration. Comparing a quiet-period recording
 to a load-test recording tells you about the workload difference, not 
your change.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Optimizing methods with only a handful of samples.&lt;/strong&gt; 
Low sample counts are noise, not signal (see the sampling-bias note in 
Dimension 1) — chasing them wastes effort that could go toward something
 statistically meaningful.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Looking only at CPU.&lt;/strong&gt; A CPU-only view misses 
allocation-driven GC pressure, I/O waits, and lock contention — all of 
which can dominate wall-clock time without showing up as CPU samples at 
all.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Ignoring allocation.&lt;/strong&gt; Allocation rate drives GC 
pressure well before heap usage looks alarming; waiting for a heap 
problem to show up before checking allocation means you&#39;re diagnosing 
late.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Ignoring idle time.&lt;/strong&gt; A method that&#39;s cheap on CPU 
can still be the reason startup is slow, if it&#39;s blocking on I/O or a 
latch. CPU profiling alone won&#39;t surface that — Dimension 11 will.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Comparing across different JVM versions or GC algorithms.&lt;/strong&gt;
 Event names, phase names, and default behaviors can differ between JDK 
versions and collectors. A before/after comparison should hold the JVM 
version and GC algorithm constant unless &lt;em&gt;that&#39;s&lt;/em&gt; specifically the change being tested.&lt;/li&gt;&lt;/ul&gt;
&lt;hr /&gt;
&lt;div class=&quot;markdown-heading&quot; dir=&quot;auto&quot;&gt;&lt;h2 class=&quot;heading-element&quot; dir=&quot;auto&quot; tabindex=&quot;-1&quot;&gt;17. Conclusion&lt;/h2&gt;&lt;a aria-label=&quot;Permalink: 17. Conclusion&quot; class=&quot;anchor&quot; href=&quot;https://github.com/gtiwari333/mono-micro-service/blob/main/docs/jfr-blog1.md#17-conclusion&quot; id=&quot;user-content-17-conclusion&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; class=&quot;octicon octicon-link&quot; data-component=&quot;Octicon&quot; height=&quot;16&quot; viewbox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p dir=&quot;auto&quot;&gt;A JFR recording is more than a performance trace — it&#39;s a 
map of how your JVM actually spends its time and resources, as opposed 
to how you assume it does. By systematically working through CPU, 
allocation, garbage collection, class loading, threads, synchronization,
 JIT compilation, and I/O, you replace guesswork with evidence.&lt;/p&gt;
&lt;p dir=&quot;auto&quot;&gt;The point isn&#39;t to chase every hotspot the profiler 
surfaces — plenty of what shows up is normal, unavoidable framework 
overhead or startup-only cost that will never matter in production. The 
point is to find the handful of bottlenecks that materially affect 
startup time, latency, or throughput; make one change at a time; and 
verify the result with another recording, checking that the numbers 
moved the way your diagnosis predicted before calling it done.&lt;/p&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.gtiwari333.com/feeds/1810049245710937846/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://blog.gtiwari333.com/2026/08/manually-analyze-jfr-files-to-find.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8219113377173546175/posts/default/1810049245710937846'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8219113377173546175/posts/default/1810049245710937846'/><link rel='alternate' type='text/html' href='http://blog.gtiwari333.com/2026/08/manually-analyze-jfr-files-to-find.html' title='Manually Analyze JFR Files to Find Optimization Targets'/><author><name>GT</name><uri>http://www.blogger.com/profile/16923656636145211711</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8219113377173546175.post-7780081922484450582</id><published>2026-08-02T19:58:02.506+01:00</published><updated>2026-08-02T20:01:19.803+01:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="spring-framework"/><title type='text'>Building a Dual-Mode Monolith/Microservices System with Spring Boot - One Codebase, Two Topologies</title><content type='html'>&lt;p&gt;&lt;b&gt;How to build a single codebase that deploys as either a monolith or independent microservices — and why you might want to.&lt;/b&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;p dir=&quot;auto&quot;&gt;Monolith-to-microservices rewrites are expensive, and most
 teams don&#39;t actually know which topology they need until they&#39;re 
already committed to one. The usual fix is to guess, build, and rewrite 
later when the guess turns out wrong.&lt;/p&gt;
&lt;p dir=&quot;auto&quot;&gt;There&#39;s a third option: ship both from day one, from the same codebase, the same tests, and the same CI pipeline.&lt;/p&gt;
&lt;p dir=&quot;auto&quot;&gt;That&#39;s what the &lt;b&gt;dual-architecture pattern&lt;/b&gt;
 does. Three Spring Boot services — Order, Inventory, and Shipping — 
live in one repo, share one set of interfaces, and deploy identically 
whether they&#39;re running as a single JAR or as independently scaled 
services. Switching topology is a single property: &lt;code&gt;deployment.mode&lt;/code&gt;.&lt;/p&gt;
&lt;p dir=&quot;auto&quot;&gt;In this post, I&#39;ll walk through how it works, how to set 
it up, and how it compares to Spring Modulith — along with the 
trade-offs that matter once you&#39;re past the prototype stage.&lt;/p&gt;
&lt;hr /&gt;
&lt;div class=&quot;markdown-heading&quot; dir=&quot;auto&quot;&gt;&lt;h2 class=&quot;heading-element&quot; dir=&quot;auto&quot; tabindex=&quot;-1&quot;&gt;The Problem It Solves&lt;/h2&gt;&lt;a aria-label=&quot;Permalink: The Problem It Solves&quot; class=&quot;anchor&quot; href=&quot;https://github.com/gtiwari333/mono-micro-service/blob/main/docs/blog-dual-architecture.md#the-problem-it-solves&quot; id=&quot;user-content-the-problem-it-solves&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; class=&quot;octicon octicon-link&quot; data-component=&quot;Octicon&quot; height=&quot;16&quot; viewbox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/div&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Scenario&lt;/th&gt;
&lt;th&gt;Monolith&lt;/th&gt;
&lt;th&gt;Microservices&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Early-stage startup&lt;/td&gt;
&lt;td&gt;✅ Fast to build, one deployable&lt;/td&gt;
&lt;td&gt;❌ Operational overhead kills velocity&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Enterprise with dedicated ops&lt;/td&gt;
&lt;td&gt;❌ Can&#39;t scale teams independently&lt;/td&gt;
&lt;td&gt;✅ Teams own their services end-to-end&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;On-premise customer&lt;/td&gt;
&lt;td&gt;✅ Single JAR, simple install&lt;/td&gt;
&lt;td&gt;❌ Requiring Kubernetes is a dealbreaker&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cloud-native customer&lt;/td&gt;
&lt;td&gt;❌ Wastes resources scaling monolithically&lt;/td&gt;
&lt;td&gt;✅ Scales inventory independently of ordering&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Vendor selling to both&lt;/td&gt;
&lt;td&gt;Needs to support &lt;b&gt;both&lt;/b&gt; at once, without maintaining two codebases&lt;/td&gt;
&lt;td&gt;&lt;br /&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p dir=&quot;auto&quot;&gt;If you&#39;re building software that different customers 
deploy differently — or you&#39;re a growing team that wants to defer the 
monolith-vs-microservices decision — you need a codebase that supports &lt;b&gt;both topologies without forking&lt;/b&gt;. That&#39;s what this architecture delivers.&lt;/p&gt;
&lt;hr /&gt;
&lt;div class=&quot;markdown-heading&quot; dir=&quot;auto&quot;&gt;&lt;h1 class=&quot;heading-element&quot; style=&quot;text-align: left;&quot; tabindex=&quot;-1&quot;&gt;How It Works: The Three Pillars&lt;/h1&gt;&lt;a aria-label=&quot;Permalink: How It Works: The Three Pillars&quot; class=&quot;anchor&quot; href=&quot;https://github.com/gtiwari333/mono-micro-service/blob/main/docs/blog-dual-architecture.md#how-it-works-the-three-pillars&quot; id=&quot;user-content-how-it-works-the-three-pillars&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; class=&quot;octicon octicon-link&quot; data-component=&quot;Octicon&quot; height=&quot;16&quot; viewbox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div class=&quot;markdown-heading&quot; dir=&quot;auto&quot;&gt;&lt;h3 class=&quot;heading-element&quot; dir=&quot;auto&quot; tabindex=&quot;-1&quot;&gt;Pillar 1: A Shared Contract (the Client Interface)&lt;/h3&gt;&lt;a aria-label=&quot;Permalink: Pillar 1: A Shared Contract (the Client Interface)&quot; class=&quot;anchor&quot; href=&quot;https://github.com/gtiwari333/mono-micro-service/blob/main/docs/blog-dual-architecture.md#pillar-1-a-shared-contract-the-client-interface&quot; id=&quot;user-content-pillar-1-a-shared-contract-the-client-interface&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; class=&quot;octicon octicon-link&quot; data-component=&quot;Octicon&quot; height=&quot;16&quot; viewbox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p dir=&quot;auto&quot;&gt;Every cross-service interaction starts with a plain Java interface in a shared &lt;code&gt;common-api&lt;/code&gt; module:&lt;/p&gt;
&lt;div class=&quot;highlight highlight-source-java notranslate position-relative overflow-auto&quot; dir=&quot;auto&quot;&gt;&lt;pre&gt;&lt;span class=&quot;pl-c&quot; style=&quot;font-size: x-small;&quot;&gt;// common-api/src/main/java/com/monoservice/common/api/InventoryClient.java&lt;/span&gt;
&lt;span class=&quot;pl-k&quot; style=&quot;font-size: x-small;&quot;&gt;public&lt;/span&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt; &lt;span class=&quot;pl-k&quot;&gt;interface&lt;/span&gt; &lt;span class=&quot;pl-smi&quot;&gt;InventoryClient&lt;/span&gt; {
    &lt;span class=&quot;pl-smi&quot;&gt;boolean&lt;/span&gt; &lt;span class=&quot;pl-en&quot;&gt;checkStock&lt;/span&gt;(&lt;span class=&quot;pl-smi&quot;&gt;String&lt;/span&gt; &lt;span class=&quot;pl-s1&quot;&gt;sku&lt;/span&gt;, &lt;span class=&quot;pl-smi&quot;&gt;int&lt;/span&gt; &lt;span class=&quot;pl-s1&quot;&gt;quantity&lt;/span&gt;);
    &lt;span class=&quot;pl-smi&quot;&gt;ReservationResult&lt;/span&gt; &lt;span class=&quot;pl-en&quot;&gt;reserveStock&lt;/span&gt;(&lt;span class=&quot;pl-smi&quot;&gt;String&lt;/span&gt; &lt;span class=&quot;pl-s1&quot;&gt;sku&lt;/span&gt;, &lt;span class=&quot;pl-smi&quot;&gt;int&lt;/span&gt; &lt;span class=&quot;pl-s1&quot;&gt;quantity&lt;/span&gt;);
    &lt;span class=&quot;pl-smi&quot;&gt;void&lt;/span&gt; &lt;span class=&quot;pl-en&quot;&gt;releaseStock&lt;/span&gt;(&lt;span class=&quot;pl-smi&quot;&gt;String&lt;/span&gt; &lt;span class=&quot;pl-s1&quot;&gt;sku&lt;/span&gt;, &lt;span class=&quot;pl-smi&quot;&gt;int&lt;/span&gt; &lt;span class=&quot;pl-s1&quot;&gt;quantity&lt;/span&gt;);
    &lt;span class=&quot;pl-smi&quot;&gt;int&lt;/span&gt; &lt;span class=&quot;pl-en&quot;&gt;getAvailableQuantity&lt;/span&gt;(&lt;span class=&quot;pl-smi&quot;&gt;String&lt;/span&gt; &lt;span class=&quot;pl-s1&quot;&gt;sku&lt;/span&gt;);
}&lt;/span&gt;&lt;/pre&gt;&lt;div class=&quot;zeroclipboard-container&quot;&gt;
    
      
    

      
    
  &lt;/div&gt;&lt;/div&gt;
&lt;p dir=&quot;auto&quot;&gt;Domain services never know whether the implementation lives in-process or across the network — they just inject the interface:&lt;/p&gt;
&lt;div class=&quot;highlight highlight-source-java notranslate position-relative overflow-auto&quot; dir=&quot;auto&quot;&gt;&lt;pre&gt;&lt;span class=&quot;pl-c&quot; style=&quot;font-size: x-small;&quot;&gt;// order-service/.../OrderDomainService.java&lt;/span&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;
&lt;span class=&quot;pl-c1&quot;&gt;@&lt;/span&gt;&lt;span class=&quot;pl-c1&quot;&gt;Service&lt;/span&gt;
&lt;span class=&quot;pl-c1&quot;&gt;@&lt;/span&gt;&lt;span class=&quot;pl-c1&quot;&gt;RequiredArgsConstructor&lt;/span&gt;
&lt;span class=&quot;pl-k&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;pl-k&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;pl-smi&quot;&gt;OrderDomainService&lt;/span&gt; {
    &lt;span class=&quot;pl-k&quot;&gt;private&lt;/span&gt; &lt;span class=&quot;pl-k&quot;&gt;final&lt;/span&gt; &lt;span class=&quot;pl-smi&quot;&gt;InventoryClient&lt;/span&gt; &lt;span class=&quot;pl-s1&quot;&gt;inventoryClient&lt;/span&gt;;  &lt;span class=&quot;pl-c&quot;&gt;// ← just the interface&lt;/span&gt;
    &lt;span class=&quot;pl-k&quot;&gt;private&lt;/span&gt; &lt;span class=&quot;pl-k&quot;&gt;final&lt;/span&gt; &lt;span class=&quot;pl-smi&quot;&gt;OrderEventGateway&lt;/span&gt; &lt;span class=&quot;pl-s1&quot;&gt;eventGateway&lt;/span&gt;;

    &lt;span class=&quot;pl-c1&quot;&gt;@&lt;/span&gt;&lt;span class=&quot;pl-c1&quot;&gt;Transactional&lt;/span&gt;
    &lt;span class=&quot;pl-k&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;pl-smi&quot;&gt;OrderResult&lt;/span&gt; &lt;span class=&quot;pl-en&quot;&gt;placeOrder&lt;/span&gt;(&lt;span class=&quot;pl-smi&quot;&gt;PlaceOrderRequest&lt;/span&gt; &lt;span class=&quot;pl-s1&quot;&gt;request&lt;/span&gt;) {
        &lt;span class=&quot;pl-k&quot;&gt;if&lt;/span&gt; (!&lt;span class=&quot;pl-s1&quot;&gt;inventoryClient&lt;/span&gt;.&lt;span class=&quot;pl-en&quot;&gt;checkStock&lt;/span&gt;(&lt;span class=&quot;pl-s1&quot;&gt;request&lt;/span&gt;.&lt;span class=&quot;pl-en&quot;&gt;sku&lt;/span&gt;(), &lt;span class=&quot;pl-s1&quot;&gt;request&lt;/span&gt;.&lt;span class=&quot;pl-en&quot;&gt;quantity&lt;/span&gt;())) {
            &lt;span class=&quot;pl-k&quot;&gt;throw&lt;/span&gt; &lt;span class=&quot;pl-k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;pl-smi&quot;&gt;InsufficientStockException&lt;/span&gt;(&lt;span class=&quot;pl-s1&quot;&gt;request&lt;/span&gt;.&lt;span class=&quot;pl-en&quot;&gt;sku&lt;/span&gt;());
        }
        &lt;span class=&quot;pl-s1&quot;&gt;inventoryClient&lt;/span&gt;.&lt;span class=&quot;pl-en&quot;&gt;reserveStock&lt;/span&gt;(&lt;span class=&quot;pl-s1&quot;&gt;request&lt;/span&gt;.&lt;span class=&quot;pl-en&quot;&gt;sku&lt;/span&gt;(), &lt;span class=&quot;pl-s1&quot;&gt;request&lt;/span&gt;.&lt;span class=&quot;pl-en&quot;&gt;quantity&lt;/span&gt;());
        &lt;span class=&quot;pl-c&quot;&gt;// ... persist order, publish event&lt;/span&gt;
    }
}&lt;/span&gt;&lt;/pre&gt;&lt;div class=&quot;zeroclipboard-container&quot;&gt;
    
      
    

      
    
  &lt;/div&gt;&lt;/div&gt;
&lt;p dir=&quot;auto&quot;&gt;No &lt;code&gt;if (mode == MONOLITH)&lt;/code&gt; branches, no proxy magic — just polymorphism, wired by the container.&lt;/p&gt;
&lt;div class=&quot;markdown-heading&quot; dir=&quot;auto&quot;&gt;&lt;h3 class=&quot;heading-element&quot; dir=&quot;auto&quot; tabindex=&quot;-1&quot;&gt;Pillar 2: Two Implementations, Conditionally Wired&lt;/h3&gt;&lt;a aria-label=&quot;Permalink: Pillar 2: Two Implementations, Conditionally Wired&quot; class=&quot;anchor&quot; href=&quot;https://github.com/gtiwari333/mono-micro-service/blob/main/docs/blog-dual-architecture.md#pillar-2-two-implementations-conditionally-wired&quot; id=&quot;user-content-pillar-2-two-implementations-conditionally-wired&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; class=&quot;octicon octicon-link&quot; data-component=&quot;Octicon&quot; height=&quot;16&quot; viewbox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p dir=&quot;auto&quot;&gt;For each &lt;code&gt;Client&lt;/code&gt; interface, you write &lt;b&gt;two&lt;/b&gt; implementations, and Spring picks the right one based on a property:&lt;/p&gt;
&lt;div class=&quot;highlight highlight-source-java notranslate position-relative overflow-auto&quot; dir=&quot;auto&quot;&gt;&lt;pre&gt;&lt;span class=&quot;pl-c&quot; style=&quot;font-size: x-small;&quot;&gt;// Monolith mode — direct method call, same JVM, same transaction&lt;/span&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;
&lt;span class=&quot;pl-c1&quot;&gt;@&lt;/span&gt;&lt;span class=&quot;pl-c1&quot;&gt;Component&lt;/span&gt;
&lt;span class=&quot;pl-c1&quot;&gt;@&lt;/span&gt;&lt;span class=&quot;pl-c1&quot;&gt;ConditionalOnProperty&lt;/span&gt;(&lt;span class=&quot;pl-s1&quot;&gt;name&lt;/span&gt; = &lt;span class=&quot;pl-s&quot;&gt;&quot;deployment.mode&quot;&lt;/span&gt;, &lt;span class=&quot;pl-s1&quot;&gt;havingValue&lt;/span&gt; = &lt;span class=&quot;pl-s&quot;&gt;&quot;monolith&quot;&lt;/span&gt;)
&lt;span class=&quot;pl-k&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;pl-k&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;pl-smi&quot;&gt;InventoryClientLocal&lt;/span&gt; &lt;span class=&quot;pl-k&quot;&gt;implements&lt;/span&gt; &lt;span class=&quot;pl-smi&quot;&gt;InventoryClient&lt;/span&gt; {

    &lt;span class=&quot;pl-k&quot;&gt;private&lt;/span&gt; &lt;span class=&quot;pl-k&quot;&gt;final&lt;/span&gt; &lt;span class=&quot;pl-smi&quot;&gt;InventoryDomainService&lt;/span&gt; &lt;span class=&quot;pl-s1&quot;&gt;domainService&lt;/span&gt;;

    &lt;span class=&quot;pl-c1&quot;&gt;@&lt;/span&gt;&lt;span class=&quot;pl-c1&quot;&gt;Override&lt;/span&gt;
    &lt;span class=&quot;pl-k&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;pl-smi&quot;&gt;boolean&lt;/span&gt; &lt;span class=&quot;pl-en&quot;&gt;checkStock&lt;/span&gt;(&lt;span class=&quot;pl-smi&quot;&gt;String&lt;/span&gt; &lt;span class=&quot;pl-s1&quot;&gt;sku&lt;/span&gt;, &lt;span class=&quot;pl-smi&quot;&gt;int&lt;/span&gt; &lt;span class=&quot;pl-s1&quot;&gt;quantity&lt;/span&gt;) {
        &lt;span class=&quot;pl-k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;pl-s1&quot;&gt;domainService&lt;/span&gt;.&lt;span class=&quot;pl-en&quot;&gt;checkStock&lt;/span&gt;(&lt;span class=&quot;pl-s1&quot;&gt;sku&lt;/span&gt;, &lt;span class=&quot;pl-s1&quot;&gt;quantity&lt;/span&gt;);
    }

    &lt;span class=&quot;pl-c1&quot;&gt;@&lt;/span&gt;&lt;span class=&quot;pl-c1&quot;&gt;Override&lt;/span&gt;
    &lt;span class=&quot;pl-k&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;pl-smi&quot;&gt;ReservationResult&lt;/span&gt; &lt;span class=&quot;pl-en&quot;&gt;reserveStock&lt;/span&gt;(&lt;span class=&quot;pl-smi&quot;&gt;String&lt;/span&gt; &lt;span class=&quot;pl-s1&quot;&gt;sku&lt;/span&gt;, &lt;span class=&quot;pl-smi&quot;&gt;int&lt;/span&gt; &lt;span class=&quot;pl-s1&quot;&gt;quantity&lt;/span&gt;) {
        &lt;span class=&quot;pl-k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;pl-s1&quot;&gt;domainService&lt;/span&gt;.&lt;span class=&quot;pl-en&quot;&gt;reserveStock&lt;/span&gt;(&lt;span class=&quot;pl-s1&quot;&gt;sku&lt;/span&gt;, &lt;span class=&quot;pl-s1&quot;&gt;quantity&lt;/span&gt;);
    }
    &lt;span class=&quot;pl-c&quot;&gt;// ...&lt;/span&gt;
}&lt;/span&gt;&lt;/pre&gt;&lt;div class=&quot;zeroclipboard-container&quot;&gt;
    
      
    

      
    
  &lt;/div&gt;&lt;/div&gt;
&lt;div class=&quot;highlight highlight-source-java notranslate position-relative overflow-auto&quot; dir=&quot;auto&quot;&gt;&lt;pre&gt;&lt;span class=&quot;pl-c&quot; style=&quot;font-size: x-small;&quot;&gt;// Microservices mode — HTTP call via Feign&lt;/span&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;
&lt;span class=&quot;pl-c1&quot;&gt;@&lt;/span&gt;&lt;span class=&quot;pl-c1&quot;&gt;FeignClient&lt;/span&gt;(&lt;span class=&quot;pl-s1&quot;&gt;name&lt;/span&gt; = &lt;span class=&quot;pl-s&quot;&gt;&quot;inventory-service&quot;&lt;/span&gt;,
             &lt;span class=&quot;pl-s1&quot;&gt;url&lt;/span&gt; = &lt;span class=&quot;pl-s&quot;&gt;&quot;${services.inventory.url:http://inventory-service:8080}&quot;&lt;/span&gt;)
&lt;span class=&quot;pl-c1&quot;&gt;@&lt;/span&gt;&lt;span class=&quot;pl-c1&quot;&gt;ConditionalOnProperty&lt;/span&gt;(&lt;span class=&quot;pl-s1&quot;&gt;name&lt;/span&gt; = &lt;span class=&quot;pl-s&quot;&gt;&quot;deployment.mode&quot;&lt;/span&gt;, &lt;span class=&quot;pl-s1&quot;&gt;havingValue&lt;/span&gt; = &lt;span class=&quot;pl-s&quot;&gt;&quot;microservices&quot;&lt;/span&gt;)
&lt;span class=&quot;pl-k&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;pl-k&quot;&gt;interface&lt;/span&gt; &lt;span class=&quot;pl-smi&quot;&gt;InventoryClientRemote&lt;/span&gt; &lt;span class=&quot;pl-k&quot;&gt;extends&lt;/span&gt; &lt;span class=&quot;pl-smi&quot;&gt;InventoryClient&lt;/span&gt; {

    &lt;span class=&quot;pl-c1&quot;&gt;@&lt;/span&gt;&lt;span class=&quot;pl-c1&quot;&gt;Override&lt;/span&gt;
    &lt;span class=&quot;pl-c1&quot;&gt;@&lt;/span&gt;&lt;span class=&quot;pl-c1&quot;&gt;GetMapping&lt;/span&gt;(&lt;span class=&quot;pl-s&quot;&gt;&quot;/api/inventory/check&quot;&lt;/span&gt;)
    &lt;span class=&quot;pl-smi&quot;&gt;boolean&lt;/span&gt; &lt;span class=&quot;pl-en&quot;&gt;checkStock&lt;/span&gt;(&lt;span class=&quot;pl-c1&quot;&gt;@&lt;/span&gt;&lt;span class=&quot;pl-c1&quot;&gt;RequestParam&lt;/span&gt;(&lt;span class=&quot;pl-s&quot;&gt;&quot;sku&quot;&lt;/span&gt;) &lt;span class=&quot;pl-smi&quot;&gt;String&lt;/span&gt; &lt;span class=&quot;pl-s1&quot;&gt;sku&lt;/span&gt;, &lt;span class=&quot;pl-c1&quot;&gt;@&lt;/span&gt;&lt;span class=&quot;pl-c1&quot;&gt;RequestParam&lt;/span&gt;(&lt;span class=&quot;pl-s&quot;&gt;&quot;qty&quot;&lt;/span&gt;) &lt;span class=&quot;pl-smi&quot;&gt;int&lt;/span&gt; &lt;span class=&quot;pl-s1&quot;&gt;quantity&lt;/span&gt;);

    &lt;span class=&quot;pl-c1&quot;&gt;@&lt;/span&gt;&lt;span class=&quot;pl-c1&quot;&gt;Override&lt;/span&gt;
    &lt;span class=&quot;pl-c1&quot;&gt;@&lt;/span&gt;&lt;span class=&quot;pl-c1&quot;&gt;PostMapping&lt;/span&gt;(&lt;span class=&quot;pl-s&quot;&gt;&quot;/api/inventory/reserve&quot;&lt;/span&gt;)
    &lt;span class=&quot;pl-smi&quot;&gt;ReservationResult&lt;/span&gt; &lt;span class=&quot;pl-en&quot;&gt;reserveStock&lt;/span&gt;(&lt;span class=&quot;pl-c1&quot;&gt;@&lt;/span&gt;&lt;span class=&quot;pl-c1&quot;&gt;RequestParam&lt;/span&gt;(&lt;span class=&quot;pl-s&quot;&gt;&quot;sku&quot;&lt;/span&gt;) &lt;span class=&quot;pl-smi&quot;&gt;String&lt;/span&gt; &lt;span class=&quot;pl-s1&quot;&gt;sku&lt;/span&gt;,
                                    &lt;span class=&quot;pl-c1&quot;&gt;@&lt;/span&gt;&lt;span class=&quot;pl-c1&quot;&gt;RequestParam&lt;/span&gt;(&lt;span class=&quot;pl-s&quot;&gt;&quot;qty&quot;&lt;/span&gt;) &lt;span class=&quot;pl-smi&quot;&gt;int&lt;/span&gt; &lt;span class=&quot;pl-s1&quot;&gt;quantity&lt;/span&gt;);
    &lt;span class=&quot;pl-c&quot;&gt;// ...&lt;/span&gt;
}&lt;/span&gt;&lt;/pre&gt;&lt;div class=&quot;zeroclipboard-container&quot;&gt;
    
      
    

      
    
  &lt;/div&gt;&lt;/div&gt;
&lt;p dir=&quot;auto&quot;&gt;&lt;code&gt;deployment.mode=monolith&lt;/code&gt; activates the local adapter; &lt;code&gt;deployment.mode=microservices&lt;/code&gt; activates the Feign client. &lt;code&gt;@ConditionalOnProperty&lt;/code&gt; handles the rest — no custom condition classes, no proxy factories, no bytecode generation. It&#39;s plain Spring you already know.&lt;/p&gt;
&lt;div class=&quot;markdown-heading&quot; dir=&quot;auto&quot;&gt;&lt;h3 class=&quot;heading-element&quot; dir=&quot;auto&quot; tabindex=&quot;-1&quot;&gt;Pillar 3: Dual-Path Event Routing&lt;/h3&gt;&lt;a aria-label=&quot;Permalink: Pillar 3: Dual-Path Event Routing&quot; class=&quot;anchor&quot; href=&quot;https://github.com/gtiwari333/mono-micro-service/blob/main/docs/blog-dual-architecture.md#pillar-3-dual-path-event-routing&quot; id=&quot;user-content-pillar-3-dual-path-event-routing&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; class=&quot;octicon octicon-link&quot; data-component=&quot;Octicon&quot; height=&quot;16&quot; viewbox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p dir=&quot;auto&quot;&gt;Cross-service asynchronous communication follows the same pattern. Each service defines an &lt;b&gt;event gateway&lt;/b&gt; that publishes identically in both modes:&lt;/p&gt;
&lt;div class=&quot;highlight highlight-source-java notranslate position-relative overflow-auto&quot; dir=&quot;auto&quot;&gt;&lt;pre&gt;&lt;span class=&quot;pl-c1&quot; style=&quot;font-size: x-small;&quot;&gt;@&lt;/span&gt;&lt;span class=&quot;pl-c1&quot; style=&quot;font-size: x-small;&quot;&gt;Component&lt;/span&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;
&lt;span class=&quot;pl-k&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;pl-k&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;pl-smi&quot;&gt;OrderEventGateway&lt;/span&gt; {
    &lt;span class=&quot;pl-k&quot;&gt;private&lt;/span&gt; &lt;span class=&quot;pl-k&quot;&gt;final&lt;/span&gt; &lt;span class=&quot;pl-smi&quot;&gt;ApplicationEventPublisher&lt;/span&gt; &lt;span class=&quot;pl-s1&quot;&gt;eventPublisher&lt;/span&gt;;
    &lt;span class=&quot;pl-k&quot;&gt;private&lt;/span&gt; &lt;span class=&quot;pl-k&quot;&gt;final&lt;/span&gt; &lt;span class=&quot;pl-smi&quot;&gt;ObjectProvider&lt;/span&gt;&amp;lt;&lt;span class=&quot;pl-smi&quot;&gt;KafkaTemplate&lt;/span&gt;&amp;lt;&lt;span class=&quot;pl-smi&quot;&gt;String&lt;/span&gt;, &lt;span class=&quot;pl-smi&quot;&gt;Object&lt;/span&gt;&amp;gt;&amp;gt; &lt;span class=&quot;pl-s1&quot;&gt;kafka&lt;/span&gt;;

    &lt;span class=&quot;pl-k&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;pl-smi&quot;&gt;void&lt;/span&gt; &lt;span class=&quot;pl-en&quot;&gt;publish&lt;/span&gt;(&lt;span class=&quot;pl-smi&quot;&gt;Object&lt;/span&gt; &lt;span class=&quot;pl-s1&quot;&gt;event&lt;/span&gt;) {
        &lt;span class=&quot;pl-s1&quot;&gt;eventPublisher&lt;/span&gt;.&lt;span class=&quot;pl-en&quot;&gt;publishEvent&lt;/span&gt;(&lt;span class=&quot;pl-s1&quot;&gt;event&lt;/span&gt;);  &lt;span class=&quot;pl-c&quot;&gt;// always — for in-process listeners&lt;/span&gt;

        &lt;span class=&quot;pl-s1&quot;&gt;kafka&lt;/span&gt;.&lt;span class=&quot;pl-en&quot;&gt;ifAvailable&lt;/span&gt;(&lt;span class=&quot;pl-s1&quot;&gt;template&lt;/span&gt; -&amp;gt;        &lt;span class=&quot;pl-c&quot;&gt;// only when Kafka is on the classpath&lt;/span&gt;
            &lt;span class=&quot;pl-s1&quot;&gt;template&lt;/span&gt;.&lt;span class=&quot;pl-en&quot;&gt;send&lt;/span&gt;(&lt;span class=&quot;pl-s&quot;&gt;&quot;order.events.&quot;&lt;/span&gt; + &lt;span class=&quot;pl-s1&quot;&gt;event&lt;/span&gt;.&lt;span class=&quot;pl-en&quot;&gt;getClass&lt;/span&gt;().&lt;span class=&quot;pl-en&quot;&gt;getSimpleName&lt;/span&gt;(), &lt;span class=&quot;pl-s1&quot;&gt;event&lt;/span&gt;)
        );
    }
}&lt;/span&gt;&lt;/pre&gt;&lt;div class=&quot;zeroclipboard-container&quot;&gt;
    
      
    

      
    
  &lt;/div&gt;&lt;/div&gt;
&lt;p dir=&quot;auto&quot;&gt;On the receiving side, two listeners — only one active per mode — handle the same event, both implementing a shared &lt;code&gt;OrderPlacedHandler&lt;/code&gt; interface to keep the contract explicit and testable:&lt;/p&gt;
&lt;div class=&quot;highlight highlight-source-java notranslate position-relative overflow-auto&quot; dir=&quot;auto&quot;&gt;&lt;pre&gt;&lt;span class=&quot;pl-c&quot; style=&quot;font-size: x-small;&quot;&gt;// Monolith: synchronous, within the publishing transaction&#39;s lifecycle&lt;/span&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;
&lt;span class=&quot;pl-c1&quot;&gt;@&lt;/span&gt;&lt;span class=&quot;pl-c1&quot;&gt;Component&lt;/span&gt;
&lt;span class=&quot;pl-c1&quot;&gt;@&lt;/span&gt;&lt;span class=&quot;pl-c1&quot;&gt;ConditionalOnProperty&lt;/span&gt;(&lt;span class=&quot;pl-s1&quot;&gt;name&lt;/span&gt; = &lt;span class=&quot;pl-s&quot;&gt;&quot;deployment.mode&quot;&lt;/span&gt;, &lt;span class=&quot;pl-s1&quot;&gt;havingValue&lt;/span&gt; = &lt;span class=&quot;pl-s&quot;&gt;&quot;monolith&quot;&lt;/span&gt;)
&lt;span class=&quot;pl-k&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;pl-k&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;pl-smi&quot;&gt;InventoryOrderPlacedListener&lt;/span&gt; &lt;span class=&quot;pl-k&quot;&gt;implements&lt;/span&gt; &lt;span class=&quot;pl-smi&quot;&gt;OrderPlacedHandler&lt;/span&gt; {

    &lt;span class=&quot;pl-c1&quot;&gt;@&lt;/span&gt;&lt;span class=&quot;pl-c1&quot;&gt;TransactionalEventListener&lt;/span&gt;(&lt;span class=&quot;pl-s1&quot;&gt;phase&lt;/span&gt; = &lt;span class=&quot;pl-smi&quot;&gt;TransactionPhase&lt;/span&gt;.&lt;span class=&quot;pl-c1&quot;&gt;AFTER_COMMIT&lt;/span&gt;)
    &lt;span class=&quot;pl-k&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;pl-smi&quot;&gt;void&lt;/span&gt; &lt;span class=&quot;pl-en&quot;&gt;handle&lt;/span&gt;(&lt;span class=&quot;pl-smi&quot;&gt;OrderPlacedEvent&lt;/span&gt; &lt;span class=&quot;pl-s1&quot;&gt;event&lt;/span&gt;) {
        &lt;span class=&quot;pl-s1&quot;&gt;domainService&lt;/span&gt;.&lt;span class=&quot;pl-en&quot;&gt;reserveStock&lt;/span&gt;(&lt;span class=&quot;pl-s1&quot;&gt;event&lt;/span&gt;.&lt;span class=&quot;pl-en&quot;&gt;sku&lt;/span&gt;(), &lt;span class=&quot;pl-s1&quot;&gt;event&lt;/span&gt;.&lt;span class=&quot;pl-en&quot;&gt;quantity&lt;/span&gt;());
    }
}

&lt;span class=&quot;pl-c&quot;&gt;// Microservices: async, from Kafka&lt;/span&gt;
&lt;span class=&quot;pl-c1&quot;&gt;@&lt;/span&gt;&lt;span class=&quot;pl-c1&quot;&gt;Component&lt;/span&gt;
&lt;span class=&quot;pl-c1&quot;&gt;@&lt;/span&gt;&lt;span class=&quot;pl-c1&quot;&gt;ConditionalOnProperty&lt;/span&gt;(&lt;span class=&quot;pl-s1&quot;&gt;name&lt;/span&gt; = &lt;span class=&quot;pl-s&quot;&gt;&quot;deployment.mode&quot;&lt;/span&gt;, &lt;span class=&quot;pl-s1&quot;&gt;havingValue&lt;/span&gt; = &lt;span class=&quot;pl-s&quot;&gt;&quot;microservices&quot;&lt;/span&gt;)
&lt;span class=&quot;pl-k&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;pl-k&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;pl-smi&quot;&gt;InventoryOrderPlacedKafkaListener&lt;/span&gt; &lt;span class=&quot;pl-k&quot;&gt;implements&lt;/span&gt; &lt;span class=&quot;pl-smi&quot;&gt;OrderPlacedHandler&lt;/span&gt; {

    &lt;span class=&quot;pl-c1&quot;&gt;@&lt;/span&gt;&lt;span class=&quot;pl-c1&quot;&gt;KafkaListener&lt;/span&gt;(&lt;span class=&quot;pl-s1&quot;&gt;topics&lt;/span&gt; = &lt;span class=&quot;pl-s&quot;&gt;&quot;order.events.OrderPlacedEvent&quot;&lt;/span&gt;,
                   &lt;span class=&quot;pl-s1&quot;&gt;groupId&lt;/span&gt; = &lt;span class=&quot;pl-s&quot;&gt;&quot;inventory-service&quot;&lt;/span&gt;)
    &lt;span class=&quot;pl-k&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;pl-smi&quot;&gt;void&lt;/span&gt; &lt;span class=&quot;pl-en&quot;&gt;handle&lt;/span&gt;(&lt;span class=&quot;pl-smi&quot;&gt;OrderPlacedEvent&lt;/span&gt; &lt;span class=&quot;pl-s1&quot;&gt;event&lt;/span&gt;) {
        &lt;span class=&quot;pl-s1&quot;&gt;domainService&lt;/span&gt;.&lt;span class=&quot;pl-en&quot;&gt;reserveStock&lt;/span&gt;(&lt;span class=&quot;pl-s1&quot;&gt;event&lt;/span&gt;.&lt;span class=&quot;pl-en&quot;&gt;sku&lt;/span&gt;(), &lt;span class=&quot;pl-s1&quot;&gt;event&lt;/span&gt;.&lt;span class=&quot;pl-en&quot;&gt;quantity&lt;/span&gt;());
    }
}&lt;/span&gt;&lt;/pre&gt;&lt;div class=&quot;zeroclipboard-container&quot;&gt;
    
      
    

      
    
  &lt;/div&gt;&lt;/div&gt;
&lt;hr /&gt;
&lt;div class=&quot;markdown-heading&quot; dir=&quot;auto&quot;&gt;&lt;h1 class=&quot;heading-element&quot; style=&quot;text-align: left;&quot; tabindex=&quot;-1&quot;&gt;The Project Structure&lt;/h1&gt;&lt;a aria-label=&quot;Permalink: The Project Structure&quot; class=&quot;anchor&quot; href=&quot;https://github.com/gtiwari333/mono-micro-service/blob/main/docs/blog-dual-architecture.md#the-project-structure&quot; id=&quot;user-content-the-project-structure&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; class=&quot;octicon octicon-link&quot; data-component=&quot;Octicon&quot; height=&quot;16&quot; viewbox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p dir=&quot;auto&quot;&gt;Putting it together, the repo looks like this:&lt;/p&gt;
&lt;div class=&quot;snippet-clipboard-content notranslate position-relative overflow-auto&quot;&gt;&lt;pre class=&quot;notranslate&quot;&gt;&lt;code&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;mono-service/
├── common-api/              # Shared interfaces, DTOs, events, Feign clients
├── order-service/           # Own @SpringBootApplication, port 8081
├── inventory-service/       # Own @SpringBootApplication, port 8082
├── shipping-service/        # Own @SpringBootApplication, port 8083
├── monolith-app/            # Aggregator — depends on all three, port 8080
├── docker/                  # Dockerfile + docker-compose (both modes)
├── k8s/                     # Kubernetes manifests — monolith/ and microservices/
└── e2e/                     # Mode-agnostic test suite (29 assertions)
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div class=&quot;zeroclipboard-container&quot;&gt;
    
      
    

      
    
  &lt;/div&gt;&lt;/div&gt;
&lt;p dir=&quot;auto&quot;&gt;Each service is a standalone Spring Boot application, with its own &lt;code&gt;main&lt;/code&gt; method, its own configuration, and its own database migrations. &lt;code&gt;monolith-app&lt;/code&gt;
 is just a fourth application that bundles all three as Gradle 
dependencies, scans the unified package namespace, and excludes the 
Kafka- and Feign-related autoconfiguration it doesn&#39;t need.&lt;/p&gt;
&lt;div class=&quot;markdown-heading&quot; dir=&quot;auto&quot;&gt;&lt;h3 class=&quot;heading-element&quot; dir=&quot;auto&quot; tabindex=&quot;-1&quot;&gt;The Mode Switch in Configuration&lt;/h3&gt;&lt;a aria-label=&quot;Permalink: The Mode Switch in Configuration&quot; class=&quot;anchor&quot; href=&quot;https://github.com/gtiwari333/mono-micro-service/blob/main/docs/blog-dual-architecture.md#the-mode-switch-in-configuration&quot; id=&quot;user-content-the-mode-switch-in-configuration&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; class=&quot;octicon octicon-link&quot; data-component=&quot;Octicon&quot; height=&quot;16&quot; viewbox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p dir=&quot;auto&quot;&gt;&lt;b&gt;Monolith&lt;/b&gt; (&lt;code&gt;monolith-app/src/main/resources/application-monolith.yml&lt;/code&gt;):&lt;/p&gt;
&lt;div class=&quot;highlight highlight-source-yaml notranslate position-relative overflow-auto&quot; dir=&quot;auto&quot;&gt;&lt;pre&gt;&lt;span class=&quot;pl-ent&quot; style=&quot;font-size: x-small;&quot;&gt;deployment&lt;/span&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;:
  &lt;span class=&quot;pl-ent&quot;&gt;mode&lt;/span&gt;: &lt;span class=&quot;pl-s&quot;&gt;monolith&lt;/span&gt;

&lt;span class=&quot;pl-ent&quot;&gt;spring&lt;/span&gt;:
  &lt;span class=&quot;pl-ent&quot;&gt;autoconfigure&lt;/span&gt;:
    &lt;span class=&quot;pl-ent&quot;&gt;exclude&lt;/span&gt;:
      - &lt;span class=&quot;pl-s&quot;&gt;org.springframework.boot.autoconfigure.kafka.KafkaAutoConfiguration&lt;/span&gt;
      - &lt;span class=&quot;pl-s&quot;&gt;org.springframework.cloud.openfeign.FeignAutoConfiguration&lt;/span&gt;
  &lt;span class=&quot;pl-ent&quot;&gt;datasource&lt;/span&gt;:
    &lt;span class=&quot;pl-ent&quot;&gt;url&lt;/span&gt;: &lt;span class=&quot;pl-s&quot;&gt;jdbc:postgresql://localhost:5432/shop&lt;/span&gt;
  &lt;span class=&quot;pl-ent&quot;&gt;liquibase&lt;/span&gt;:
    &lt;span class=&quot;pl-ent&quot;&gt;enabled&lt;/span&gt;: &lt;span class=&quot;pl-s&quot;&gt;true          &lt;/span&gt;&lt;span class=&quot;pl-c&quot;&gt;&lt;span class=&quot;pl-c&quot;&gt;#&lt;/span&gt; One DB, three schemas&lt;/span&gt;
  &lt;span class=&quot;pl-ent&quot;&gt;flyway&lt;/span&gt;:
    &lt;span class=&quot;pl-ent&quot;&gt;enabled&lt;/span&gt;: &lt;span class=&quot;pl-c1&quot;&gt;false&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;div class=&quot;zeroclipboard-container&quot;&gt;
    
      
    

      
    
  &lt;/div&gt;&lt;/div&gt;
&lt;p dir=&quot;auto&quot;&gt;&lt;b&gt;Microservices&lt;/b&gt; (&lt;code&gt;order-service/src/main/resources/application.yml&lt;/code&gt;):&lt;/p&gt;
&lt;div class=&quot;highlight highlight-source-yaml notranslate position-relative overflow-auto&quot; dir=&quot;auto&quot;&gt;&lt;pre&gt;&lt;span class=&quot;pl-ent&quot; style=&quot;font-size: x-small;&quot;&gt;deployment&lt;/span&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;:
  &lt;span class=&quot;pl-ent&quot;&gt;mode&lt;/span&gt;: &lt;span class=&quot;pl-s&quot;&gt;microservices&lt;/span&gt;

&lt;span class=&quot;pl-ent&quot;&gt;spring&lt;/span&gt;:
  &lt;span class=&quot;pl-ent&quot;&gt;kafka&lt;/span&gt;:
    &lt;span class=&quot;pl-ent&quot;&gt;bootstrap-servers&lt;/span&gt;: &lt;span class=&quot;pl-s&quot;&gt;localhost:9092&lt;/span&gt;
  &lt;span class=&quot;pl-ent&quot;&gt;flyway&lt;/span&gt;:
    &lt;span class=&quot;pl-ent&quot;&gt;enabled&lt;/span&gt;: &lt;span class=&quot;pl-s&quot;&gt;true           &lt;/span&gt;&lt;span class=&quot;pl-c&quot;&gt;&lt;span class=&quot;pl-c&quot;&gt;#&lt;/span&gt; Per-service database&lt;/span&gt;

&lt;span class=&quot;pl-ent&quot;&gt;services&lt;/span&gt;:
  &lt;span class=&quot;pl-ent&quot;&gt;inventory&lt;/span&gt;:
    &lt;span class=&quot;pl-ent&quot;&gt;url&lt;/span&gt;: &lt;span class=&quot;pl-s&quot;&gt;http://inventory-service:8080&lt;/span&gt;
  &lt;span class=&quot;pl-ent&quot;&gt;shipping&lt;/span&gt;:
    &lt;span class=&quot;pl-ent&quot;&gt;url&lt;/span&gt;: &lt;span class=&quot;pl-s&quot;&gt;http://shipping-service:8080&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;div class=&quot;zeroclipboard-container&quot;&gt;
    
      
    

      
    
  &lt;/div&gt;&lt;/div&gt;
&lt;hr /&gt;
&lt;div class=&quot;markdown-heading&quot; dir=&quot;auto&quot;&gt;&lt;h1 class=&quot;heading-element&quot; style=&quot;text-align: left;&quot; tabindex=&quot;-1&quot;&gt;Database Strategy&lt;/h1&gt;&lt;a aria-label=&quot;Permalink: Database Strategy&quot; class=&quot;anchor&quot; href=&quot;https://github.com/gtiwari333/mono-micro-service/blob/main/docs/blog-dual-architecture.md#database-strategy&quot; id=&quot;user-content-database-strategy&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; class=&quot;octicon octicon-link&quot; data-component=&quot;Octicon&quot; height=&quot;16&quot; viewbox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p dir=&quot;auto&quot;&gt;This is where the pattern gets interesting — the dual architecture handles database evolution differently in each mode:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Aspect&lt;/th&gt;
&lt;th&gt;Monolith&lt;/th&gt;
&lt;th&gt;Microservices&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;Databases&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;One PostgreSQL (&lt;code&gt;shop&lt;/code&gt;)&lt;/td&gt;
&lt;td&gt;Three PostgreSQL (&lt;code&gt;orders&lt;/code&gt;, &lt;code&gt;inventory&lt;/code&gt;, &lt;code&gt;shipping&lt;/code&gt;)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;Schemas&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;Three schemas in one DB&lt;/td&gt;
&lt;td&gt;One schema per DB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;Migrations&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;Liquibase (runs all SQL in order)&lt;/td&gt;
&lt;td&gt;Flyway (per-service, independent)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;SQL files&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;Same files, different tool&lt;/td&gt;
&lt;td&gt;Same files, different tool&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;Cross-schema FKs&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;None — application-level integrity&lt;/td&gt;
&lt;td&gt;None — application-level integrity&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p dir=&quot;auto&quot;&gt;The SQL migration files are &lt;b&gt;authored once and consumed by both tools&lt;/b&gt;.
 Liquibase references them via a master changelog; Flyway picks them up 
natively from each service&#39;s classpath. This avoids the single worst 
failure mode of dual architectures: diverging schema definitions.&lt;/p&gt;
&lt;p dir=&quot;auto&quot;&gt;No cross-schema foreign keys means no mode-specific data 
integrity rules. If you wouldn&#39;t trust it across the network, don&#39;t 
trust it across schemas.&lt;/p&gt;
&lt;hr /&gt;
&lt;div class=&quot;markdown-heading&quot; dir=&quot;auto&quot;&gt;&lt;h1 class=&quot;heading-element&quot; style=&quot;text-align: left;&quot; tabindex=&quot;-1&quot;&gt;How Spring Modulith Compares&lt;/h1&gt;&lt;a aria-label=&quot;Permalink: How Spring Modulith Compares&quot; class=&quot;anchor&quot; href=&quot;https://github.com/gtiwari333/mono-micro-service/blob/main/docs/blog-dual-architecture.md#how-spring-modulith-compares&quot; id=&quot;user-content-how-spring-modulith-compares&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; class=&quot;octicon octicon-link&quot; data-component=&quot;Octicon&quot; height=&quot;16&quot; viewbox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p dir=&quot;auto&quot;&gt;If you&#39;re thinking &quot;this sounds like Spring Modulith,&quot; you&#39;re right — and the differences are instructive.&lt;/p&gt;
&lt;p dir=&quot;auto&quot;&gt;&lt;b&gt;Spring Modulith&lt;/b&gt; verifies and enforces module boundaries within a modular monolith. It gives you:&lt;/p&gt;
&lt;ul dir=&quot;auto&quot;&gt;&lt;li&gt;&lt;b&gt;Module structure verification&lt;/b&gt; — ArchUnit-style tests that catch illegal dependencies between modules at build time.&lt;/li&gt;&lt;li&gt;&lt;b&gt;Event publication&lt;/b&gt; — an &lt;code&gt;ApplicationModuleListener&lt;/code&gt; annotation that formalizes in-process event handling.&lt;/li&gt;&lt;li&gt;&lt;b&gt;Documentation&lt;/b&gt; — auto-generated diagrams of your module topology.&lt;/li&gt;&lt;li&gt;&lt;b&gt;Testing support&lt;/b&gt; — &lt;code&gt;ModuleTest&lt;/code&gt; for testing modules in isolation.&lt;/li&gt;&lt;/ul&gt;
&lt;p dir=&quot;auto&quot;&gt;What Modulith doesn&#39;t do is provide a config-driven switch
 between local method calls and remote HTTP calls — it assumes you&#39;re a 
monolith. If you later split out a module into its own service, you&#39;re 
rewriting the integration points: replacing direct calls with HTTP, 
adding circuit breakers, dealing with distributed transactions.&lt;/p&gt;
&lt;p dir=&quot;auto&quot;&gt;The dual-architecture pattern instead writes the integration point once (the &lt;code&gt;Client&lt;/code&gt;
 interface), implements both paths from the start, and lets a property 
choose. The cost is upfront: two implementations per interface, 
conditional beans, dual-tool database migrations. The payoff is that you
 never rewrite an integration.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;span style=&quot;font-size: small;&quot;&gt;Concern&lt;/span&gt;&lt;/th&gt;
&lt;th&gt;&lt;span style=&quot;font-size: small;&quot;&gt;Spring Modulith&lt;/span&gt;&lt;/th&gt;
&lt;th&gt;&lt;span style=&quot;font-size: small;&quot;&gt;Dual Architecture&lt;/span&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span style=&quot;font-size: small;&quot;&gt;&lt;b&gt;Module boundary enforcement&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;font-size: small;&quot;&gt;✅ Compile-time verification&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;font-size: small;&quot;&gt;⚠️ By convention only&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span style=&quot;font-size: small;&quot;&gt;&lt;b&gt;Deploy as monolith&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;font-size: small;&quot;&gt;✅ Natural&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;font-size: small;&quot;&gt;✅ Natural&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span style=&quot;font-size: small;&quot;&gt;&lt;b&gt;Deploy as microservices&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;font-size: small;&quot;&gt;❌ Requires rewrite of integrations&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;font-size: small;&quot;&gt;✅ Built-in, same artifact&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span style=&quot;font-size: small;&quot;&gt;&lt;b&gt;Event system&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;font-size: small;&quot;&gt;&lt;code&gt;@ApplicationModuleListener&lt;/code&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;font-size: small;&quot;&gt;Spring Events + Kafka (conditional)&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span style=&quot;font-size: small;&quot;&gt;&lt;b&gt;Database strategy&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;font-size: small;&quot;&gt;Single DB recommended&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;font-size: small;&quot;&gt;Single DB or separate DBs&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span style=&quot;font-size: small;&quot;&gt;&lt;b&gt;Learning curve&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;font-size: small;&quot;&gt;Low (annotations you already know)&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;font-size: small;&quot;&gt;Medium (more moving parts)&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span style=&quot;font-size: small;&quot;&gt;&lt;b&gt;Framework dependency&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;font-size: small;&quot;&gt;Heavy (spring-modulith-starter)&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;font-size: small;&quot;&gt;None (plain Spring Boot + Feign)&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span style=&quot;font-size: small;&quot;&gt;&lt;b&gt;Good for&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;font-size: small;&quot;&gt;Teams committed to monolith, wanting discipline&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;font-size: small;&quot;&gt;Teams that need both topologies from day one&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p dir=&quot;auto&quot;&gt;&lt;b&gt;Neither is &quot;better&quot;&lt;/b&gt; — they solve 
different problems. If you&#39;re sure you&#39;ll be a monolith forever, 
Modulith&#39;s compile-time verification and lighter footprint win. If you 
might split, or you sell to customers who need different topologies, the
 dual architecture prevents a rewrite.&lt;/p&gt;
&lt;hr /&gt;
&lt;div class=&quot;markdown-heading&quot; dir=&quot;auto&quot;&gt;&lt;h2 class=&quot;heading-element&quot; dir=&quot;auto&quot; tabindex=&quot;-1&quot;&gt;What Makes It Work (and What Doesn&#39;t)&lt;/h2&gt;&lt;a aria-label=&quot;Permalink: What Makes It Work (and What Doesn&#39;t)&quot; class=&quot;anchor&quot; href=&quot;https://github.com/gtiwari333/mono-micro-service/blob/main/docs/blog-dual-architecture.md#what-makes-it-work-and-what-doesnt&quot; id=&quot;user-content-what-makes-it-work-and-what-doesnt&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; class=&quot;octicon octicon-link&quot; data-component=&quot;Octicon&quot; height=&quot;16&quot; viewbox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div class=&quot;markdown-heading&quot; dir=&quot;auto&quot;&gt;&lt;h3 class=&quot;heading-element&quot; dir=&quot;auto&quot; tabindex=&quot;-1&quot;&gt;What works well&lt;/h3&gt;&lt;a aria-label=&quot;Permalink: What works well&quot; class=&quot;anchor&quot; href=&quot;https://github.com/gtiwari333/mono-micro-service/blob/main/docs/blog-dual-architecture.md#what-works-well&quot; id=&quot;user-content-what-works-well&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; class=&quot;octicon octicon-link&quot; data-component=&quot;Octicon&quot; height=&quot;16&quot; viewbox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/div&gt;
&lt;ol dir=&quot;auto&quot;&gt;&lt;li&gt;
&lt;p dir=&quot;auto&quot;&gt;&lt;b&gt;&lt;code&gt;@ConditionalOnProperty&lt;/code&gt; is the right abstraction level.&lt;/b&gt;
 You don&#39;t need a custom framework — a single property, standard Spring 
annotations, and a discipline of always pairing local and remote 
implementations is enough.&lt;/p&gt;
&lt;/li&gt;&lt;li&gt;
&lt;p dir=&quot;auto&quot;&gt;&lt;b&gt;Controllers implementing the Client interfaces catches drift at compile time.&lt;/b&gt; If &lt;code&gt;InventoryController&lt;/code&gt; implements &lt;code&gt;InventoryClient&lt;/code&gt;,
 the compiler guarantees the REST endpoint signatures match the Feign 
client&#39;s expectations. No more &quot;the URL changed but the client wasn&#39;t 
updated&quot; bugs.&lt;/p&gt;
&lt;/li&gt;&lt;li&gt;
&lt;p dir=&quot;auto&quot;&gt;&lt;b&gt;The same E2E tests run in both modes.&lt;/b&gt; The test suite (&lt;code&gt;run-tests.sh&lt;/code&gt;)
 is parameterized only by base URLs and asserts the same 29 behaviors 
against monolith and microservices deployments. If the tests pass in 
both modes, you haven&#39;t introduced a topology-dependent bug.&lt;/p&gt;
&lt;/li&gt;&lt;li&gt;
&lt;p dir=&quot;auto&quot;&gt;&lt;b&gt;The aggregator app is a separate module, not a profile.&lt;/b&gt; &lt;code&gt;monolith-app&lt;/code&gt;
 is its own Gradle module that depends on all three services — it 
doesn&#39;t reconfigure them internally. This means each service can still 
be built, tested, and deployed independently; the monolith is a consumer
 of services, not a special mode of each one.&lt;/p&gt;
&lt;/li&gt;&lt;/ol&gt;
&lt;div class=&quot;markdown-heading&quot; dir=&quot;auto&quot;&gt;&lt;h3 class=&quot;heading-element&quot; dir=&quot;auto&quot; tabindex=&quot;-1&quot;&gt;What&#39;s tricky&lt;/h3&gt;&lt;a aria-label=&quot;Permalink: What&#39;s tricky&quot; class=&quot;anchor&quot; href=&quot;https://github.com/gtiwari333/mono-micro-service/blob/main/docs/blog-dual-architecture.md#whats-tricky&quot; id=&quot;user-content-whats-tricky&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; class=&quot;octicon octicon-link&quot; data-component=&quot;Octicon&quot; height=&quot;16&quot; viewbox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/div&gt;
&lt;ol dir=&quot;auto&quot;&gt;&lt;li&gt;
&lt;p dir=&quot;auto&quot;&gt;&lt;b&gt;The Feign clients live in &lt;code&gt;common-api&lt;/code&gt;&lt;/b&gt;, which pulls &lt;code&gt;spring-cloud-starter-openfeign&lt;/code&gt;
 into every module — including ones that never make an HTTP call in 
monolith mode. You end up excluding it manually in the aggregator (as 
shown above). A cleaner alternative is to move the Feign interfaces into
 the &lt;i&gt;consumer&lt;/i&gt; module (e.g., &lt;code&gt;InventoryClientRemote&lt;/code&gt; inside &lt;code&gt;order-service&lt;/code&gt;), keeping &lt;code&gt;common-api&lt;/code&gt; free of network dependencies entirely.&lt;/p&gt;
&lt;/li&gt;&lt;li&gt;
&lt;p dir=&quot;auto&quot;&gt;&lt;b&gt;Event semantics differ silently between modes.&lt;/b&gt; In monolith mode, events are synchronous and transactional (&lt;code&gt;@TransactionalEventListener(AFTER_COMMIT)&lt;/code&gt;).
 In microservices mode, events are async and at-least-once (Kafka). Code
 that works in one mode can fail subtly in the other — duplicate 
processing, missing transactional rollback, reordering. The only real 
defense is &lt;b&gt;idempotency keys on every event&lt;/b&gt;, plus running the full test suite in both modes on every change.&lt;/p&gt;
&lt;/li&gt;&lt;li&gt;
&lt;p dir=&quot;auto&quot;&gt;&lt;b&gt;There&#39;s no compile-time module boundary check.&lt;/b&gt; Unlike Modulith, nothing stops &lt;code&gt;order-service&lt;/code&gt; from importing &lt;code&gt;inventory-service&lt;/code&gt;&#39;s entity classes directly and bypassing the &lt;code&gt;InventoryClient&lt;/code&gt; abstraction entirely. You need either discipline or an ArchUnit test that bans cross-module imports.&lt;/p&gt;
&lt;/li&gt;&lt;/ol&gt;
&lt;hr /&gt;
&lt;div class=&quot;highlight highlight-source-shell notranslate position-relative overflow-auto&quot; dir=&quot;auto&quot;&gt;&lt;pre&gt;&lt;span class=&quot;pl-c&quot; style=&quot;font-size: x-small;&quot;&gt;&lt;span class=&quot;pl-c&quot;&gt;#&lt;/span&gt; Clone and build&lt;/span&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;
./gradlew build -x &lt;span class=&quot;pl-c1&quot;&gt;test&lt;/span&gt;

&lt;span class=&quot;pl-c&quot;&gt;&lt;span class=&quot;pl-c&quot;&gt;#&lt;/span&gt; Run as monolith — all three services in one process&lt;/span&gt;
SPRING_PROFILES_ACTIVE=monolith ./gradlew :monolith-app:bootRun

&lt;span class=&quot;pl-c&quot;&gt;&lt;span class=&quot;pl-c&quot;&gt;#&lt;/span&gt; Or run as microservices — three independent processes&lt;/span&gt;
./gradlew :order-service:bootRun &lt;span class=&quot;pl-k&quot;&gt;&amp;amp;&lt;/span&gt;
./gradlew :inventory-service:bootRun &lt;span class=&quot;pl-k&quot;&gt;&amp;amp;&lt;/span&gt;
./gradlew :shipping-service:bootRun &lt;span class=&quot;pl-k&quot;&gt;&amp;amp;&lt;/span&gt;

&lt;span class=&quot;pl-c&quot;&gt;&lt;span class=&quot;pl-c&quot;&gt;#&lt;/span&gt; Same E2E tests, both modes&lt;/span&gt;
MODE=monolith BASE_URL=http://localhost:8080 ./e2e/run-tests.sh
MODE=microservices \
  ORDER_URL=http://localhost:8081 \
  INVENTORY_URL=http://localhost:8082 \
  SHIPPING_URL=http://localhost:8083 \
  ./e2e/run-tests.sh&lt;/span&gt;&lt;/pre&gt;&lt;div class=&quot;zeroclipboard-container&quot;&gt;
    
      
    

      
    
  &lt;/div&gt;&lt;/div&gt;
&lt;hr /&gt;
&lt;div class=&quot;markdown-heading&quot; dir=&quot;auto&quot;&gt;&lt;h2 class=&quot;heading-element&quot; dir=&quot;auto&quot; tabindex=&quot;-1&quot;&gt;Key Takeaways&lt;/h2&gt;&lt;a aria-label=&quot;Permalink: Key Takeaways&quot; class=&quot;anchor&quot; href=&quot;https://github.com/gtiwari333/mono-micro-service/blob/main/docs/blog-dual-architecture.md#key-takeaways&quot; id=&quot;user-content-key-takeaways&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; class=&quot;octicon octicon-link&quot; data-component=&quot;Octicon&quot; height=&quot;16&quot; viewbox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/div&gt;
&lt;ul dir=&quot;auto&quot;&gt;&lt;li&gt;&lt;b&gt;One codebase, two deployment topologies&lt;/b&gt; is a real, practical architecture — not an academic exercise.&lt;/li&gt;&lt;li&gt;&lt;b&gt;Three pillars&lt;/b&gt; make it work: shared &lt;code&gt;Client&lt;/code&gt; interfaces, conditionally-wired local/remote implementations, and dual-path event routing.&lt;/li&gt;&lt;li&gt;&lt;b&gt;Spring Modulith and this pattern solve different problems.&lt;/b&gt; Modulith enforces monolith discipline; the dual architecture enables topology switching.&lt;/li&gt;&lt;li&gt;&lt;b&gt;&lt;code&gt;@ConditionalOnProperty&lt;/code&gt;&lt;/b&gt; is simpler and more transparent than a custom framework for this.&lt;/li&gt;&lt;li&gt;&lt;b&gt;The biggest risk is mode-specific behavioral divergence&lt;/b&gt;
 — mitigate it with idempotency, identical E2E tests in both modes, and 
compile-time contract verification wherever you can get it.&lt;/li&gt;&lt;/ul&gt;
&lt;p dir=&quot;auto&quot;&gt;For teams selling the same product into both monolith and 
microservices customers, this pattern eliminates the most expensive 
decision in backend architecture: the one you have to make before you 
know the answer.&lt;/p&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.gtiwari333.com/feeds/7780081922484450582/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://blog.gtiwari333.com/2026/08/building-dual-mode-monolithmicroservice.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8219113377173546175/posts/default/7780081922484450582'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8219113377173546175/posts/default/7780081922484450582'/><link rel='alternate' type='text/html' href='http://blog.gtiwari333.com/2026/08/building-dual-mode-monolithmicroservice.html' title='Building a Dual-Mode Monolith/Microservices System with Spring Boot - One Codebase, Two Topologies'/><author><name>GT</name><uri>http://www.blogger.com/profile/16923656636145211711</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8219113377173546175.post-2534678765668413104</id><published>2025-03-11T01:05:00.001+00:00</published><updated>2025-03-11T01:05:11.449+00:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="java"/><category scheme="http://www.blogger.com/atom/ns#" term="spring-framework"/><title type='text'>Spring Boot - update response of every API using ResponseBodyAdvice</title><content type='html'>&lt;p&gt;Not sure why we need it but I&#39;ve seen several codebase where developers were wrapping the response body in some structure like below - where the actual content is put under an element eg: body and the root object has several other values.&lt;/p&gt;&lt;div style=&quot;background-color: #1e1f22; color: #bcbec4;&quot;&gt;&lt;pre style=&quot;font-family: &#39;JetBrains Mono&#39;,monospace; font-size: 9.8pt;&quot;&gt;{&lt;br /&gt;  &lt;span style=&quot;color: #c77dbb;&quot;&gt;&quot;body&quot;&lt;/span&gt;: { &lt;span style=&quot;color: #7a7e85;&quot;&gt;//the actual body&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #7a7e85;&quot;&gt;    &lt;/span&gt;&lt;span style=&quot;color: #c77dbb;&quot;&gt;&quot;greeting&quot;&lt;/span&gt;: &lt;span style=&quot;color: #6aab73;&quot;&gt;&quot;Hello World!&quot;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #6aab73;&quot;&gt;  &lt;/span&gt;},&lt;br /&gt;&lt;br /&gt;  &lt;span style=&quot;color: #7a7e85;&quot;&gt;//additional elements&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #7a7e85;&quot;&gt;  &lt;/span&gt;&lt;span style=&quot;color: #c77dbb;&quot;&gt;&quot;timestamp&quot;&lt;/span&gt;: &lt;span style=&quot;color: #2aacb8;&quot;&gt;1741653577468&lt;/span&gt;,&lt;br /&gt;  &lt;span style=&quot;color: #c77dbb;&quot;&gt;&quot;traceId&quot;&lt;/span&gt;: &lt;span style=&quot;color: #6aab73;&quot;&gt;&quot;67cf8649f3c848a71d8171473d3b4955&quot;&lt;/span&gt;,&lt;br /&gt;  &lt;span style=&quot;color: #c77dbb;&quot;&gt;&quot;spanId&quot;&lt;/span&gt;: &lt;span style=&quot;color: #6aab73;&quot;&gt;&quot;1d8171473d3b4955&quot;&lt;/span&gt;,&lt;br /&gt;  &lt;span style=&quot;color: #c77dbb;&quot;&gt;&quot;durationMs&quot;&lt;/span&gt;: &lt;span style=&quot;color: #2aacb8;&quot;&gt;0&lt;/span&gt;,&lt;br /&gt;  &lt;span style=&quot;color: #c77dbb;&quot;&gt;&quot;status&quot;&lt;/span&gt;: &lt;span style=&quot;color: #2aacb8;&quot;&gt;200&lt;br /&gt;&lt;/span&gt;} &lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The corresponding controller method would look something like below where they would explicitly create the ResponseObject and map other parameters in every single endpoint definition:&lt;/p&gt;&lt;div style=&quot;background-color: #1e1f22; color: #bcbec4;&quot;&gt;&lt;pre style=&quot;font-family: &#39;JetBrains Mono&#39;,monospace; font-size: 9.8pt;&quot;&gt;&lt;span style=&quot;color: #b3ae60;&quot;&gt;@GetMapping&lt;/span&gt;(&lt;span style=&quot;color: #6aab73;&quot;&gt;&quot;/object-bad-way/hi&quot;&lt;/span&gt;)&lt;br /&gt;&lt;span style=&quot;color: #cf8e6d;&quot;&gt;public &lt;/span&gt;ResponseObject&amp;lt;Hi&amp;gt; &lt;span style=&quot;color: #56a8f5;&quot;&gt;oldWayHi&lt;/span&gt;() {&lt;br /&gt;    &lt;span style=&quot;color: #c77dbb; font-style: italic;&quot;&gt;log&lt;/span&gt;.info(&lt;span style=&quot;color: #6aab73;&quot;&gt;&quot;Got request -  object - old way - don&#39;t do this, use ResponseBodyAdvice&quot;&lt;/span&gt;);&lt;br /&gt;    &lt;span style=&quot;color: #cf8e6d;&quot;&gt;var &lt;/span&gt;resp = &lt;span style=&quot;color: #cf8e6d;&quot;&gt;new &lt;/span&gt;ResponseObject&amp;lt;Hi&amp;gt;();&lt;br /&gt;    &lt;span style=&quot;color: #cf8e6d;&quot;&gt;var &lt;/span&gt;span = &lt;span style=&quot;color: #c77dbb;&quot;&gt;tracer&lt;/span&gt;.currentSpan();&lt;br /&gt;    &lt;span style=&quot;color: #cf8e6d;&quot;&gt;if &lt;/span&gt;(span != &lt;span style=&quot;color: #cf8e6d;&quot;&gt;null&lt;/span&gt;) {&lt;br /&gt;        resp.setTraceId(span.context().traceId());&lt;br /&gt;        resp.setSpanId(span.context().spanId());&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    resp.setTimestamp(System.&lt;span style=&quot;font-style: italic;&quot;&gt;currentTimeMillis&lt;/span&gt;());&lt;br /&gt;    &lt;span style=&quot;color: #cf8e6d;&quot;&gt;try &lt;/span&gt;{&lt;br /&gt;        resp.setBody(myService.getHi()); &lt;span style=&quot;color: #7a7e85;&quot;&gt;//service call&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #7a7e85;&quot;&gt;        &lt;/span&gt;resp.setStatus(HttpStatus.&lt;span style=&quot;color: #c77dbb; font-style: italic;&quot;&gt;OK&lt;/span&gt;.value());&lt;br /&gt;    } &lt;span style=&quot;color: #cf8e6d;&quot;&gt;catch &lt;/span&gt;(Exception e) {&lt;br /&gt;        resp.setStatus(HttpStatus.&lt;span style=&quot;color: #c77dbb; font-style: italic;&quot;&gt;INTERNAL_SERVER_ERROR&lt;/span&gt;.value());&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    &lt;span style=&quot;color: #cf8e6d;&quot;&gt;return &lt;/span&gt;resp;&lt;br /&gt;}&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The ResponseObject:&lt;/p&gt;&lt;div style=&quot;background-color: #1e1f22; color: #bcbec4;&quot;&gt;&lt;pre style=&quot;font-family: &#39;JetBrains Mono&#39;,monospace; font-size: 9.8pt;&quot;&gt;&lt;span style=&quot;color: #b3ae60;&quot;&gt;@Getter&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #b3ae60;&quot;&gt;@Setter&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cf8e6d;&quot;&gt;class &lt;/span&gt;ResponseObject&amp;lt;&lt;span style=&quot;color: #16baac;&quot;&gt;T&lt;/span&gt;&amp;gt; {&lt;br /&gt;    &lt;span style=&quot;color: #16baac;&quot;&gt;T &lt;/span&gt;&lt;span style=&quot;color: #c77dbb;&quot;&gt;body&lt;/span&gt;;&lt;br /&gt;    &lt;span style=&quot;color: #cf8e6d;&quot;&gt;long &lt;/span&gt;&lt;span style=&quot;color: #c77dbb;&quot;&gt;timestamp&lt;/span&gt;;&lt;br /&gt;&lt;br /&gt;    String &lt;span style=&quot;color: #c77dbb;&quot;&gt;traceId&lt;/span&gt;;&lt;br /&gt;    String &lt;span style=&quot;color: #c77dbb;&quot;&gt;spanId&lt;/span&gt;;&lt;br /&gt;&lt;br /&gt;    &lt;span style=&quot;color: #cf8e6d;&quot;&gt;long &lt;/span&gt;&lt;span style=&quot;color: #c77dbb;&quot;&gt;durationMs&lt;/span&gt;;&lt;br /&gt;    &lt;span style=&quot;color: #cf8e6d;&quot;&gt;int &lt;/span&gt;&lt;span style=&quot;color: #c77dbb;&quot;&gt;status&lt;/span&gt;;&lt;br /&gt;}&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;But wait, there&#39;s a better way to do this if you really want this. The idea is to use Spring&#39;s @ControllerAdvice that implements ResponseBodyAdvice to map the additional params so that you don&#39;t need to create the new ResponseObject instance on all endpoints.&lt;/p&gt;&lt;p&gt;After the change, your controller method would look simple as below: wouldn&#39;t that be nice?&lt;/p&gt;&lt;div style=&quot;background-color: #1e1f22; color: #bcbec4;&quot;&gt;&lt;pre style=&quot;font-family: &#39;JetBrains Mono&#39;,monospace; font-size: 9.8pt;&quot;&gt;&lt;span style=&quot;color: #b3ae60;&quot;&gt;@GetMapping&lt;/span&gt;(&lt;span style=&quot;color: #6aab73;&quot;&gt;&quot;/better-way/hi&quot;&lt;/span&gt;)&lt;br /&gt;&lt;span style=&quot;color: #cf8e6d;&quot;&gt;public &lt;/span&gt;Hi &lt;span style=&quot;color: #56a8f5;&quot;&gt;objectHi&lt;/span&gt;() {&lt;br /&gt;    &lt;span style=&quot;color: #c77dbb; font-style: italic;&quot;&gt;log&lt;/span&gt;.info(&lt;span style=&quot;color: #6aab73;&quot;&gt;&quot;Got request -  object&quot;&lt;/span&gt;);&lt;br /&gt;    &lt;span style=&quot;color: #cf8e6d;&quot;&gt;return &lt;/span&gt;service.getHi();&lt;br /&gt;}&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;ResponseBodyAdvice&lt;/p&gt;&lt;p&gt;From the docs: &lt;br /&gt;&lt;/p&gt;&lt;p&gt;ResponseBodyAdvice allows customizing the response after the execution of an @ResponseBody or a ResponseEntity controller method but before the body is written with an HttpMessageConverter.&lt;br /&gt;Implementations may be registered directly with RequestMappingHandlerAdapter and ExceptionHandlerExceptionResolver or more likely annotated with @ControllerAdvice in which case they will be auto-detected by both. &lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;A simple (empty) usage would look like this. On the supports method, we can decide if the response body needs to be modified. The beforeBodyWrite is where we can modify the request body or create new.&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;div style=&quot;background-color: #1e1f22; color: #bcbec4;&quot;&gt;&lt;pre style=&quot;font-family: &#39;JetBrains Mono&#39;,monospace; font-size: 9.8pt;&quot;&gt;&lt;span style=&quot;color: #b3ae60;&quot;&gt;@ControllerAdvice&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cf8e6d;&quot;&gt;class &lt;/span&gt;ObjectResponseAdvice &lt;span style=&quot;color: #cf8e6d;&quot;&gt;implements &lt;/span&gt;ResponseBodyAdvice&amp;lt;Object&amp;gt; {&lt;br /&gt;&lt;br /&gt;    &lt;span style=&quot;color: #7a7e85;&quot;&gt;//Whether this component supports the given controller method return type and the selected HttpMessageConverter type.&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #7a7e85;&quot;&gt;    &lt;/span&gt;&lt;span style=&quot;color: #cf8e6d;&quot;&gt;public boolean &lt;/span&gt;&lt;span style=&quot;color: #56a8f5;&quot;&gt;supports&lt;/span&gt;(MethodParameter returnType, Class&amp;lt;? &lt;span style=&quot;color: #cf8e6d;&quot;&gt;extends &lt;/span&gt;HttpMessageConverter&amp;lt;?&amp;gt;&amp;gt; converterType) {&lt;br /&gt;        &lt;span style=&quot;color: #cf8e6d;&quot;&gt;return true&lt;/span&gt;;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    &lt;span style=&quot;color: #7a7e85;&quot;&gt;//Invoked after an HttpMessageConverter is selected and just before its write method is invoked.&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #7a7e85;&quot;&gt;    &lt;/span&gt;&lt;span style=&quot;color: #cf8e6d;&quot;&gt;public &lt;/span&gt;Object &lt;span style=&quot;color: #56a8f5;&quot;&gt;beforeBodyWrite&lt;/span&gt;(Object body, MethodParameter returnType,&lt;br /&gt;                                  MediaType selectedContentType, Class&amp;lt;? &lt;span style=&quot;color: #cf8e6d;&quot;&gt;extends &lt;/span&gt;HttpMessageConverter&amp;lt;?&amp;gt;&amp;gt; selectedConverterType, ServerHttpRequest request, ServerHttpResponse response) {&lt;br /&gt;        &lt;span style=&quot;color: #7a7e85;&quot;&gt;//modify body&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #7a7e85;&quot;&gt;        &lt;/span&gt;&lt;span style=&quot;color: #cf8e6d;&quot;&gt;return &lt;/span&gt;body;&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;A simple implementation of beforeBodyWrite that would work with both String response type and any other response type. Here we are handling the String response specially by checking if the original body(response body) is String. Otherwise, we are creating a ObjectNode and mapping timestamp and body elements under it.&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;div style=&quot;background-color: #1e1f22; color: #bcbec4;&quot;&gt;&lt;pre style=&quot;font-family: &#39;JetBrains Mono&#39;,monospace; font-size: 9.8pt;&quot;&gt;supports() method: &lt;br /&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/span&gt;return true;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;beforeBodyWrit() method:&lt;/pre&gt;&lt;div style=&quot;background-color: #1e1f22; color: #bcbec4;&quot;&gt;&lt;div style=&quot;background-color: #1e1f22; color: #bcbec4;&quot;&gt;&lt;pre style=&quot;font-family: &#39;JetBrains Mono&#39;,monospace; font-size: 9.8pt;&quot;&gt;  ObjectNode root = &lt;span style=&quot;color: #c77dbb;&quot;&gt;objectMapper&lt;/span&gt;.createObjectNode();&lt;br /&gt;  root.put(&lt;span style=&quot;color: #6aab73;&quot;&gt;&quot;timestamp&quot;&lt;/span&gt;, System.&lt;span style=&quot;font-style: italic;&quot;&gt;currentTimeMillis&lt;/span&gt;());&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: #cf8e6d;&quot;&gt;  if &lt;/span&gt;(body &lt;span style=&quot;color: #cf8e6d;&quot;&gt;instanceof &lt;/span&gt;String) {&lt;br /&gt;    root.set(&lt;span style=&quot;color: #6aab73;&quot;&gt;&quot;body&quot;&lt;/span&gt;, &lt;span style=&quot;color: #c77dbb;&quot;&gt;objectMapper&lt;/span&gt;.convertValue(body, JsonNode.&lt;span style=&quot;color: #cf8e6d;&quot;&gt;class&lt;/span&gt;));&lt;br /&gt;    &lt;span style=&quot;color: #cf8e6d;&quot;&gt;return &lt;/span&gt;&lt;span style=&quot;color: #c77dbb;&quot;&gt;objectMapper&lt;/span&gt;.writeValueAsString(root);&lt;br /&gt;  } &lt;span style=&quot;color: #cf8e6d;&quot;&gt;else &lt;/span&gt;{&lt;br /&gt;    root.put(&lt;span style=&quot;color: #6aab73;&quot;&gt;&quot;body&quot;&lt;/span&gt;, String.&lt;span style=&quot;font-style: italic;&quot;&gt;valueOf&lt;/span&gt;(body));&lt;br /&gt;    &lt;span style=&quot;color: #cf8e6d;&quot;&gt;return &lt;/span&gt;root;&lt;br /&gt;  }&lt;/pre&gt;&lt;/div&gt;&lt;pre style=&quot;font-family: &#39;JetBrains Mono&#39;,monospace; font-size: 9.8pt;&quot;&gt;&lt;/pre&gt;&lt;/div&gt;&lt;pre style=&quot;font-family: &#39;JetBrains Mono&#39;,monospace; font-size: 9.8pt;&quot;&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;Handle more stuff and map more stuff:&lt;/p&gt;&lt;p&gt;Here we are mapping the traceId/spanId from Micrometer Tracing , mapping &#39;status&#39; from ServletServerHttpResponse. Also for backward compatibility with existing RestController methods that already return ResponseObject (with all elements we want on the response), we are skipping the additional mapping and simply returning body.&lt;/p&gt;&lt;div style=&quot;background-color: #1e1f22; color: #bcbec4;&quot;&gt;&lt;pre style=&quot;font-family: &#39;JetBrains Mono&#39;,monospace; font-size: 9.8pt;&quot;&gt;&lt;span style=&quot;color: #cf8e6d;&quot;&gt;if &lt;/span&gt;(response &lt;span style=&quot;color: #cf8e6d;&quot;&gt;instanceof &lt;/span&gt;ServletServerHttpResponse resp&lt;br /&gt;        &lt;span style=&quot;color: #7a7e85;&quot;&gt;//if body is already ResponseObject  - do not convert&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #7a7e85;&quot;&gt;        &lt;/span&gt;&amp;amp;&amp;amp; !(body &lt;span style=&quot;color: #cf8e6d;&quot;&gt;instanceof &lt;/span&gt;ResponseObject)) {&lt;br /&gt;&lt;br /&gt;    ObjectNode root = &lt;span style=&quot;color: #c77dbb;&quot;&gt;objectMapper&lt;/span&gt;.createObjectNode();&lt;br /&gt;    &lt;span style=&quot;color: #cf8e6d;&quot;&gt;var &lt;/span&gt;span = &lt;span style=&quot;color: #c77dbb;&quot;&gt;tracer&lt;/span&gt;.currentSpan();&lt;br /&gt;    &lt;span style=&quot;color: #cf8e6d;&quot;&gt;if &lt;/span&gt;(span != &lt;span style=&quot;color: #cf8e6d;&quot;&gt;null&lt;/span&gt;) {&lt;br /&gt;        root.put(&lt;span style=&quot;color: #6aab73;&quot;&gt;&quot;traceId&quot;&lt;/span&gt;, span.context().traceId());&lt;br /&gt;        root.put(&lt;span style=&quot;color: #6aab73;&quot;&gt;&quot;spanId&quot;&lt;/span&gt;, span.context().spanId());&lt;br /&gt;    }&lt;br /&gt;    root.put(&lt;span style=&quot;color: #6aab73;&quot;&gt;&quot;status&quot;&lt;/span&gt;, resp.getServletResponse().getStatus());&lt;br /&gt;    &lt;span style=&quot;color: #cf8e6d;&quot;&gt;if &lt;/span&gt;(BeanUtils.&lt;span style=&quot;font-style: italic;&quot;&gt;isSimpleValueType&lt;/span&gt;(body.getClass())) {&lt;br /&gt;        root.put(&lt;span style=&quot;color: #6aab73;&quot;&gt;&quot;body&quot;&lt;/span&gt;, String.&lt;span style=&quot;font-style: italic;&quot;&gt;valueOf&lt;/span&gt;(body));&lt;br /&gt;    } &lt;span style=&quot;color: #cf8e6d;&quot;&gt;else &lt;/span&gt;{&lt;br /&gt;        root.set(&lt;span style=&quot;color: #6aab73;&quot;&gt;&quot;body&quot;&lt;/span&gt;, &lt;span style=&quot;color: #c77dbb;&quot;&gt;objectMapper&lt;/span&gt;.convertValue(body, JsonNode.&lt;span style=&quot;color: #cf8e6d;&quot;&gt;class&lt;/span&gt;));&lt;br /&gt;    }&lt;br /&gt;    root.put(&lt;span style=&quot;color: #6aab73;&quot;&gt;&quot;timestamp&quot;&lt;/span&gt;, System.&lt;span style=&quot;font-style: italic;&quot;&gt;currentTimeMillis&lt;/span&gt;());&lt;br /&gt;&lt;br /&gt;    &lt;span style=&quot;color: #cf8e6d;&quot;&gt;if &lt;/span&gt;(body &lt;span style=&quot;color: #cf8e6d;&quot;&gt;instanceof &lt;/span&gt;String) {&lt;br /&gt;        &lt;span style=&quot;color: #7a7e85;&quot;&gt;// String are handled special case with StringHttpMessageConverter&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #7a7e85;&quot;&gt;        // we need to return String from this method&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #7a7e85;&quot;&gt;        &lt;/span&gt;&lt;span style=&quot;color: #cf8e6d;&quot;&gt;return &lt;/span&gt;&lt;span style=&quot;color: #c77dbb;&quot;&gt;objectMapper&lt;/span&gt;.writeValueAsString(root);&lt;br /&gt;    } &lt;span style=&quot;color: #cf8e6d;&quot;&gt;else &lt;/span&gt;{&lt;br /&gt;        &lt;span style=&quot;color: #cf8e6d;&quot;&gt;return &lt;/span&gt;root;&lt;br /&gt;    }&lt;br /&gt;}&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;Full code in action: Note that it supports, string type, int type, map, and any object response.&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;Test it out with following endpoints:&lt;/p&gt;&lt;div style=&quot;background-color: #1e1f22; color: #bcbec4;&quot;&gt;&lt;pre style=&quot;font-family: &#39;JetBrains Mono&#39;,monospace; font-size: 9.8pt;&quot;&gt;&lt;span style=&quot;color: #7a7e85;&quot;&gt;###&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cf8e6d;&quot;&gt;GET &lt;/span&gt;http://localhost:8080/string&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: #7a7e85;&quot;&gt;###&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cf8e6d;&quot;&gt;GET &lt;/span&gt;http://localhost:8080/map&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: #7a7e85;&quot;&gt;###&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cf8e6d;&quot;&gt;GET &lt;/span&gt;http://localhost:8080/object/hi&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: #7a7e85;&quot;&gt;###&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cf8e6d;&quot;&gt;GET &lt;/span&gt;http://localhost:8080/object/hello&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: #7a7e85;&quot;&gt;###&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cf8e6d;&quot;&gt;GET &lt;/span&gt;http://localhost:8080/object-bad-way/hi&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: #7a7e85;&quot;&gt;###&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cf8e6d;&quot;&gt;GET &lt;/span&gt;http://localhost:8080/object-bad-way/hello&lt;br /&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&amp;nbsp;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;Full Code:&lt;/p&gt;&lt;div style=&quot;background-color: #1e1f22; color: #bcbec4;&quot;&gt;&lt;pre style=&quot;font-family: &#39;JetBrains Mono&#39;,monospace; font-size: 9.8pt;&quot;&gt;&lt;span style=&quot;color: #cf8e6d;&quot;&gt;package &lt;/span&gt;responsebody;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: #cf8e6d;&quot;&gt;import &lt;/span&gt;com.fasterxml.jackson.databind.*;&lt;br /&gt;&lt;span style=&quot;color: #cf8e6d;&quot;&gt;import &lt;/span&gt;com.fasterxml.jackson.databind.node.ObjectNode;&lt;br /&gt;&lt;span style=&quot;color: #cf8e6d;&quot;&gt;import &lt;/span&gt;io.micrometer.tracing.Tracer;&lt;br /&gt;&lt;span style=&quot;color: #cf8e6d;&quot;&gt;import &lt;/span&gt;lombok.*;&lt;br /&gt;&lt;span style=&quot;color: #cf8e6d;&quot;&gt;import &lt;/span&gt;lombok.extern.slf4j.&lt;span style=&quot;color: #b3ae60;&quot;&gt;Slf4j&lt;/span&gt;;&lt;br /&gt;&lt;span style=&quot;color: #cf8e6d;&quot;&gt;import &lt;/span&gt;org.springframework.beans.BeanUtils;&lt;br /&gt;&lt;span style=&quot;color: #cf8e6d;&quot;&gt;import &lt;/span&gt;org.springframework.boot.SpringApplication;&lt;br /&gt;&lt;span style=&quot;color: #cf8e6d;&quot;&gt;import &lt;/span&gt;org.springframework.boot.autoconfigure.&lt;span style=&quot;color: #b3ae60;&quot;&gt;SpringBootApplication&lt;/span&gt;;&lt;br /&gt;&lt;span style=&quot;color: #cf8e6d;&quot;&gt;import &lt;/span&gt;org.springframework.core.MethodParameter;&lt;br /&gt;&lt;span style=&quot;color: #cf8e6d;&quot;&gt;import &lt;/span&gt;org.springframework.http.*;&lt;br /&gt;&lt;span style=&quot;color: #cf8e6d;&quot;&gt;import &lt;/span&gt;org.springframework.http.converter.HttpMessageConverter;&lt;br /&gt;&lt;span style=&quot;color: #cf8e6d;&quot;&gt;import &lt;/span&gt;org.springframework.http.server.*;&lt;br /&gt;&lt;span style=&quot;color: #cf8e6d;&quot;&gt;import &lt;/span&gt;org.springframework.web.bind.annotation.*;&lt;br /&gt;&lt;span style=&quot;color: #cf8e6d;&quot;&gt;import &lt;/span&gt;org.springframework.web.servlet.mvc.method.annotation.ResponseBodyAdvice;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: #cf8e6d;&quot;&gt;import &lt;/span&gt;java.net.*;&lt;br /&gt;&lt;span style=&quot;color: #cf8e6d;&quot;&gt;import &lt;/span&gt;java.util.Map;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: #b3ae60;&quot;&gt;@SpringBootApplication&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cf8e6d;&quot;&gt;public class &lt;/span&gt;DemoApplication {&lt;br /&gt;&lt;br /&gt;    &lt;span style=&quot;color: #cf8e6d;&quot;&gt;public static void &lt;/span&gt;&lt;span style=&quot;color: #56a8f5;&quot;&gt;main&lt;/span&gt;(String[] args) {&lt;br /&gt;        SpringApplication.&lt;span style=&quot;font-style: italic;&quot;&gt;run&lt;/span&gt;(DemoApplication.&lt;span style=&quot;color: #cf8e6d;&quot;&gt;class&lt;/span&gt;, args);&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: #b3ae60;&quot;&gt;@RestController&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #b3ae60;&quot;&gt;@Slf4j&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #b3ae60;&quot;&gt;@RequiredArgsConstructor&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cf8e6d;&quot;&gt;class &lt;/span&gt;GreetingController {&lt;br /&gt;&lt;br /&gt;    &lt;span style=&quot;color: #cf8e6d;&quot;&gt;final &lt;/span&gt;Tracer &lt;span style=&quot;color: #c77dbb;&quot;&gt;tracer&lt;/span&gt;;&lt;br /&gt;&lt;br /&gt;    &lt;span style=&quot;color: #b3ae60;&quot;&gt;@GetMapping&lt;/span&gt;(&lt;span style=&quot;color: #6aab73;&quot;&gt;&quot;/string&quot;&lt;/span&gt;)&lt;br /&gt;    &lt;span style=&quot;color: #cf8e6d;&quot;&gt;public &lt;/span&gt;String &lt;span style=&quot;color: #56a8f5;&quot;&gt;string&lt;/span&gt;() {&lt;br /&gt;        &lt;span style=&quot;color: #c77dbb; font-style: italic;&quot;&gt;log&lt;/span&gt;.info(&lt;span style=&quot;color: #6aab73;&quot;&gt;&quot;Got request - string&quot;&lt;/span&gt;);&lt;br /&gt;        &lt;span style=&quot;color: #cf8e6d;&quot;&gt;return &lt;/span&gt;&lt;span style=&quot;color: #6aab73;&quot;&gt;&quot;Hello World!&quot;&lt;/span&gt;;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    &lt;span style=&quot;color: #b3ae60;&quot;&gt;@GetMapping&lt;/span&gt;(&lt;span style=&quot;color: #6aab73;&quot;&gt;&quot;/int&quot;&lt;/span&gt;)&lt;br /&gt;    &lt;span style=&quot;color: #cf8e6d;&quot;&gt;public int &lt;/span&gt;&lt;span style=&quot;color: #56a8f5;&quot;&gt;intVal&lt;/span&gt;() {&lt;br /&gt;        &lt;span style=&quot;color: #c77dbb; font-style: italic;&quot;&gt;log&lt;/span&gt;.info(&lt;span style=&quot;color: #6aab73;&quot;&gt;&quot;Got request - int&quot;&lt;/span&gt;);&lt;br /&gt;        &lt;span style=&quot;color: #cf8e6d;&quot;&gt;return &lt;/span&gt;&lt;span style=&quot;color: #2aacb8;&quot;&gt;1&lt;/span&gt;;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    &lt;span style=&quot;color: #b3ae60;&quot;&gt;@GetMapping&lt;/span&gt;(&lt;span style=&quot;color: #6aab73;&quot;&gt;&quot;/url&quot;&lt;/span&gt;)&lt;br /&gt;    &lt;span style=&quot;color: #cf8e6d;&quot;&gt;public &lt;/span&gt;URL &lt;span style=&quot;color: #56a8f5;&quot;&gt;url&lt;/span&gt;() &lt;span style=&quot;color: #cf8e6d;&quot;&gt;throws &lt;/span&gt;MalformedURLException {&lt;br /&gt;        &lt;span style=&quot;color: #c77dbb; font-style: italic;&quot;&gt;log&lt;/span&gt;.info(&lt;span style=&quot;color: #6aab73;&quot;&gt;&quot;Got request - url&quot;&lt;/span&gt;);&lt;br /&gt;        &lt;span style=&quot;color: #cf8e6d;&quot;&gt;return &lt;/span&gt;URI.&lt;span style=&quot;font-style: italic;&quot;&gt;create&lt;/span&gt;(&lt;span style=&quot;color: #6aab73;&quot;&gt;&quot;https://localhost:8080/&quot;&lt;/span&gt;).toURL();&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    &lt;span style=&quot;color: #b3ae60;&quot;&gt;@GetMapping&lt;/span&gt;(&lt;span style=&quot;color: #6aab73;&quot;&gt;&quot;/map&quot;&lt;/span&gt;)&lt;br /&gt;    &lt;span style=&quot;color: #cf8e6d;&quot;&gt;public &lt;/span&gt;Map&amp;lt;String, String&amp;gt; &lt;span style=&quot;color: #56a8f5;&quot;&gt;map&lt;/span&gt;() {&lt;br /&gt;        &lt;span style=&quot;color: #c77dbb; font-style: italic;&quot;&gt;log&lt;/span&gt;.info(&lt;span style=&quot;color: #6aab73;&quot;&gt;&quot;Got request - map&quot;&lt;/span&gt;);&lt;br /&gt;        &lt;span style=&quot;color: #cf8e6d;&quot;&gt;return &lt;/span&gt;Map.&lt;span style=&quot;font-style: italic;&quot;&gt;of&lt;/span&gt;(&lt;span style=&quot;color: #6aab73;&quot;&gt;&quot;greeting&quot;&lt;/span&gt;, &lt;span style=&quot;color: #6aab73;&quot;&gt;&quot;Hello World!&quot;&lt;/span&gt;);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    &lt;span style=&quot;color: #b3ae60;&quot;&gt;@GetMapping&lt;/span&gt;(&lt;span style=&quot;color: #6aab73;&quot;&gt;&quot;/object/hello&quot;&lt;/span&gt;)&lt;br /&gt;    &lt;span style=&quot;color: #cf8e6d;&quot;&gt;public &lt;/span&gt;Hello &lt;span style=&quot;color: #56a8f5;&quot;&gt;objectHello&lt;/span&gt;() {&lt;br /&gt;        &lt;span style=&quot;color: #c77dbb; font-style: italic;&quot;&gt;log&lt;/span&gt;.info(&lt;span style=&quot;color: #6aab73;&quot;&gt;&quot;Got request -  object&quot;&lt;/span&gt;);&lt;br /&gt;        &lt;span style=&quot;color: #cf8e6d;&quot;&gt;return new &lt;/span&gt;Hello(&lt;span style=&quot;color: #6aab73;&quot;&gt;&quot;Hello World!&quot;&lt;/span&gt;);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    &lt;span style=&quot;color: #b3ae60;&quot;&gt;@GetMapping&lt;/span&gt;(&lt;span style=&quot;color: #6aab73;&quot;&gt;&quot;/better-way/hi&quot;&lt;/span&gt;)&lt;br /&gt;    &lt;span style=&quot;color: #cf8e6d;&quot;&gt;public &lt;/span&gt;Hi &lt;span style=&quot;color: #56a8f5;&quot;&gt;objectHi&lt;/span&gt;() {&lt;br /&gt;        &lt;span style=&quot;color: #c77dbb; font-style: italic;&quot;&gt;log&lt;/span&gt;.info(&lt;span style=&quot;color: #6aab73;&quot;&gt;&quot;Got request -  object&quot;&lt;/span&gt;);&lt;br /&gt;        &lt;span style=&quot;color: #cf8e6d;&quot;&gt;return new &lt;/span&gt;Hi(&lt;span style=&quot;color: #6aab73;&quot;&gt;&quot;Hi World!&quot;&lt;/span&gt;);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    &lt;span style=&quot;color: #b3ae60;&quot;&gt;@GetMapping&lt;/span&gt;(&lt;span style=&quot;color: #6aab73;&quot;&gt;&quot;/object-bad-way/hello&quot;&lt;/span&gt;)&lt;br /&gt;    &lt;span style=&quot;color: #cf8e6d;&quot;&gt;public &lt;/span&gt;ResponseObject&amp;lt;Hello&amp;gt; &lt;span style=&quot;color: #56a8f5;&quot;&gt;oldWay&lt;/span&gt;() {&lt;br /&gt;        &lt;span style=&quot;color: #c77dbb; font-style: italic;&quot;&gt;log&lt;/span&gt;.info(&lt;span style=&quot;color: #6aab73;&quot;&gt;&quot;Got request -  object - old way - don&#39;t do this, use ResponseBodyAdvice&quot;&lt;/span&gt;);&lt;br /&gt;        &lt;span style=&quot;color: #cf8e6d;&quot;&gt;var &lt;/span&gt;resp = &lt;span style=&quot;color: #cf8e6d;&quot;&gt;new &lt;/span&gt;ResponseObject&amp;lt;Hello&amp;gt;();&lt;br /&gt;        &lt;span style=&quot;color: #cf8e6d;&quot;&gt;var &lt;/span&gt;span = &lt;span style=&quot;color: #c77dbb;&quot;&gt;tracer&lt;/span&gt;.currentSpan();&lt;br /&gt;        &lt;span style=&quot;color: #cf8e6d;&quot;&gt;if &lt;/span&gt;(span != &lt;span style=&quot;color: #cf8e6d;&quot;&gt;null&lt;/span&gt;) {&lt;br /&gt;            resp.setTraceId(span.context().traceId());&lt;br /&gt;            resp.setSpanId(span.context().spanId());&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        resp.setTimestamp(System.&lt;span style=&quot;font-style: italic;&quot;&gt;currentTimeMillis&lt;/span&gt;());&lt;br /&gt;        &lt;span style=&quot;color: #cf8e6d;&quot;&gt;try &lt;/span&gt;{&lt;br /&gt;            resp.setBody(&lt;span style=&quot;color: #cf8e6d;&quot;&gt;new &lt;/span&gt;Hello(&lt;span style=&quot;color: #6aab73;&quot;&gt;&quot;Hello World!&quot;&lt;/span&gt;)); &lt;span style=&quot;color: #7a7e85;&quot;&gt;//service call&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #7a7e85;&quot;&gt;            &lt;/span&gt;resp.setStatus(HttpStatus.&lt;span style=&quot;color: #c77dbb; font-style: italic;&quot;&gt;OK&lt;/span&gt;.value());&lt;br /&gt;        } &lt;span style=&quot;color: #cf8e6d;&quot;&gt;catch &lt;/span&gt;(Exception e) {&lt;br /&gt;            resp.setStatus(HttpStatus.&lt;span style=&quot;color: #c77dbb; font-style: italic;&quot;&gt;INTERNAL_SERVER_ERROR&lt;/span&gt;.value());&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        &lt;span style=&quot;color: #cf8e6d;&quot;&gt;return &lt;/span&gt;resp;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    &lt;span style=&quot;color: #b3ae60;&quot;&gt;@GetMapping&lt;/span&gt;(&lt;span style=&quot;color: #6aab73;&quot;&gt;&quot;/object-bad-way/hi&quot;&lt;/span&gt;)&lt;br /&gt;    &lt;span style=&quot;color: #cf8e6d;&quot;&gt;public &lt;/span&gt;ResponseObject&amp;lt;Hi&amp;gt; &lt;span style=&quot;color: #56a8f5;&quot;&gt;oldWayHi&lt;/span&gt;() {&lt;br /&gt;        &lt;span style=&quot;color: #c77dbb; font-style: italic;&quot;&gt;log&lt;/span&gt;.info(&lt;span style=&quot;color: #6aab73;&quot;&gt;&quot;Got request -  object - old way - don&#39;t do this, use ResponseBodyAdvice&quot;&lt;/span&gt;);&lt;br /&gt;        &lt;span style=&quot;color: #cf8e6d;&quot;&gt;var &lt;/span&gt;resp = &lt;span style=&quot;color: #cf8e6d;&quot;&gt;new &lt;/span&gt;ResponseObject&amp;lt;Hi&amp;gt;();&lt;br /&gt;        &lt;span style=&quot;color: #cf8e6d;&quot;&gt;var &lt;/span&gt;span = &lt;span style=&quot;color: #c77dbb;&quot;&gt;tracer&lt;/span&gt;.currentSpan();&lt;br /&gt;        &lt;span style=&quot;color: #cf8e6d;&quot;&gt;if &lt;/span&gt;(span != &lt;span style=&quot;color: #cf8e6d;&quot;&gt;null&lt;/span&gt;) {&lt;br /&gt;            resp.setTraceId(span.context().traceId());&lt;br /&gt;            resp.setSpanId(span.context().spanId());&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        resp.setTimestamp(System.&lt;span style=&quot;font-style: italic;&quot;&gt;currentTimeMillis&lt;/span&gt;());&lt;br /&gt;        &lt;span style=&quot;color: #cf8e6d;&quot;&gt;try &lt;/span&gt;{&lt;br /&gt;            resp.setBody(&lt;span style=&quot;color: #cf8e6d;&quot;&gt;new &lt;/span&gt;Hi(&lt;span style=&quot;color: #6aab73;&quot;&gt;&quot;Hello World!&quot;&lt;/span&gt;)); &lt;span style=&quot;color: #7a7e85;&quot;&gt;//service call&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #7a7e85;&quot;&gt;            &lt;/span&gt;resp.setStatus(HttpStatus.&lt;span style=&quot;color: #c77dbb; font-style: italic;&quot;&gt;OK&lt;/span&gt;.value());&lt;br /&gt;        } &lt;span style=&quot;color: #cf8e6d;&quot;&gt;catch &lt;/span&gt;(Exception e) {&lt;br /&gt;            resp.setStatus(HttpStatus.&lt;span style=&quot;color: #c77dbb; font-style: italic;&quot;&gt;INTERNAL_SERVER_ERROR&lt;/span&gt;.value());&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        &lt;span style=&quot;color: #cf8e6d;&quot;&gt;return &lt;/span&gt;resp;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: #b3ae60;&quot;&gt;@Slf4j&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #b3ae60;&quot;&gt;@ControllerAdvice&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #b3ae60;&quot;&gt;@RequiredArgsConstructor&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cf8e6d;&quot;&gt;class &lt;/span&gt;ObjectResponseAdvice &lt;span style=&quot;color: #cf8e6d;&quot;&gt;implements &lt;/span&gt;ResponseBodyAdvice&amp;lt;Object&amp;gt; {&lt;br /&gt;&lt;br /&gt;    &lt;span style=&quot;color: #cf8e6d;&quot;&gt;final &lt;/span&gt;Tracer &lt;span style=&quot;color: #c77dbb;&quot;&gt;tracer&lt;/span&gt;;&lt;br /&gt;    &lt;span style=&quot;color: #cf8e6d;&quot;&gt;final &lt;/span&gt;ObjectMapper &lt;span style=&quot;color: #c77dbb;&quot;&gt;objectMapper&lt;/span&gt;;&lt;br /&gt;&lt;br /&gt;    &lt;span style=&quot;color: #b3ae60;&quot;&gt;@Override&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #b3ae60;&quot;&gt;    &lt;/span&gt;&lt;span style=&quot;color: #cf8e6d;&quot;&gt;public boolean &lt;/span&gt;&lt;span style=&quot;color: #56a8f5;&quot;&gt;supports&lt;/span&gt;(MethodParameter returnType, Class&amp;lt;? &lt;span style=&quot;color: #cf8e6d;&quot;&gt;extends &lt;/span&gt;HttpMessageConverter&amp;lt;?&amp;gt;&amp;gt; converterType) {&lt;br /&gt;        &lt;span style=&quot;color: #cf8e6d;&quot;&gt;return true&lt;/span&gt;;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    &lt;span style=&quot;color: #b3ae60;&quot;&gt;@SneakyThrows&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #b3ae60;&quot;&gt;    @Override&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #b3ae60;&quot;&gt;    &lt;/span&gt;&lt;span style=&quot;color: #cf8e6d;&quot;&gt;public &lt;/span&gt;Object &lt;span style=&quot;color: #56a8f5;&quot;&gt;beforeBodyWrite&lt;/span&gt;(Object body, MethodParameter returnType,&lt;br /&gt;                                  MediaType selectedContentType, Class&amp;lt;? &lt;span style=&quot;color: #cf8e6d;&quot;&gt;extends &lt;/span&gt;HttpMessageConverter&amp;lt;?&amp;gt;&amp;gt; selectedConverterType, ServerHttpRequest request, ServerHttpResponse response) {&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;        &lt;span style=&quot;color: #cf8e6d;&quot;&gt;if &lt;/span&gt;(response &lt;span style=&quot;color: #cf8e6d;&quot;&gt;instanceof &lt;/span&gt;ServletServerHttpResponse resp&lt;br /&gt;                &lt;span style=&quot;color: #7a7e85;&quot;&gt;//if body is already ResponseObject  - do not convert&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #7a7e85;&quot;&gt;                &lt;/span&gt;&amp;amp;&amp;amp; !(body &lt;span style=&quot;color: #cf8e6d;&quot;&gt;instanceof &lt;/span&gt;ResponseObject)) {&lt;br /&gt;&lt;br /&gt;            ObjectNode root = &lt;span style=&quot;color: #c77dbb;&quot;&gt;objectMapper&lt;/span&gt;.createObjectNode();&lt;br /&gt;            &lt;span style=&quot;color: #cf8e6d;&quot;&gt;var &lt;/span&gt;span = &lt;span style=&quot;color: #c77dbb;&quot;&gt;tracer&lt;/span&gt;.currentSpan();&lt;br /&gt;            &lt;span style=&quot;color: #cf8e6d;&quot;&gt;if &lt;/span&gt;(span != &lt;span style=&quot;color: #cf8e6d;&quot;&gt;null&lt;/span&gt;) {&lt;br /&gt;                root.put(&lt;span style=&quot;color: #6aab73;&quot;&gt;&quot;traceId&quot;&lt;/span&gt;, span.context().traceId());&lt;br /&gt;                root.put(&lt;span style=&quot;color: #6aab73;&quot;&gt;&quot;spanId&quot;&lt;/span&gt;, span.context().spanId());&lt;br /&gt;            }&lt;br /&gt;            root.put(&lt;span style=&quot;color: #6aab73;&quot;&gt;&quot;status&quot;&lt;/span&gt;, resp.getServletResponse().getStatus());&lt;br /&gt;            &lt;span style=&quot;color: #cf8e6d;&quot;&gt;if &lt;/span&gt;(BeanUtils.&lt;span style=&quot;font-style: italic;&quot;&gt;isSimpleValueType&lt;/span&gt;(body.getClass())) {&lt;br /&gt;                root.put(&lt;span style=&quot;color: #6aab73;&quot;&gt;&quot;body&quot;&lt;/span&gt;, String.&lt;span style=&quot;font-style: italic;&quot;&gt;valueOf&lt;/span&gt;(body));&lt;br /&gt;            } &lt;span style=&quot;color: #cf8e6d;&quot;&gt;else &lt;/span&gt;{&lt;br /&gt;                root.set(&lt;span style=&quot;color: #6aab73;&quot;&gt;&quot;body&quot;&lt;/span&gt;, &lt;span style=&quot;color: #c77dbb;&quot;&gt;objectMapper&lt;/span&gt;.convertValue(body, JsonNode.&lt;span style=&quot;color: #cf8e6d;&quot;&gt;class&lt;/span&gt;));&lt;br /&gt;            }&lt;br /&gt;            root.put(&lt;span style=&quot;color: #6aab73;&quot;&gt;&quot;timestamp&quot;&lt;/span&gt;, System.&lt;span style=&quot;font-style: italic;&quot;&gt;currentTimeMillis&lt;/span&gt;());&lt;br /&gt;&lt;br /&gt;            &lt;span style=&quot;color: #cf8e6d;&quot;&gt;if &lt;/span&gt;(body &lt;span style=&quot;color: #cf8e6d;&quot;&gt;instanceof &lt;/span&gt;String) {&lt;br /&gt;                &lt;span style=&quot;color: #7a7e85;&quot;&gt;// String are handled special case with StringHttpMessageConverter&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #7a7e85;&quot;&gt;                // we need to return String from this method&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #7a7e85;&quot;&gt;                &lt;/span&gt;&lt;span style=&quot;color: #cf8e6d;&quot;&gt;return &lt;/span&gt;&lt;span style=&quot;color: #c77dbb;&quot;&gt;objectMapper&lt;/span&gt;.writeValueAsString(root);&lt;br /&gt;            } &lt;span style=&quot;color: #cf8e6d;&quot;&gt;else &lt;/span&gt;{&lt;br /&gt;                &lt;span style=&quot;color: #cf8e6d;&quot;&gt;return &lt;/span&gt;root;&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        &lt;span style=&quot;color: #cf8e6d;&quot;&gt;return &lt;/span&gt;body;&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: #b3ae60;&quot;&gt;@Getter&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #b3ae60;&quot;&gt;@NoArgsConstructor&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #b3ae60;&quot;&gt;@AllArgsConstructor&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cf8e6d;&quot;&gt;class &lt;/span&gt;Hello {&lt;br /&gt;    String &lt;span style=&quot;color: #c77dbb;&quot;&gt;greeting&lt;/span&gt;;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: #b3ae60;&quot;&gt;@Getter&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #b3ae60;&quot;&gt;@NoArgsConstructor&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #b3ae60;&quot;&gt;@AllArgsConstructor&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cf8e6d;&quot;&gt;class &lt;/span&gt;Hi {&lt;br /&gt;    String &lt;span style=&quot;color: #c77dbb;&quot;&gt;hi&lt;/span&gt;;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: #b3ae60;&quot;&gt;@Getter&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #b3ae60;&quot;&gt;@Setter&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cf8e6d;&quot;&gt;class &lt;/span&gt;ResponseObject&amp;lt;&lt;span style=&quot;color: #16baac;&quot;&gt;T&lt;/span&gt;&amp;gt; {&lt;br /&gt;    &lt;span style=&quot;color: #16baac;&quot;&gt;T &lt;/span&gt;&lt;span style=&quot;color: #c77dbb;&quot;&gt;body&lt;/span&gt;;&lt;br /&gt;    &lt;span style=&quot;color: #cf8e6d;&quot;&gt;long &lt;/span&gt;&lt;span style=&quot;color: #c77dbb;&quot;&gt;timestamp&lt;/span&gt;;&lt;br /&gt;&lt;br /&gt;    String &lt;span style=&quot;color: #c77dbb;&quot;&gt;traceId&lt;/span&gt;;&lt;br /&gt;    String &lt;span style=&quot;color: #c77dbb;&quot;&gt;spanId&lt;/span&gt;;&lt;br /&gt;&lt;br /&gt;    &lt;span style=&quot;color: #cf8e6d;&quot;&gt;long &lt;/span&gt;&lt;span style=&quot;color: #c77dbb;&quot;&gt;durationMs&lt;/span&gt;;&lt;br /&gt;    &lt;span style=&quot;color: #cf8e6d;&quot;&gt;int &lt;/span&gt;&lt;span style=&quot;color: #c77dbb;&quot;&gt;status&lt;/span&gt;;&lt;br /&gt;}&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.gtiwari333.com/feeds/2534678765668413104/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://blog.gtiwari333.com/2025/03/spring-boot-update-response-of-every.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8219113377173546175/posts/default/2534678765668413104'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8219113377173546175/posts/default/2534678765668413104'/><link rel='alternate' type='text/html' href='http://blog.gtiwari333.com/2025/03/spring-boot-update-response-of-every.html' title='Spring Boot - update response of every API using ResponseBodyAdvice'/><author><name>GT</name><uri>http://www.blogger.com/profile/16923656636145211711</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8219113377173546175.post-3150175874341079785</id><published>2025-02-27T17:44:00.004+00:00</published><updated>2025-02-27T17:44:48.419+00:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="java"/><category scheme="http://www.blogger.com/atom/ns#" term="spring-framework"/><title type='text'>Run a task in a different interval during weekend using Spring Scheduler and Custom Trigger</title><content type='html'>&lt;p&gt;Run a task in a different interval during weekend.&lt;/p&gt;&lt;p&gt;Instead of defining fixed interval to run a task every 1 minute (as shown in example below) using @Scheduled, we can customize Spring Task Scheduler to schedule job with a custom trigger to run the tasks in different schedule depending on business logic.&amp;nbsp;&lt;/p&gt;&lt;div style=&quot;background-color: #1e1f22; color: #bcbec4;&quot;&gt;&lt;pre style=&quot;font-family: &#39;JetBrains Mono&#39;,monospace; font-size: 9.8pt;&quot;&gt;&lt;span style=&quot;color: #b3ae60;&quot;&gt;@Scheduled&lt;/span&gt;(fixedRate = &lt;span style=&quot;color: #2aacb8;&quot;&gt;1&lt;/span&gt;, timeUnit = TimeUnit.&lt;span style=&quot;color: #c77dbb; font-style: italic;&quot;&gt;MINUTES&lt;/span&gt;)&lt;br /&gt;&lt;span style=&quot;color: #cf8e6d;&quot;&gt;void &lt;/span&gt;&lt;span style=&quot;color: #56a8f5;&quot;&gt;job1&lt;/span&gt;() {&lt;br /&gt;     System.&lt;span style=&quot;color: #c77dbb; font-style: italic;&quot;&gt;out&lt;/span&gt;.println(&lt;span style=&quot;color: #6aab73;&quot;&gt;&quot;Running job1 - this won&#39;t run on weekend&quot;&lt;/span&gt;);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;For example, we can do the following to run the task every 15 minute instead of 1 minute during weekends. Here we are registering a task job1 with TaskScheduler with a CustomTrigger.&lt;/p&gt;&lt;p&gt;The CustomTrigger implements Spring&#39;s Trigger interface and overrides nextExecution() method to do business logic to find the interval on which the task should run. For the example purpose we are running tasks less often (every 15 minute) during weekend.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;div style=&quot;background-color: #1e1f22; color: #bcbec4;&quot;&gt;&lt;pre style=&quot;font-family: &#39;JetBrains Mono&#39;,monospace; font-size: 9.8pt;&quot;&gt;DayOfWeek &lt;span style=&quot;color: #38a2a2;&quot;&gt;day &lt;/span&gt;= LocalDate.&lt;span style=&quot;font-style: italic;&quot;&gt;now&lt;/span&gt;(ZoneId.&lt;span style=&quot;font-style: italic;&quot;&gt;of&lt;/span&gt;(ZoneId.&lt;span style=&quot;color: #c77dbb; font-style: italic;&quot;&gt;SHORT_IDS&lt;/span&gt;.get(&lt;span style=&quot;color: #6aab73;&quot;&gt;&quot;CST&quot;&lt;/span&gt;))).getDayOfWeek();&lt;br /&gt;Duration &lt;span style=&quot;color: #38a2a2;&quot;&gt;nextSchedulePeriod &lt;/span&gt;= &lt;span style=&quot;color: #c77dbb; font-style: italic;&quot;&gt;WORKDAY_INTERVAL&lt;/span&gt;;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: #7a7e85;&quot;&gt;/*&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #7a7e85;&quot;&gt; * Run the task every 15 minute often during weekend&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #7a7e85;&quot;&gt; */&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #7a7e85;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cf8e6d;&quot;&gt;if &lt;/span&gt;(&lt;span style=&quot;color: #38a2a2;&quot;&gt;day &lt;/span&gt;== DayOfWeek.&lt;span style=&quot;color: #c77dbb; font-style: italic;&quot;&gt;SATURDAY &lt;/span&gt;|| &lt;span style=&quot;color: #38a2a2;&quot;&gt;day &lt;/span&gt;== DayOfWeek.&lt;span style=&quot;color: #c77dbb; font-style: italic;&quot;&gt;SUNDAY&lt;/span&gt;) {&lt;br /&gt;     &lt;span style=&quot;color: #38a2a2;&quot;&gt;nextSchedulePeriod &lt;/span&gt;= &lt;span style=&quot;color: #c77dbb; font-style: italic;&quot;&gt;WEEKEND_INTERVAL&lt;/span&gt;;&lt;br /&gt;}&lt;br /&gt;&lt;span style=&quot;color: #cf8e6d;&quot;&gt;return new &lt;/span&gt;PeriodicTrigger(&lt;span style=&quot;color: #38a2a2;&quot;&gt;nextSchedulePeriod&lt;/span&gt;).nextExecution(&lt;span style=&quot;color: #8396ca;&quot;&gt;ctx&lt;/span&gt;);&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;div style=&quot;background-color: #1e1f22; color: #bcbec4;&quot;&gt;&lt;pre style=&quot;font-family: &#39;JetBrains Mono&#39;,monospace; font-size: 9.8pt;&quot;&gt;&lt;br /&gt;&lt;span style=&quot;color: #cf8e6d;&quot;&gt;import &lt;/span&gt;org.springframework.beans.factory.InitializingBean;&lt;br /&gt;&lt;span style=&quot;color: #cf8e6d;&quot;&gt;import &lt;/span&gt;org.springframework.beans.factory.annotation.&lt;span style=&quot;color: #b3ae60;&quot;&gt;Autowired&lt;/span&gt;;&lt;br /&gt;&lt;span style=&quot;color: #cf8e6d;&quot;&gt;import &lt;/span&gt;org.springframework.context.annotation.&lt;span style=&quot;color: #b3ae60;&quot;&gt;Configuration&lt;/span&gt;;&lt;br /&gt;&lt;span style=&quot;color: #cf8e6d;&quot;&gt;import &lt;/span&gt;org.springframework.scheduling.TaskScheduler;&lt;br /&gt;&lt;span style=&quot;color: #cf8e6d;&quot;&gt;import &lt;/span&gt;org.springframework.scheduling.Trigger;&lt;br /&gt;&lt;span style=&quot;color: #cf8e6d;&quot;&gt;import &lt;/span&gt;org.springframework.scheduling.TriggerContext;&lt;br /&gt;&lt;span style=&quot;color: #cf8e6d;&quot;&gt;import &lt;/span&gt;org.springframework.scheduling.support.PeriodicTrigger;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: #cf8e6d;&quot;&gt;import &lt;/span&gt;java.time.DayOfWeek;&lt;br /&gt;&lt;span style=&quot;color: #cf8e6d;&quot;&gt;import &lt;/span&gt;java.time.Duration;&lt;br /&gt;&lt;span style=&quot;color: #cf8e6d;&quot;&gt;import &lt;/span&gt;java.time.Instant;&lt;br /&gt;&lt;span style=&quot;color: #cf8e6d;&quot;&gt;import &lt;/span&gt;java.time.LocalDate;&lt;br /&gt;&lt;span style=&quot;color: #cf8e6d;&quot;&gt;import &lt;/span&gt;java.time.ZoneId;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: #b3ae60;&quot;&gt;@Configuration&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cf8e6d;&quot;&gt;class &lt;/span&gt;CustomTaskScheduler &lt;span style=&quot;color: #cf8e6d;&quot;&gt;implements &lt;/span&gt;InitializingBean {&lt;br /&gt;&lt;br /&gt;     &lt;span style=&quot;color: #cf8e6d;&quot;&gt;static final &lt;/span&gt;Duration &lt;span style=&quot;color: #c77dbb; font-style: italic;&quot;&gt;WORKDAY_INTERVAL &lt;/span&gt;= Duration.&lt;span style=&quot;font-style: italic;&quot;&gt;ofMinutes&lt;/span&gt;(&lt;span style=&quot;color: #2aacb8;&quot;&gt;1&lt;/span&gt;);&lt;br /&gt;     &lt;span style=&quot;color: #cf8e6d;&quot;&gt;static final &lt;/span&gt;Duration &lt;span style=&quot;color: #c77dbb; font-style: italic;&quot;&gt;WEEKEND_INTERVAL &lt;/span&gt;= Duration.&lt;span style=&quot;font-style: italic;&quot;&gt;ofMinutes&lt;/span&gt;(&lt;span style=&quot;color: #2aacb8;&quot;&gt;15&lt;/span&gt;);&lt;br /&gt;&lt;br /&gt;     &lt;span style=&quot;color: #b3ae60;&quot;&gt;@Autowired&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #b3ae60;&quot;&gt;     &lt;/span&gt;TaskScheduler &lt;span style=&quot;color: #c77dbb;&quot;&gt;taskScheduler&lt;/span&gt;;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     &lt;span style=&quot;color: #b3ae60;&quot;&gt;@Override&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #b3ae60;&quot;&gt;     &lt;/span&gt;&lt;span style=&quot;color: #cf8e6d;&quot;&gt;public void &lt;/span&gt;&lt;span style=&quot;color: #56a8f5;&quot;&gt;afterPropertiesSet&lt;/span&gt;() {&lt;br /&gt;          &lt;span style=&quot;color: #c77dbb;&quot;&gt;taskScheduler&lt;/span&gt;.schedule(&lt;span style=&quot;color: #cf8e6d;&quot;&gt;this&lt;/span&gt;::job1, &lt;span style=&quot;color: #cf8e6d;&quot;&gt;new &lt;/span&gt;CustomTrigger());&lt;br /&gt;          &lt;span style=&quot;color: #7a7e85;&quot;&gt;// schedule more tasks&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #7a7e85;&quot;&gt;     &lt;/span&gt;}&lt;br /&gt;&lt;br /&gt;     &lt;span style=&quot;color: #cf8e6d;&quot;&gt;void &lt;/span&gt;&lt;span style=&quot;color: #56a8f5;&quot;&gt;job1&lt;/span&gt;() {&lt;br /&gt;          System.&lt;span style=&quot;color: #c77dbb; font-style: italic;&quot;&gt;out&lt;/span&gt;.println(&lt;span style=&quot;color: #6aab73;&quot;&gt;&quot;Running job1 - this won&#39;t run on weekend&quot;&lt;/span&gt;);&lt;br /&gt;     }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     &lt;span style=&quot;color: #cf8e6d;&quot;&gt;static class &lt;/span&gt;CustomTrigger &lt;span style=&quot;color: #cf8e6d;&quot;&gt;implements &lt;/span&gt;Trigger {&lt;br /&gt;          &lt;span style=&quot;color: #7bd09c; font-style: italic;&quot;&gt;/**&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #7bd09c; font-style: italic;&quot;&gt;           * Determine the next execution time according to the given trigger context.&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #7bd09c; font-style: italic;&quot;&gt;           */&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #7bd09c; font-style: italic;&quot;&gt;          &lt;/span&gt;&lt;span style=&quot;color: #b3ae60;&quot;&gt;@Override&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #b3ae60;&quot;&gt;          &lt;/span&gt;&lt;span style=&quot;color: #cf8e6d;&quot;&gt;public &lt;/span&gt;Instant &lt;span style=&quot;color: #56a8f5;&quot;&gt;nextExecution&lt;/span&gt;(TriggerContext &lt;span style=&quot;color: #8396ca;&quot;&gt;ctx&lt;/span&gt;) {&lt;br /&gt;               DayOfWeek &lt;span style=&quot;color: #38a2a2;&quot;&gt;day &lt;/span&gt;= LocalDate.&lt;span style=&quot;font-style: italic;&quot;&gt;now&lt;/span&gt;(ZoneId.&lt;span style=&quot;font-style: italic;&quot;&gt;of&lt;/span&gt;(ZoneId.&lt;span style=&quot;color: #c77dbb; font-style: italic;&quot;&gt;SHORT_IDS&lt;/span&gt;.get(&lt;span style=&quot;color: #6aab73;&quot;&gt;&quot;CST&quot;&lt;/span&gt;))).getDayOfWeek();&lt;br /&gt;               Duration &lt;span style=&quot;color: #38a2a2;&quot;&gt;nextSchedulePeriod &lt;/span&gt;= &lt;span style=&quot;color: #c77dbb; font-style: italic;&quot;&gt;WORKDAY_INTERVAL&lt;/span&gt;;&lt;br /&gt;&lt;br /&gt;               &lt;span style=&quot;color: #7a7e85;&quot;&gt;/*&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #7a7e85;&quot;&gt;                * Run the task every 15 minute often during weekend&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #7a7e85;&quot;&gt;                */&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #7a7e85;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #7a7e85;&quot;&gt;               &lt;/span&gt;&lt;span style=&quot;color: #cf8e6d;&quot;&gt;if &lt;/span&gt;(&lt;span style=&quot;color: #38a2a2;&quot;&gt;day &lt;/span&gt;== DayOfWeek.&lt;span style=&quot;color: #c77dbb; font-style: italic;&quot;&gt;SATURDAY &lt;/span&gt;|| &lt;span style=&quot;color: #38a2a2;&quot;&gt;day &lt;/span&gt;== DayOfWeek.&lt;span style=&quot;color: #c77dbb; font-style: italic;&quot;&gt;SUNDAY&lt;/span&gt;) {&lt;br /&gt;                    &lt;span style=&quot;color: #38a2a2;&quot;&gt;nextSchedulePeriod &lt;/span&gt;= &lt;span style=&quot;color: #c77dbb; font-style: italic;&quot;&gt;WEEKEND_INTERVAL&lt;/span&gt;;&lt;br /&gt;               }&lt;br /&gt;               &lt;span style=&quot;color: #cf8e6d;&quot;&gt;return new &lt;/span&gt;PeriodicTrigger(&lt;span style=&quot;color: #38a2a2;&quot;&gt;nextSchedulePeriod&lt;/span&gt;).nextExecution(&lt;span style=&quot;color: #8396ca;&quot;&gt;ctx&lt;/span&gt;);&lt;br /&gt;          }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     }&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.gtiwari333.com/feeds/3150175874341079785/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://blog.gtiwari333.com/2025/02/run-task-in-different-interval-during.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8219113377173546175/posts/default/3150175874341079785'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8219113377173546175/posts/default/3150175874341079785'/><link rel='alternate' type='text/html' href='http://blog.gtiwari333.com/2025/02/run-task-in-different-interval-during.html' title='Run a task in a different interval during weekend using Spring Scheduler and Custom Trigger'/><author><name>GT</name><uri>http://www.blogger.com/profile/16923656636145211711</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8219113377173546175.post-9153640949145801244</id><published>2025-02-27T17:15:00.000+00:00</published><updated>2026-07-18T14:48:30.207+01:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="java"/><title type='text'>Append a file into existing ZIP using Java</title><content type='html'>&lt;p&gt;Need to modify a text file inside a ZIP without extracting the whole archive to disk? In this post, I’m going to show you how to do exactly that with a pure‑Java approach. The snippet opens &lt;code&gt;in.zip&lt;/code&gt;, streams through its entries, and for the one named &lt;code&gt;abc.txt&lt;/code&gt; it reads the content, replaces &lt;code&gt;key1=value1&lt;/code&gt; with &lt;code&gt;key1=val2&lt;/code&gt;, appends a timestamp, and writes the updated bytes. Every other entry is copied byte‑for‑byte unchanged into a fresh &lt;code&gt;out.zip&lt;/code&gt;. The logic relies on &lt;code&gt;java.util.zip.ZipFile&lt;/code&gt; for reading and &lt;code&gt;ZipOutputStream&lt;/code&gt; for writing, completely avoiding temporary files. I’ve also included a small helper &lt;code&gt;isToString&lt;/code&gt; that converts an &lt;code&gt;InputStream&lt;/code&gt; to a &lt;code&gt;String&lt;/code&gt; via a &lt;code&gt;ByteArrayOutputStream&lt;/code&gt;. One thing to keep in mind: the current implementation loads the file’s entire content into memory, so it’s perfect for small text files. If you’re dealing with larger data, a line‑by‑line streaming variant would be safer. Just drop this code into a &lt;code&gt;ZipTests&lt;/code&gt; class, place &lt;code&gt;in.zip&lt;/code&gt; next to it, and run it — you’ll get &lt;code&gt;out.zip&lt;/code&gt; with your modifications ready to use.&lt;/p&gt;&lt;br /&gt;&lt;div style=&quot;background-color: #1e1f22; color: #bcbec4;&quot;&gt;&lt;pre style=&quot;font-family: &#39;JetBrains Mono&#39;,monospace; font-size: 9.8pt;&quot;&gt;&lt;span style=&quot;color: #cf8e6d;&quot;&gt;import &lt;/span&gt;java.io.ByteArrayOutputStream;&lt;br /&gt;&lt;span style=&quot;color: #cf8e6d;&quot;&gt;import &lt;/span&gt;java.io.FileOutputStream;&lt;br /&gt;&lt;span style=&quot;color: #cf8e6d;&quot;&gt;import &lt;/span&gt;java.io.InputStream;&lt;br /&gt;&lt;span style=&quot;color: #cf8e6d;&quot;&gt;import &lt;/span&gt;java.nio.charset.StandardCharsets;&lt;br /&gt;&lt;span style=&quot;color: #cf8e6d;&quot;&gt;import &lt;/span&gt;java.time.LocalDateTime;&lt;br /&gt;&lt;span style=&quot;color: #cf8e6d;&quot;&gt;import &lt;/span&gt;java.util.zip.ZipOutputStream;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: #cf8e6d;&quot;&gt;public class &lt;/span&gt;ZipTests {&lt;br /&gt;&lt;br /&gt;    &lt;span style=&quot;color: #cf8e6d;&quot;&gt;public static void &lt;/span&gt;&lt;span style=&quot;color: #56a8f5;&quot;&gt;main&lt;/span&gt;(String[] &lt;span style=&quot;color: #8396ca;&quot;&gt;args&lt;/span&gt;) &lt;span style=&quot;color: #cf8e6d;&quot;&gt;throws &lt;/span&gt;Exception {&lt;br /&gt;        &lt;span style=&quot;color: #cf8e6d;&quot;&gt;var &lt;/span&gt;&lt;span style=&quot;color: #38a2a2;&quot;&gt;zipFile &lt;/span&gt;= &lt;span style=&quot;color: #cf8e6d;&quot;&gt;new &lt;/span&gt;java.util.zip.ZipFile(&lt;span style=&quot;color: #6aab73;&quot;&gt;&quot;in.zip&quot;&lt;/span&gt;);&lt;br /&gt;        &lt;span style=&quot;color: #cf8e6d;&quot;&gt;final var &lt;/span&gt;&lt;span style=&quot;color: #38a2a2;&quot;&gt;zos &lt;/span&gt;= &lt;span style=&quot;color: #cf8e6d;&quot;&gt;new &lt;/span&gt;ZipOutputStream(&lt;span style=&quot;color: #cf8e6d;&quot;&gt;new &lt;/span&gt;FileOutputStream(&lt;span style=&quot;color: #6aab73;&quot;&gt;&quot;out.zip&quot;&lt;/span&gt;));&lt;br /&gt;        &lt;span style=&quot;color: #cf8e6d;&quot;&gt;for &lt;/span&gt;(&lt;span style=&quot;color: #cf8e6d;&quot;&gt;var &lt;/span&gt;&lt;span style=&quot;color: #38a2a2;&quot;&gt;e &lt;/span&gt;= &lt;span style=&quot;color: #38a2a2;&quot;&gt;zipFile&lt;/span&gt;.entries(); &lt;span style=&quot;color: #38a2a2;&quot;&gt;e&lt;/span&gt;.hasMoreElements(); ) {&lt;br /&gt;            &lt;span style=&quot;color: #cf8e6d;&quot;&gt;var &lt;/span&gt;&lt;span style=&quot;color: #38a2a2;&quot;&gt;entryIn &lt;/span&gt;= &lt;span style=&quot;color: #38a2a2;&quot;&gt;e&lt;/span&gt;.nextElement();&lt;br /&gt;            System.&lt;span style=&quot;color: #c77dbb; font-style: italic;&quot;&gt;out&lt;/span&gt;.println(&lt;span style=&quot;color: #6aab73;&quot;&gt;&quot;Processing entry &quot; &lt;/span&gt;+ &lt;span style=&quot;color: #38a2a2;&quot;&gt;entryIn&lt;/span&gt;.getName());&lt;br /&gt;&lt;br /&gt;            &lt;span style=&quot;color: #7a7e85;&quot;&gt;// Set the next entry before writing any data to it&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #7a7e85;&quot;&gt;            &lt;/span&gt;&lt;span style=&quot;color: #38a2a2;&quot;&gt;zos&lt;/span&gt;.putNextEntry(&lt;span style=&quot;color: #38a2a2;&quot;&gt;entryIn&lt;/span&gt;);&lt;br /&gt;&lt;br /&gt;            &lt;span style=&quot;color: #cf8e6d;&quot;&gt;if &lt;/span&gt;(&lt;span style=&quot;color: #38a2a2;&quot;&gt;entryIn&lt;/span&gt;.getName().equalsIgnoreCase(&lt;span style=&quot;color: #6aab73;&quot;&gt;&quot;abc.txt&quot;&lt;/span&gt;)) {&lt;br /&gt;                &lt;span style=&quot;color: #7a7e85;&quot;&gt;// Read existing content, replace a key, and append a timestamp&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #7a7e85;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #7a7e85;&quot;&gt;                &lt;/span&gt;String &lt;span style=&quot;color: #38a2a2;&quot;&gt;content &lt;/span&gt;= &lt;span style=&quot;font-style: italic;&quot;&gt;isToString&lt;/span&gt;(&lt;span style=&quot;color: #38a2a2;&quot;&gt;zipFile&lt;/span&gt;.getInputStream(&lt;span style=&quot;color: #38a2a2;&quot;&gt;entryIn&lt;/span&gt;));&lt;br /&gt;                &lt;span style=&quot;color: #38a2a2;&quot;&gt;content &lt;/span&gt;= &lt;span style=&quot;color: #38a2a2;&quot;&gt;content&lt;/span&gt;.replaceAll(&lt;span style=&quot;color: #6aab73;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;background-color: #293c40; color: #6aab73;&quot;&gt;key1=value1&lt;/span&gt;&lt;span style=&quot;color: #6aab73;&quot;&gt;&quot;&lt;/span&gt;, &lt;span style=&quot;color: #6aab73;&quot;&gt;&quot;key1=val2&quot;&lt;/span&gt;);&lt;br /&gt;                &lt;span style=&quot;color: #38a2a2;&quot;&gt;content &lt;/span&gt;+= LocalDateTime.&lt;span style=&quot;font-style: italic;&quot;&gt;now&lt;/span&gt;() + &lt;span style=&quot;color: #6aab73;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #cf8e6d;&quot;&gt;\r\n&lt;/span&gt;&lt;span style=&quot;color: #6aab73;&quot;&gt;&quot;&lt;/span&gt;;&lt;br /&gt;&lt;br /&gt;                &lt;span style=&quot;color: #cf8e6d;&quot;&gt;byte&lt;/span&gt;[] &lt;span style=&quot;color: #38a2a2;&quot;&gt;buf &lt;/span&gt;= &lt;span style=&quot;color: #38a2a2;&quot;&gt;content&lt;/span&gt;.getBytes();&lt;br /&gt;                &lt;span style=&quot;color: #38a2a2;&quot;&gt;zos&lt;/span&gt;.write(&lt;span style=&quot;color: #38a2a2;&quot;&gt;buf&lt;/span&gt;, &lt;span style=&quot;color: #2aacb8;&quot;&gt;0&lt;/span&gt;, &lt;span style=&quot;color: #38a2a2;&quot;&gt;buf&lt;/span&gt;.&lt;span style=&quot;color: #c77dbb;&quot;&gt;length&lt;/span&gt;);&lt;br /&gt;            } &lt;span style=&quot;color: #cf8e6d;&quot;&gt;else &lt;/span&gt;{&lt;br /&gt;                &lt;span style=&quot;color: #7a7e85;&quot;&gt;// For all other entries, stream the bytes unchanged&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #7a7e85;&quot;&gt;                &lt;/span&gt;&lt;span style=&quot;color: #cf8e6d;&quot;&gt;var &lt;/span&gt;&lt;span style=&quot;color: #38a2a2;&quot;&gt;inputStream &lt;/span&gt;= &lt;span style=&quot;color: #38a2a2;&quot;&gt;zipFile&lt;/span&gt;.getInputStream(&lt;span style=&quot;color: #38a2a2;&quot;&gt;entryIn&lt;/span&gt;);&lt;br /&gt;                &lt;span style=&quot;color: #cf8e6d;&quot;&gt;byte&lt;/span&gt;[] &lt;span style=&quot;color: #38a2a2;&quot;&gt;buf &lt;/span&gt;= &lt;span style=&quot;color: #cf8e6d;&quot;&gt;new byte&lt;/span&gt;[&lt;span style=&quot;color: #2aacb8;&quot;&gt;9096&lt;/span&gt;];&lt;br /&gt;                &lt;span style=&quot;color: #cf8e6d;&quot;&gt;int &lt;/span&gt;&lt;span style=&quot;color: #38a2a2;&quot;&gt;len&lt;/span&gt;;&lt;br /&gt;                &lt;span style=&quot;color: #cf8e6d;&quot;&gt;while &lt;/span&gt;((&lt;span style=&quot;color: #38a2a2;&quot;&gt;len &lt;/span&gt;= &lt;span style=&quot;color: #38a2a2;&quot;&gt;inputStream&lt;/span&gt;.read(&lt;span style=&quot;color: #38a2a2;&quot;&gt;buf&lt;/span&gt;)) &amp;gt; &lt;span style=&quot;color: #2aacb8;&quot;&gt;0&lt;/span&gt;) {&lt;br /&gt;                    &lt;span style=&quot;color: #38a2a2;&quot;&gt;zos&lt;/span&gt;.write(&lt;span style=&quot;color: #38a2a2;&quot;&gt;buf&lt;/span&gt;, &lt;span style=&quot;color: #2aacb8;&quot;&gt;0&lt;/span&gt;, &lt;span style=&quot;color: #38a2a2;&quot;&gt;len&lt;/span&gt;);&lt;br /&gt;                }&lt;br /&gt;&lt;br /&gt;            }&lt;br /&gt;            &lt;span style=&quot;color: #38a2a2;&quot;&gt;zos&lt;/span&gt;.closeEntry();&lt;br /&gt;        }&lt;br /&gt;        &lt;span style=&quot;color: #38a2a2;&quot;&gt;zos&lt;/span&gt;.close();&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    &lt;span style=&quot;color: #cf8e6d;&quot;&gt;static &lt;/span&gt;String &lt;span style=&quot;color: #56a8f5;&quot;&gt;isToString&lt;/span&gt;(InputStream &lt;span style=&quot;color: #8396ca;&quot;&gt;stringStream&lt;/span&gt;) &lt;span style=&quot;color: #cf8e6d;&quot;&gt;throws &lt;/span&gt;Exception {&lt;br /&gt;        &lt;span style=&quot;color: #cf8e6d;&quot;&gt;var &lt;/span&gt;&lt;span style=&quot;color: #38a2a2;&quot;&gt;result &lt;/span&gt;= &lt;span style=&quot;color: #cf8e6d;&quot;&gt;new &lt;/span&gt;ByteArrayOutputStream();&lt;br /&gt;        &lt;span style=&quot;color: #cf8e6d;&quot;&gt;byte&lt;/span&gt;[] &lt;span style=&quot;color: #38a2a2;&quot;&gt;buffer &lt;/span&gt;= &lt;span style=&quot;color: #cf8e6d;&quot;&gt;new byte&lt;/span&gt;[&lt;span style=&quot;color: #2aacb8;&quot;&gt;1024&lt;/span&gt;];&lt;br /&gt;        &lt;span style=&quot;color: #cf8e6d;&quot;&gt;for &lt;/span&gt;(&lt;span style=&quot;color: #cf8e6d;&quot;&gt;int &lt;/span&gt;&lt;span style=&quot;color: #38a2a2;&quot;&gt;length&lt;/span&gt;; (&lt;span style=&quot;color: #38a2a2;&quot;&gt;length &lt;/span&gt;= &lt;span style=&quot;color: #8396ca;&quot;&gt;stringStream&lt;/span&gt;.read(&lt;span style=&quot;color: #38a2a2;&quot;&gt;buffer&lt;/span&gt;)) != -&lt;span style=&quot;color: #2aacb8;&quot;&gt;1&lt;/span&gt;; ) {&lt;br /&gt;            &lt;span style=&quot;color: #38a2a2;&quot;&gt;result&lt;/span&gt;.write(&lt;span style=&quot;color: #38a2a2;&quot;&gt;buffer&lt;/span&gt;, &lt;span style=&quot;color: #2aacb8;&quot;&gt;0&lt;/span&gt;, &lt;span style=&quot;color: #38a2a2;&quot;&gt;length&lt;/span&gt;);&lt;br /&gt;        }&lt;br /&gt;        &lt;span style=&quot;color: #cf8e6d;&quot;&gt;return &lt;/span&gt;&lt;span style=&quot;color: #38a2a2;&quot;&gt;result&lt;/span&gt;.toString(StandardCharsets.&lt;span style=&quot;color: #c77dbb; font-style: italic;&quot;&gt;UTF_8&lt;/span&gt;);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;}&lt;/pre&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.gtiwari333.com/feeds/9153640949145801244/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://blog.gtiwari333.com/2025/02/append-file-into-existing-zip-using-java.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8219113377173546175/posts/default/9153640949145801244'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8219113377173546175/posts/default/9153640949145801244'/><link rel='alternate' type='text/html' href='http://blog.gtiwari333.com/2025/02/append-file-into-existing-zip-using-java.html' title='Append a file into existing ZIP using Java'/><author><name>GT</name><uri>http://www.blogger.com/profile/16923656636145211711</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8219113377173546175.post-1856518755352999166</id><published>2025-02-27T17:08:00.001+00:00</published><updated>2025-02-27T17:08:04.011+00:00</updated><title type='text'>Spring Boot - get Trace and Span ID programmatically</title><content type='html'>&lt;p&gt;&amp;nbsp;Autowire&lt;span style=&quot;color: #cf8e6d;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;background-color: #1e1f22; color: #bcbec4; font-family: &amp;quot;JetBrains Mono&amp;quot;, monospace; font-size: 9.8pt;&quot;&gt;Tracer &lt;/span&gt;&lt;span style=&quot;background-color: #1e1f22; color: #c77dbb; font-family: &amp;quot;JetBrains Mono&amp;quot;, monospace; font-size: 9.8pt;&quot;&gt;tracer&lt;/span&gt;&lt;/p&gt;&lt;p&gt;and get traceId and spanId from current Span&lt;/p&gt;&lt;div style=&quot;background-color: #1e1f22;&quot;&gt;&lt;pre style=&quot;font-family: &amp;quot;JetBrains Mono&amp;quot;, monospace; font-size: 9.8pt;&quot;&gt;&lt;span style=&quot;color: #bcbec4;&quot;&gt;&lt;br /&gt;Span &lt;/span&gt;&lt;span style=&quot;color: #38a2a2;&quot;&gt;span &lt;/span&gt;&lt;span style=&quot;color: #bcbec4;&quot;&gt;= &lt;/span&gt;&lt;span style=&quot;color: #8396ca;&quot;&gt;tracer&lt;/span&gt;&lt;span style=&quot;color: #bcbec4;&quot;&gt;.currentSpan();&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #38a2a2;&quot;&gt;span&lt;/span&gt;&lt;span style=&quot;color: #bcbec4;&quot;&gt;.context().traceId() //trace ID
&lt;/span&gt;&lt;span style=&quot;color: #38a2a2;&quot;&gt;span&lt;/span&gt;&lt;span style=&quot;color: #bcbec4;&quot;&gt;.context().spanId() //span ID&lt;br /&gt; &lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.gtiwari333.com/feeds/1856518755352999166/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://blog.gtiwari333.com/2025/02/spring-boot-get-trace-and-span-id.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8219113377173546175/posts/default/1856518755352999166'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8219113377173546175/posts/default/1856518755352999166'/><link rel='alternate' type='text/html' href='http://blog.gtiwari333.com/2025/02/spring-boot-get-trace-and-span-id.html' title='Spring Boot - get Trace and Span ID programmatically'/><author><name>GT</name><uri>http://www.blogger.com/profile/16923656636145211711</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8219113377173546175.post-1245863990808475448</id><published>2024-06-23T23:26:00.010+01:00</published><updated>2024-06-23T23:26:47.241+01:00</updated><title type='text'>8 puzzle solver using A* algorithm</title><content type='html'>&lt;p style=&quot;text-align: left;&quot;&gt;&amp;nbsp;&lt;span style=&quot;background-color: #f3f3f3;&quot;&gt;8-puzzle&lt;/span&gt; is a very 
interesting and a well known problem in the field of Artificial 
Intelligence.&amp;nbsp;It always has been an important subject in articles, books
 and become a part of course&amp;nbsp;material in many universities. The 8-puzzle
 is also known as the sliding-block puzzle or tile-puzzle and is meant 
for a single user.&amp;nbsp;8-puzzle consists of 8 square tiles numbered 1 
through 8 and one blank space on a 3&amp;nbsp; by 3 board. Moves of the puzzle 
are made by sliding an adjacent tile into the position occupied by&amp;nbsp;the 
blank space, which has the effect of exchanging the positions of the 
tile and blank space.&amp;nbsp;Only tiles that are horizontally or vertically 
adjacent (not diagonally adjacent) may be moved&amp;nbsp;into the blank space. 
The objective of the game is to start from an&amp;nbsp; initial configuration 
and&amp;nbsp;end up in a configuration which the tiles are placed in ascending 
number order as shown in:&amp;nbsp;&lt;span style=&quot;text-align: left;&quot;&gt;figure 1 below.&lt;/span&gt;&lt;/p&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; height=&quot;199&quot; src=&quot;data:image/png;base64,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&quot; width=&quot;200&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Figure 1&amp;nbsp;&amp;nbsp; Goal state of the 8-puzzle &lt;br /&gt;
&lt;h3 style=&quot;text-align: left;&quot;&gt;&lt;b&gt;HOW TO PLAY&lt;/b&gt;&lt;/h3&gt;
The game can be played using the arrow keys. Up arrow slides a tile up 
into the empty space, left arrow slides a tile left into the empty space
 and so on. You can choose to solve it automatically by program. It will
 display the animation sliding the tiles and solve the 8 puzzle in least
 possible moves using AI.&lt;br /&gt;
&lt;br /&gt;
&lt;h3 style=&quot;text-align: left;&quot;&gt;&lt;b&gt;METHODOLOGY &lt;/b&gt;&lt;br /&gt;&lt;/h3&gt;
According to the authors &amp;nbsp;Russel &amp;nbsp;and &amp;nbsp;Norvig &amp;nbsp;in their book titled 
&amp;nbsp;Artificial Intelligence: A&amp;nbsp;Modern Approach, the average solution for a 
randomly generated 8-puzzle instance is about&amp;nbsp;22 steps. This figure &amp;nbsp;is 
obtained by estimating the branching factor which is about 3 (when&amp;nbsp;the 
empty tile is in the middle, there are four possible moves; when it is 
in a corner there are&amp;nbsp;two; and when it is along an edge there are 
three). This means that an exhaustive search to&amp;nbsp;depth 22 would look at 
about 322&amp;nbsp;~ 3.1 x 1010&amp;nbsp;states. By keeping track of repeated states, it 
is&amp;nbsp;possible to cut this down by a factor of about 170,000, because there
 are only 9!/2 = 181,440&amp;nbsp;distinct states that are reachable.&lt;br /&gt;&lt;div&gt;
&lt;br /&gt;
&lt;a href=&quot;https://www.blogger.com/null&quot; name=&quot;more&quot;&gt;&lt;/a&gt;&lt;br /&gt;
&lt;h3 style=&quot;text-align: left;&quot;&gt;&lt;b&gt;ALGORITHM&lt;/b&gt;&lt;br /&gt;&lt;/h3&gt;
After a preliminary investigation of the heuristic search strategies we 
were able to figure out&amp;nbsp;that A* algorithm is the best for the 8-puzzle 
problem. A* is the most widely used form of&amp;nbsp;best first search algorithm 
which is an instance of Tree-Search or Graph-Search where a best&amp;nbsp;node is
 expanded on the basis of an evaluation function f(n). Here, the 
evaluation function of&amp;nbsp;each node is calculated as a sum of two functions
 g(n) and h(n) where, g(n) refers to the cost&amp;nbsp;to reach the node n while 
h(n) is the cost to get from node n to the goal. A* algorithm is 
both&amp;nbsp;optimal and complete. It is optimal in that sense h(n) is 
admissible and is never overestimated&lt;br /&gt;&lt;/div&gt;&lt;div style=&quot;text-align: left;&quot;&gt;
to reach the goal and it is complete in that sense it guarantees to reach a solution whenever&amp;nbsp;there is one.&lt;br /&gt;
&lt;br /&gt;
The following pseudo code describes the A* algorithm:&lt;br /&gt;
&lt;br /&gt;
&lt;table border=&quot;1&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;MsoNormalTable&quot; style=&quot;background: rgb(242, 242, 242); border-collapse: collapse; border: medium; text-align: left;&quot;&gt;
 &lt;tbody&gt;
&lt;tr style=&quot;height: 48.95pt; mso-yfti-firstrow: yes; mso-yfti-irow: 0; mso-yfti-lastrow: yes;&quot;&gt;
  &lt;td style=&quot;border: solid #D9D9D9 1.0pt; height: 48.95pt; mso-border-alt: solid #D9D9D9 .5pt; mso-border-themecolor: background1; mso-border-themecolor: background1; mso-border-themeshade: 217; mso-border-themeshade: 217; padding: 0in 5.4pt 0in 5.4pt; width: 551.25pt;&quot; valign=&quot;top&quot; width=&quot;735&quot;&gt;&lt;div class=&quot;MsoNormal&quot; style=&quot;margin-bottom: .0001pt; margin-bottom: 0in; mso-layout-grid-align: none; text-autospace: none;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;margin-bottom: .0001pt; margin-bottom: 0in; mso-layout-grid-align: none; text-autospace: none;&quot;&gt;
&lt;span style=&quot;font-family: Consolas; font-size: 10.0pt;&quot;&gt;function
  A*(start,goal) &lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;margin-bottom: .0001pt; margin-bottom: 0in; mso-layout-grid-align: none; text-autospace: none;&quot;&gt;
&lt;span style=&quot;font-family: Consolas; font-size: 10.0pt;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; closedset := the empty set&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // The set of nodes
  already&amp;nbsp; evaluated.&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;margin-bottom: .0001pt; margin-bottom: 0in; mso-layout-grid-align: none; text-autospace: none;&quot;&gt;
&lt;span style=&quot;font-family: Consolas; font-size: 10.0pt;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; openset := set containing the initial
  node // The set of tentative nodes to be evaluated. &lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;margin-bottom: .0001pt; margin-bottom: 0in; mso-layout-grid-align: none; text-autospace: none;&quot;&gt;
&lt;span style=&quot;font-family: Consolas; font-size: 10.0pt;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; g_score[start] := 0&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Distance from
  start along optimal path. &lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;margin-bottom: .0001pt; margin-bottom: 0in; mso-layout-grid-align: none; text-autospace: none;&quot;&gt;
&lt;span style=&quot;font-family: Consolas; font-size: 10.0pt;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; h_score[start] :=
  heuristic_estimate_of_distance(start, goal) &lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;margin-bottom: .0001pt; margin-bottom: 0in; mso-layout-grid-align: none; text-autospace: none;&quot;&gt;
&lt;span style=&quot;font-family: Consolas; font-size: 10.0pt;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; f_score[start] := h_score[start]&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Estimated total distance from
  start to goal through y. &lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;margin-bottom: .0001pt; margin-bottom: 0in; mso-layout-grid-align: none; text-autospace: none;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;margin-bottom: .0001pt; margin-bottom: 0in; mso-layout-grid-align: none; text-autospace: none;&quot;&gt;
&lt;span style=&quot;font-family: Consolas; font-size: 10.0pt;&quot;&gt;while
  openset is not empty &lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;margin-bottom: .0001pt; margin-bottom: 0in; mso-layout-grid-align: none; text-autospace: none;&quot;&gt;
&lt;span style=&quot;font-family: Consolas; font-size: 10.0pt;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; x := the node in openset having the
  lowest f_score[] value &lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;margin-bottom: .0001pt; margin-bottom: 0in; mso-layout-grid-align: none; text-autospace: none;&quot;&gt;
&lt;span style=&quot;font-family: Consolas; font-size: 10.0pt;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if x = goal &lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;margin-bottom: .0001pt; margin-bottom: 0in; mso-layout-grid-align: none; text-autospace: none;&quot;&gt;
&lt;span style=&quot;font-family: Consolas; font-size: 10.0pt;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return
  reconstruct_path(came_from[goal]) &lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;margin-bottom: .0001pt; margin-bottom: 0in; mso-layout-grid-align: none; text-autospace: none;&quot;&gt;
&lt;span style=&quot;font-family: Consolas; font-size: 10.0pt;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; remove x from openset &lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;margin-bottom: .0001pt; margin-bottom: 0in; mso-layout-grid-align: none; text-autospace: none;&quot;&gt;
&lt;span style=&quot;font-family: Consolas; font-size: 10.0pt;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; add x to closedset &lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;margin-bottom: .0001pt; margin-bottom: 0in; mso-layout-grid-align: none; text-autospace: none;&quot;&gt;
&lt;span style=&quot;font-family: Consolas; font-size: 10.0pt;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; foreach y in neighbor_nodes(x) &lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;margin-bottom: .0001pt; margin-bottom: 0in; mso-layout-grid-align: none; text-autospace: none;&quot;&gt;
&lt;span style=&quot;font-family: Consolas; font-size: 10.0pt;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if y in closedset &lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;margin-bottom: .0001pt; margin-bottom: 0in; mso-layout-grid-align: none; text-autospace: none;&quot;&gt;
&lt;span style=&quot;font-family: Consolas; font-size: 10.0pt;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; continue &lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;margin-bottom: .0001pt; margin-bottom: 0in; mso-layout-grid-align: none; text-autospace: none;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;margin-bottom: .0001pt; margin-bottom: 0in; mso-layout-grid-align: none; text-autospace: none;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;margin-bottom: .0001pt; margin-bottom: 0in; mso-layout-grid-align: none; text-autospace: none;&quot;&gt;
&lt;span style=&quot;font-family: Consolas; font-size: 10.0pt;&quot;&gt;&amp;nbsp;tentative_g_score := g_score[x] +
  dist_between(x,y) &lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;margin-bottom: .0001pt; margin-bottom: 0in; mso-layout-grid-align: none; text-autospace: none;&quot;&gt;
&lt;span style=&quot;font-family: Consolas; font-size: 10.0pt;&quot;&gt;&amp;nbsp; &lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;margin-bottom: .0001pt; margin-bottom: 0in; mso-layout-grid-align: none; text-autospace: none;&quot;&gt;
&lt;span style=&quot;font-family: Consolas; font-size: 10.0pt;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if y not in openset &lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;margin-bottom: .0001pt; margin-bottom: 0in; mso-layout-grid-align: none; text-autospace: none;&quot;&gt;
&lt;span style=&quot;font-family: Consolas; font-size: 10.0pt;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; add y to openset &lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;margin-bottom: .0001pt; margin-bottom: 0in; mso-layout-grid-align: none; text-autospace: none;&quot;&gt;
&lt;span style=&quot;font-family: Consolas; font-size: 10.0pt;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; tentative_is_better := true &lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;margin-bottom: .0001pt; margin-bottom: 0in; mso-layout-grid-align: none; text-autospace: none;&quot;&gt;
&lt;span style=&quot;font-family: Consolas; font-size: 10.0pt;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; elseif tentative_g_score &amp;lt;
  g_score[y] &lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;margin-bottom: .0001pt; margin-bottom: 0in; mso-layout-grid-align: none; text-autospace: none;&quot;&gt;
&lt;span style=&quot;font-family: Consolas; font-size: 10.0pt;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; tentative_is_better := true &lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;margin-bottom: .0001pt; margin-bottom: 0in; mso-layout-grid-align: none; text-autospace: none;&quot;&gt;
&lt;span style=&quot;font-family: Consolas; font-size: 10.0pt;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; else &lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;margin-bottom: .0001pt; margin-bottom: 0in; mso-layout-grid-align: none; text-autospace: none;&quot;&gt;
&lt;span style=&quot;font-family: Consolas; font-size: 10.0pt;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; tentative_is_better := false
  &lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;margin-bottom: .0001pt; margin-bottom: 0in; mso-layout-grid-align: none; text-autospace: none;&quot;&gt;
&lt;span style=&quot;font-family: Consolas; font-size: 10.0pt;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if tentative_is_better = true &lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;margin-bottom: .0001pt; margin-bottom: 0in; mso-layout-grid-align: none; text-autospace: none;&quot;&gt;
&lt;span style=&quot;font-family: Consolas; font-size: 10.0pt;&quot;&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;came_from[y] := x &lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;margin-bottom: .0001pt; margin-bottom: 0in; mso-layout-grid-align: none; text-autospace: none;&quot;&gt;
&lt;span style=&quot;font-family: Consolas; font-size: 10.0pt;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; g_score[y] :=
  tentative_g_score &lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;margin-bottom: .0001pt; margin-bottom: 0in; mso-layout-grid-align: none; text-autospace: none;&quot;&gt;
&lt;span style=&quot;font-family: Consolas; font-size: 10.0pt;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; h_score[y] :=
  heuristic_estimate_of_distance(y, goal) &lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;margin-bottom: .0001pt; margin-bottom: 0in; mso-layout-grid-align: none; text-autospace: none;&quot;&gt;
&lt;span style=&quot;font-family: Consolas; font-size: 10.0pt;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; f_score[y] := g_score[y] +
  h_score[y] &lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;margin-bottom: .0001pt; margin-bottom: 0in; mso-layout-grid-align: none; text-autospace: none;&quot;&gt;
&lt;span style=&quot;font-family: Consolas; font-size: 10.0pt;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return failure &lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;margin-bottom: .0001pt; margin-bottom: 0in; mso-layout-grid-align: none; text-autospace: none;&quot;&gt;
&lt;span style=&quot;font-family: Consolas; font-size: 10.0pt;&quot;&gt;&amp;nbsp; &lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;margin-bottom: .0001pt; margin-bottom: 0in; mso-layout-grid-align: none; text-autospace: none;&quot;&gt;
&lt;span style=&quot;font-family: Consolas; font-size: 10.0pt;&quot;&gt;&amp;nbsp;function reconstruct_path(current_node) &lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;margin-bottom: .0001pt; margin-bottom: 0in; mso-layout-grid-align: none; text-autospace: none;&quot;&gt;
&lt;span style=&quot;font-family: Consolas; font-size: 10.0pt;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if came_from[current_node] is set &lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;margin-bottom: .0001pt; margin-bottom: 0in; mso-layout-grid-align: none; text-autospace: none;&quot;&gt;
&lt;span style=&quot;font-family: Consolas; font-size: 10.0pt;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; p =
  reconstruct_path(came_from[current_node]) &lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;margin-bottom: .0001pt; margin-bottom: 0in; mso-layout-grid-align: none; text-autospace: none;&quot;&gt;
&lt;span style=&quot;font-family: Consolas; font-size: 10.0pt;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return (p + current_node) &lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;margin-bottom: .0001pt; margin-bottom: 0in; mso-layout-grid-align: none; text-autospace: none;&quot;&gt;
&lt;span style=&quot;font-family: Consolas; font-size: 10.0pt;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; else &lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;margin-bottom: .0001pt; margin-bottom: 0in; mso-layout-grid-align: none; text-autospace: none;&quot;&gt;
&lt;span style=&quot;font-family: Consolas; font-size: 10.0pt;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return current_node&lt;/span&gt;&lt;/div&gt;
&lt;/td&gt;
 &lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;h3&gt;&lt;b&gt;REFERENCE&lt;/b&gt;&lt;br /&gt;&lt;/h3&gt;
1. &amp;nbsp;Rich and Knight, Artificial Intelligence.&lt;br /&gt;&lt;/div&gt;&lt;div&gt;
2. &amp;nbsp;Russell and Norvig, Artificial Intelligence: A Modern approach,&lt;br /&gt;
3. &amp;nbsp;A* search algorithm - Wikipedia, the free encyclopedia&lt;br /&gt;
4. &amp;nbsp;Description and a solution strategy for the 8-puzzle from http://www.8puzzle.com/&lt;br /&gt;
5. &amp;nbsp;G. Novak, CS 381K: Heuristic Search: 8 Puzzle, 26 Sep 07&lt;br /&gt;
6. &amp;nbsp;An appealing Java applet from www.permadi.com/java/puzzle8/&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.gtiwari333.com/feeds/1245863990808475448/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://blog.gtiwari333.com/2024/06/8-puzzle-solver-using-algorithm.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8219113377173546175/posts/default/1245863990808475448'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8219113377173546175/posts/default/1245863990808475448'/><link rel='alternate' type='text/html' href='http://blog.gtiwari333.com/2024/06/8-puzzle-solver-using-algorithm.html' title='8 puzzle solver using A* algorithm'/><author><name>GT</name><uri>http://www.blogger.com/profile/16923656636145211711</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8219113377173546175.post-4007515057254624207</id><published>2024-06-23T23:24:00.001+01:00</published><updated>2024-06-23T23:24:10.210+01:00</updated><title type='text'>JSP basics - Java Server Pages</title><content type='html'>&lt;div&gt;&lt;h3 style=&quot;text-align: left;&quot;&gt;&amp;nbsp;&lt;b&gt;The JSP &lt;/b&gt;- Java Server Pages&lt;br /&gt;
&lt;/h3&gt;&lt;ul style=&quot;text-align: left;&quot;&gt;&lt;li&gt;JSP extension of the servlet technology which offers both scripting ( as in HTML) as well as programming (as in Servlets)&amp;nbsp;&lt;/li&gt;&lt;li&gt;When a JSP page is requested, the JSP container ( also called page compiler) compiles the jsp page into a servlet class.&amp;nbsp;&lt;/li&gt;&lt;li&gt;The JSP API that handles all the JSP technology has been bundled under the following two packages:&amp;nbsp;&lt;/li&gt;&lt;ul&gt;&lt;li&gt;javax.servlet.jsp&amp;nbsp;&lt;/li&gt;&lt;li&gt;javax.servlet.jsp.tagext&amp;nbsp; &lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/ul&gt;&lt;h3 style=&quot;text-align: left;&quot;&gt;&lt;b&gt;
JSP Syntax&lt;/b&gt;&lt;/h3&gt;
A JSP page is all about &lt;i&gt;JSP tags&lt;/i&gt; and some template data ( such as
 HTML tags). That&#39;s pretty much of it. It always feels good learning 
about JSP as we get to see the very well-know HTML tags &lt;i&gt;(I presumed that you already know HTML at this point).&lt;/i&gt;&lt;br /&gt;
&lt;br /&gt;
JSP consists of three types of elements. &lt;br /&gt;
&lt;ul style=&quot;text-align: left;&quot;&gt;&lt;li&gt;Directive elements&amp;nbsp;&lt;/li&gt;&lt;li&gt;Scripting elements&amp;nbsp;&lt;/li&gt;&lt;li&gt;Action elements&amp;nbsp;&lt;/li&gt;&lt;/ul&gt;&lt;h3 style=&quot;text-align: left;&quot;&gt;&lt;b&gt;DIRECTIVES&lt;/b&gt;&lt;/h3&gt;
&lt;table border=&quot;1&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;MsoTableGrid&quot; style=&quot;background: rgb(242, 242, 242); border-collapse: collapse; border: medium; margin-left: 3.75pt; text-align: left;&quot;&gt;
 &lt;tbody&gt;
&lt;tr&gt;
  &lt;td style=&quot;border: dotted windowtext 1.0pt; mso-border-alt: dotted windowtext .5pt; padding: 0in 5.4pt 0in 5.4pt; width: 6.65in;&quot; valign=&quot;top&quot; width=&quot;638&quot;&gt;&lt;div class=&quot;MsoNormal&quot; style=&quot;margin-bottom: .0001pt; margin-bottom: 0in;&quot;&gt;
&lt;span style=&quot;font-family: &#39;Times New Roman&#39;, serif; font-size: 13.5pt;&quot;&gt;&amp;lt;%@&lt;span class=&quot;apple-converted-space&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;i&gt;directiveName&lt;span class=&quot;apple-converted-space&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/i&gt;(&lt;i&gt;attributeName&lt;/i&gt;=&quot;&lt;i&gt;atrributeValue&lt;/i&gt;&quot;)
  %&amp;gt;&lt;/div&gt;
&lt;/td&gt;
 &lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;br /&gt;
&lt;div style=&quot;text-align: left;&quot;&gt;
These are the messages/information to the JSP container on how it should translate the JSP page into the corresponding servlet. &lt;br /&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: left;&quot;&gt;
Again, there are three types of directives:&lt;br /&gt;
&lt;br /&gt;
&lt;ul style=&quot;text-align: left;&quot;&gt;&lt;li&gt;Page directives&lt;/li&gt;&lt;li&gt;Include directives&lt;/li&gt;&lt;li&gt;Tag library directives&amp;nbsp;&lt;/li&gt;&lt;/ul&gt;
&lt;/div&gt;
&lt;blockquote style=&quot;border: none; margin: 0px 0px 0px 40px; padding: 0px; text-align: left;&quot;&gt;
&lt;div&gt;
&lt;/div&gt;
&lt;/blockquote&gt;
&lt;div style=&quot;text-align: left;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: left;&quot;&gt;
&lt;b&gt;1. Page Directive&lt;/b&gt;&lt;br /&gt;
&lt;span style=&quot;background-color: #f3f3f3;&quot;&gt;&amp;lt;%@ page (&lt;i&gt;attributeName&lt;/i&gt;=&quot;&lt;i&gt;atrributeValue&lt;/i&gt;&quot;) %&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: left;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: left;&quot;&gt;
You might have encountered some &quot;&lt;span style=&quot;background-color: #f3f3f3;&quot;&gt;import&lt;/span&gt;&quot; statements at the beginning of some JSP pages. Those import statements falls under this category. E.g.&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;background-color: #f3f3f3;&quot;&gt;&amp;lt;%@
 page import=&quot;java.util.Date, java.util.Enumeration&quot;
 language=&quot;java&quot; %&amp;gt;&lt;/span&gt;&lt;br /&gt;
where,&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; page =&amp;gt; represents &lt;i&gt;directiveName&lt;/i&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; import/language =&amp;gt; represents &lt;i&gt;attributeName&lt;/i&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; and the values enclosed by quotes
 represents &lt;i&gt;atrributeValue&lt;/i&gt;&lt;br /&gt;
&lt;br /&gt;
The following is the list of available Page directive attributes:&lt;/div&gt;
&lt;div style=&quot;text-align: left;&quot;&gt;
&lt;table border=&quot;1&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;MsoNormalTable&quot; style=&quot;background: #F2F2F2; border: dotted windowtext 1.0pt; mso-background-themecolor: background1; mso-background-themeshade: 242; mso-border-alt: dotted windowtext .5pt; mso-border-insideh: .5pt dotted windowtext; mso-border-insidev: .5pt dotted windowtext; mso-cellspacing: 0in; mso-yfti-tbllook: 1696; width: 100%px;&quot;&gt;
 &lt;tbody&gt;
&lt;tr&gt;
  &lt;td style=&quot;border: dotted windowtext 1.0pt; mso-border-alt: dotted windowtext .5pt; padding: .75pt .75pt .75pt .75pt;&quot; valign=&quot;top&quot;&gt;&lt;div align=&quot;center&quot; class=&quot;MsoNormal&quot; style=&quot;mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; text-align: center;&quot;&gt;
&lt;b&gt;Attribute&lt;/b&gt;&lt;/div&gt;
&lt;/td&gt;
  &lt;td style=&quot;border: dotted windowtext 1.0pt; mso-border-alt: dotted windowtext .5pt; padding: .75pt .75pt .75pt .75pt;&quot; valign=&quot;top&quot;&gt;&lt;div align=&quot;center&quot; class=&quot;MsoNormal&quot; style=&quot;mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; text-align: center;&quot;&gt;
&lt;b&gt;Value
  Type&lt;/b&gt;&lt;/div&gt;
&lt;/td&gt;
  &lt;td style=&quot;border: dotted windowtext 1.0pt; mso-border-alt: dotted windowtext .5pt; padding: .75pt .75pt .75pt .75pt;&quot; valign=&quot;top&quot;&gt;&lt;div align=&quot;center&quot; class=&quot;MsoNormal&quot; style=&quot;mso-margin-bottom-alt: auto; mso-margin-top-alt: auto; text-align: center;&quot;&gt;
&lt;b&gt;Default
  Value&lt;/b&gt;&lt;/div&gt;
&lt;/td&gt;
 &lt;/tr&gt;
&lt;tr&gt;
  &lt;td style=&quot;border: dotted windowtext 1.0pt; mso-border-alt: dotted windowtext .5pt; padding: .75pt .75pt .75pt .75pt;&quot; valign=&quot;top&quot;&gt;&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;i&gt;language&lt;/i&gt;&lt;/div&gt;
&lt;/td&gt;
  &lt;td style=&quot;border: dotted windowtext 1.0pt; mso-border-alt: dotted windowtext .5pt; padding: .75pt .75pt .75pt .75pt;&quot; valign=&quot;top&quot;&gt;&lt;div class=&quot;MsoNormal&quot;&gt;
Scripting
  language name&lt;/div&gt;
&lt;/td&gt;
  &lt;td style=&quot;border: dotted windowtext 1.0pt; mso-border-alt: dotted windowtext .5pt; padding: .75pt .75pt .75pt .75pt;&quot; valign=&quot;top&quot;&gt;&lt;div class=&quot;MsoNormal&quot;&gt;
&quot;java&quot;&lt;/div&gt;
&lt;/td&gt;
 &lt;/tr&gt;
&lt;tr&gt;
  &lt;td style=&quot;border: dotted windowtext 1.0pt; mso-border-alt: dotted windowtext .5pt; padding: .75pt .75pt .75pt .75pt;&quot; valign=&quot;top&quot;&gt;&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;i&gt;info&lt;/i&gt;&lt;/div&gt;
&lt;/td&gt;
  &lt;td style=&quot;border: dotted windowtext 1.0pt; mso-border-alt: dotted windowtext .5pt; padding: .75pt .75pt .75pt .75pt;&quot; valign=&quot;top&quot;&gt;&lt;div class=&quot;MsoNormal&quot;&gt;
String&lt;/div&gt;
&lt;/td&gt;
  &lt;td style=&quot;border: dotted windowtext 1.0pt; mso-border-alt: dotted windowtext .5pt; padding: .75pt .75pt .75pt .75pt;&quot; valign=&quot;top&quot;&gt;&lt;div class=&quot;MsoNormal&quot;&gt;
Depends on the
  JSP container&lt;/div&gt;
&lt;/td&gt;
 &lt;/tr&gt;
&lt;tr&gt;
  &lt;td style=&quot;border: dotted windowtext 1.0pt; mso-border-alt: dotted windowtext .5pt; padding: .75pt .75pt .75pt .75pt;&quot; valign=&quot;top&quot;&gt;&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;i&gt;contentType&lt;/i&gt;&lt;/div&gt;
&lt;/td&gt;
  &lt;td style=&quot;border: dotted windowtext 1.0pt; mso-border-alt: dotted windowtext .5pt; padding: .75pt .75pt .75pt .75pt;&quot; valign=&quot;top&quot;&gt;&lt;div class=&quot;MsoNormal&quot;&gt;
MIME type,
  character set&lt;/div&gt;
&lt;/td&gt;
  &lt;td style=&quot;border: dotted windowtext 1.0pt; mso-border-alt: dotted windowtext .5pt; padding: .75pt .75pt .75pt .75pt;&quot; valign=&quot;top&quot;&gt;&lt;div class=&quot;MsoNormal&quot;&gt;
&quot;text/html;charset=ISO-8859-1&quot;&lt;/div&gt;
&lt;/td&gt;
 &lt;/tr&gt;
&lt;tr&gt;
  &lt;td style=&quot;border: dotted windowtext 1.0pt; mso-border-alt: dotted windowtext .5pt; padding: .75pt .75pt .75pt .75pt;&quot; valign=&quot;top&quot;&gt;&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;i&gt;extends&lt;/i&gt;&lt;/div&gt;
&lt;/td&gt;
  &lt;td style=&quot;border: dotted windowtext 1.0pt; mso-border-alt: dotted windowtext .5pt; padding: .75pt .75pt .75pt .75pt;&quot; valign=&quot;top&quot;&gt;&lt;div class=&quot;MsoNormal&quot;&gt;
Class name&lt;/div&gt;
&lt;/td&gt;
  &lt;td style=&quot;border: dotted windowtext 1.0pt; mso-border-alt: dotted windowtext .5pt; padding: .75pt .75pt .75pt .75pt;&quot; valign=&quot;top&quot;&gt;&lt;div class=&quot;MsoNormal&quot;&gt;
None&lt;/div&gt;
&lt;/td&gt;
 &lt;/tr&gt;
&lt;tr&gt;
  &lt;td style=&quot;border: dotted windowtext 1.0pt; mso-border-alt: dotted windowtext .5pt; padding: .75pt .75pt .75pt .75pt;&quot; valign=&quot;top&quot;&gt;&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;i&gt;import&lt;/i&gt;&lt;/div&gt;
&lt;/td&gt;
  &lt;td style=&quot;border: dotted windowtext 1.0pt; mso-border-alt: dotted windowtext .5pt; padding: .75pt .75pt .75pt .75pt;&quot; valign=&quot;top&quot;&gt;&lt;div class=&quot;MsoNormal&quot;&gt;
Fully qualified
  class name or package name&lt;/div&gt;
&lt;/td&gt;
  &lt;td style=&quot;border: dotted windowtext 1.0pt; mso-border-alt: dotted windowtext .5pt; padding: .75pt .75pt .75pt .75pt;&quot; valign=&quot;top&quot;&gt;&lt;div class=&quot;MsoNormal&quot;&gt;
None&lt;/div&gt;
&lt;/td&gt;
 &lt;/tr&gt;
&lt;tr&gt;
  &lt;td style=&quot;border: dotted windowtext 1.0pt; mso-border-alt: dotted windowtext .5pt; padding: .75pt .75pt .75pt .75pt;&quot; valign=&quot;top&quot;&gt;&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;i&gt;buffer&lt;/i&gt;&lt;/div&gt;
&lt;/td&gt;
  &lt;td style=&quot;border: dotted windowtext 1.0pt; mso-border-alt: dotted windowtext .5pt; padding: .75pt .75pt .75pt .75pt;&quot; valign=&quot;top&quot;&gt;&lt;div class=&quot;MsoNormal&quot;&gt;
Buffer size or
  false&lt;/div&gt;
&lt;/td&gt;
  &lt;td style=&quot;border: dotted windowtext 1.0pt; mso-border-alt: dotted windowtext .5pt; padding: .75pt .75pt .75pt .75pt;&quot; valign=&quot;top&quot;&gt;&lt;div class=&quot;MsoNormal&quot;&gt;
8Kb&lt;/div&gt;
&lt;/td&gt;
 &lt;/tr&gt;
&lt;tr&gt;
  &lt;td style=&quot;border: dotted windowtext 1.0pt; mso-border-alt: dotted windowtext .5pt; padding: .75pt .75pt .75pt .75pt;&quot; valign=&quot;top&quot;&gt;&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;i&gt;autoFlush&lt;/i&gt;&lt;/div&gt;
&lt;/td&gt;
  &lt;td style=&quot;border: dotted windowtext 1.0pt; mso-border-alt: dotted windowtext .5pt; padding: .75pt .75pt .75pt .75pt;&quot; valign=&quot;top&quot;&gt;&lt;div class=&quot;MsoNormal&quot;&gt;
Boolean&lt;/div&gt;
&lt;/td&gt;
  &lt;td style=&quot;border: dotted windowtext 1.0pt; mso-border-alt: dotted windowtext .5pt; padding: .75pt .75pt .75pt .75pt;&quot; valign=&quot;top&quot;&gt;&lt;div class=&quot;MsoNormal&quot;&gt;
&quot;true&quot;&lt;/div&gt;
&lt;/td&gt;
 &lt;/tr&gt;
&lt;tr&gt;
  &lt;td style=&quot;border: dotted windowtext 1.0pt; mso-border-alt: dotted windowtext .5pt; padding: .75pt .75pt .75pt .75pt;&quot; valign=&quot;top&quot;&gt;&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;i&gt;session&lt;/i&gt;&lt;/div&gt;
&lt;/td&gt;
  &lt;td style=&quot;border: dotted windowtext 1.0pt; mso-border-alt: dotted windowtext .5pt; padding: .75pt .75pt .75pt .75pt;&quot; valign=&quot;top&quot;&gt;&lt;div class=&quot;MsoNormal&quot;&gt;
Boolean&lt;/div&gt;
&lt;/td&gt;
  &lt;td style=&quot;border: dotted windowtext 1.0pt; mso-border-alt: dotted windowtext .5pt; padding: .75pt .75pt .75pt .75pt;&quot; valign=&quot;top&quot;&gt;&lt;div class=&quot;MsoNormal&quot;&gt;
&quot;true&quot;&lt;/div&gt;
&lt;/td&gt;
 &lt;/tr&gt;
&lt;tr&gt;
  &lt;td style=&quot;border: dotted windowtext 1.0pt; mso-border-alt: dotted windowtext .5pt; padding: .75pt .75pt .75pt .75pt;&quot; valign=&quot;top&quot;&gt;&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;i&gt;isThreadSafe&lt;/i&gt;&lt;/div&gt;
&lt;/td&gt;
  &lt;td style=&quot;border: dotted windowtext 1.0pt; mso-border-alt: dotted windowtext .5pt; padding: .75pt .75pt .75pt .75pt;&quot; valign=&quot;top&quot;&gt;&lt;div class=&quot;MsoNormal&quot;&gt;
Boolean&lt;/div&gt;
&lt;/td&gt;
  &lt;td style=&quot;border: dotted windowtext 1.0pt; mso-border-alt: dotted windowtext .5pt; padding: .75pt .75pt .75pt .75pt;&quot; valign=&quot;top&quot;&gt;&lt;div class=&quot;MsoNormal&quot;&gt;
&quot;true&quot;&lt;/div&gt;
&lt;/td&gt;
 &lt;/tr&gt;
&lt;tr&gt;
  &lt;td style=&quot;border: dotted windowtext 1.0pt; mso-border-alt: dotted windowtext .5pt; padding: .75pt .75pt .75pt .75pt;&quot; valign=&quot;top&quot;&gt;&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;i&gt;errorPage&lt;/i&gt;&lt;/div&gt;
&lt;/td&gt;
  &lt;td style=&quot;border: dotted windowtext 1.0pt; mso-border-alt: dotted windowtext .5pt; padding: .75pt .75pt .75pt .75pt;&quot; valign=&quot;top&quot;&gt;&lt;div class=&quot;MsoNormal&quot;&gt;
URL&lt;/div&gt;
&lt;/td&gt;
  &lt;td style=&quot;border: dotted windowtext 1.0pt; mso-border-alt: dotted windowtext .5pt; padding: .75pt .75pt .75pt .75pt;&quot; valign=&quot;top&quot;&gt;&lt;div class=&quot;MsoNormal&quot;&gt;
None&lt;/div&gt;
&lt;/td&gt;
 &lt;/tr&gt;
&lt;tr&gt;
  &lt;td style=&quot;border: dotted windowtext 1.0pt; mso-border-alt: dotted windowtext .5pt; padding: .75pt .75pt .75pt .75pt;&quot; valign=&quot;top&quot;&gt;&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;i&gt;isErrorPage&lt;/i&gt;&lt;/div&gt;
&lt;/td&gt;
  &lt;td style=&quot;border: dotted windowtext 1.0pt; mso-border-alt: dotted windowtext .5pt; padding: .75pt .75pt .75pt .75pt;&quot; valign=&quot;top&quot;&gt;&lt;div class=&quot;MsoNormal&quot;&gt;
Boolean&lt;/div&gt;
&lt;/td&gt;
  &lt;td style=&quot;border: dotted windowtext 1.0pt; mso-border-alt: dotted windowtext .5pt; padding: .75pt .75pt .75pt .75pt;&quot; valign=&quot;top&quot;&gt;&lt;div class=&quot;MsoNormal&quot;&gt;
&quot;false&quot;&lt;/div&gt;
&lt;/td&gt;
 &lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;div style=&quot;text-align: left;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: left;&quot;&gt;
&lt;table border=&quot;1&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;MsoTableGrid&quot; style=&quot;background: #F2F2F2; border-collapse: collapse; border: none; mso-background-themecolor: background1; mso-background-themeshade: 242; mso-border-alt: dotted windowtext .5pt; mso-border-insideh: none; mso-border-insidev: none; mso-padding-alt: 0in 5.4pt 0in 5.4pt; mso-yfti-tbllook: 1184;&quot;&gt;
 &lt;tbody&gt;
&lt;tr&gt;
  &lt;td style=&quot;border-bottom: none; border: dotted windowtext 1.0pt; mso-border-left-alt: dotted windowtext .5pt; mso-border-right-alt: dotted windowtext .5pt; mso-border-top-alt: dotted windowtext .5pt; padding: 0in 5.4pt 0in 5.4pt; width: 6.65in;&quot; valign=&quot;top&quot; width=&quot;638&quot;&gt;&lt;div class=&quot;MsoNormal&quot; style=&quot;margin-bottom: .0001pt; margin-bottom: 0in;&quot;&gt;
NOTE:&lt;/div&gt;
&lt;/td&gt;
 &lt;/tr&gt;
&lt;tr&gt;
  &lt;td style=&quot;border-top: none; border: dotted windowtext 1.0pt; mso-border-bottom-alt: dotted windowtext .5pt; mso-border-left-alt: dotted windowtext .5pt; mso-border-right-alt: dotted windowtext .5pt; padding: 0in 5.4pt 0in 5.4pt; width: 6.65in;&quot; valign=&quot;top&quot; width=&quot;638&quot;&gt;&lt;ul type=&quot;disc&quot;&gt;&lt;li class=&quot;MsoNormal&quot;&gt;Except for
       the import attribute, JSP does not allow to repeat the same attribute
       within a page directive or in multiple directives on the same
       page.&amp;nbsp;&lt;/li&gt;&lt;/ul&gt;
&lt;/td&gt;
 &lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;div style=&quot;text-align: left;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: left;&quot;&gt;
&lt;b&gt;Page Attributes&lt;/b&gt; a little in-depth:&lt;/div&gt;

&lt;ul style=&quot;text-align: left;&quot;&gt;&lt;li&gt;&lt;span style=&quot;background-color: #f3f3f3;&quot;&gt;language&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;ul&gt;&lt;li&gt;&amp;lt;%@ page language=&quot;java&quot; %&amp;gt;&lt;/li&gt;&lt;li&gt;The only supported language by Tomcat JSP Container&lt;/li&gt;&lt;li&gt;Other JSP containers might accept different languages&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;&lt;span style=&quot;background-color: #f3f3f3;&quot;&gt;info&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;ul&gt;&lt;li&gt;&amp;lt;%@ page info=&quot;any string here&quot; %&amp;gt;&lt;/li&gt;&lt;li&gt;Can be retrieved by calling the method getServletInfo() from anywhere withing the page&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;&lt;span style=&quot;background-color: #f3f3f3;&quot;&gt;contentType&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;ul&gt;&lt;li&gt;&amp;lt;%@ page contentType=&quot;application/json; charset=UTF-8&quot; %&amp;gt;&amp;nbsp;&lt;/li&gt;&lt;li&gt;Defines MIME type of the HTTP response sent to the client&amp;nbsp;&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;&lt;span style=&quot;background-color: #f3f3f3;&quot;&gt;extends&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;ul&gt;&lt;li&gt;&amp;lt;%@ page extends=&quot;yourClass&quot; %&amp;gt;&lt;/li&gt;&lt;li&gt;Defines the parent class that will be inherited by the generated servlet of the current page&lt;/li&gt;&lt;li&gt;This attribute is less common&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;&lt;span style=&quot;background-color: #f3f3f3;&quot;&gt;import&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;ul&gt;&lt;li&gt;&amp;lt;%@ page import=&quot;java.io.*&quot; %&amp;gt;&lt;/li&gt;&lt;li&gt;One of the most common attributes used&lt;/li&gt;&lt;li&gt;Same as we do in java classes/interfaces&lt;/li&gt;&lt;li&gt;By default, tomcat imports the following packages:&lt;/li&gt;&lt;ul&gt;&lt;li&gt;javax.servlet.*&amp;nbsp;&lt;/li&gt;&lt;li&gt;javax.servlet.http.*&amp;nbsp;&lt;/li&gt;&lt;li&gt;javax.servlet.jsp.*&amp;nbsp;&lt;/li&gt;&lt;li&gt;javax.servlet.jsp.tagext.*&lt;/li&gt;&lt;li&gt;org.apache.jasper.runtime.*&lt;/li&gt;&lt;/ul&gt;&lt;/ul&gt;&lt;li&gt;&lt;span style=&quot;background-color: #f3f3f3;&quot;&gt;buffer&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;ul&gt;&lt;li&gt;&amp;lt;%@ page buffer=&quot;none&quot; %&amp;gt;&lt;/li&gt;&lt;li&gt;&amp;lt;%@ page buffer=&quot;20kb&quot; %&amp;gt;&lt;/li&gt;&lt;li&gt;&amp;lt;%@ page buffer=&quot;20&quot; %&amp;gt;&lt;/li&gt;&lt;li&gt;buffer=&quot;20&quot; is the same as &quot;20kb&quot;&lt;/li&gt;&lt;li&gt;But it&#39;s up to the JSP container to use its discretion to increase the buffer in order for the improved performance&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;&lt;span style=&quot;background-color: #f3f3f3;&quot;&gt;autoFlush&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;ul&gt;&lt;li&gt;&amp;lt;%@ page autoFlush=&quot;false&quot; %&amp;gt;&lt;/li&gt;&lt;li&gt;If true, the JSP container automatically flushes the buffer when it&#39;s full.&lt;/li&gt;&lt;li&gt;If false, the buffer can be flushed manually by the following statement:&amp;nbsp;&lt;/li&gt;&lt;ul&gt;&lt;li&gt;out.flush()&lt;/li&gt;&lt;/ul&gt;&lt;/ul&gt;&lt;li&gt;&lt;span style=&quot;background-color: #f3f3f3;&quot;&gt;session&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;ul&gt;&lt;li&gt;&amp;lt;%@ page session=&quot;true&quot; %&amp;gt;&lt;/li&gt;&lt;li&gt;By default, the session is set &quot;true&quot;, meaning the JSP page takes part in session management&lt;/li&gt;&lt;li&gt;It is wise and strongly advised not to set it true unless you specifically require it because this consumes resources.&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;&lt;span style=&quot;background-color: #f3f3f3;&quot;&gt;isThreadSafe&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;ul&gt;&lt;li&gt;&amp;lt;%@ page isThreadSafe=&quot;true&quot; %&amp;gt;&lt;/li&gt;&lt;li&gt;True indicates that the simultaneous access to this page is safe&lt;/li&gt;&lt;li&gt;False indicates that the simultaneous access to this page is not 
safe. In that case, the JSP container puts multiple requests in a queue 
and serves them only one at a time.&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;&lt;span style=&quot;background-color: #f3f3f3;&quot;&gt;errorPage&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;ul&gt;&lt;li&gt;&amp;lt;%@ page errorPage=&quot;MyErrorPage.jsp&quot; %&amp;gt;&lt;/li&gt;&lt;li&gt;Indicates the error page which is displayed if an uncaught exception occurs in the current page&lt;/li&gt;&lt;li&gt;The error page must have the page attribute isErrorPage=&quot;true&quot;&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;&lt;span style=&quot;background-color: #f3f3f3;&quot;&gt;isErrorPage&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;ul&gt;&lt;li&gt;&amp;lt;%@ page isErrorPage=&quot;true&quot; %&amp;gt;&lt;/li&gt;&lt;li&gt;If true, then only be set as an error page in other JSP pages&lt;/li&gt;&lt;li&gt;If true, this page has an access to the exception implicit object&lt;/li&gt;&lt;/ul&gt;&lt;/ul&gt;
&lt;i&gt;&lt;/i&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div style=&quot;text-align: left;&quot;&gt;
&lt;b&gt;2. Include directives&lt;/b&gt;&lt;br /&gt;
&lt;pre&gt;&lt;span style=&quot;background-color: #f3f3f3;&quot;&gt;&amp;lt;%@ include file=&quot;includes/Footer.html&quot; %&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;div style=&quot;text-align: left;&quot;&gt;
&lt;/div&gt;
&lt;ul style=&quot;text-align: left;&quot;&gt;&lt;li&gt;As the name suggest, Include Directive enables us to include the contents of other files in the current JSP page.&lt;/li&gt;&lt;li&gt;The included page can be static HTML page as well as dynamic JSP page.&lt;/li&gt;&lt;li&gt;Very commonly used to include Header page, Footer page or a page containing import statements and so on.&lt;/li&gt;&lt;/ul&gt;

&lt;div style=&quot;text-align: left;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: left;&quot;&gt;
&lt;b&gt;2. Taglib directives&lt;/b&gt;&lt;/div&gt;

&lt;ul style=&quot;text-align: left;&quot;&gt;&lt;li&gt;The taglib, or tag library, directive can be used to extend JSP 
functionality. It&#39;s a broad topic so it&#39;s not covered here at this 
moment. It will be covered under it&#39;s own topic later soon.&lt;/li&gt;&lt;/ul&gt;
&lt;br /&gt;
&lt;h3&gt;&lt;b&gt;SCRIPTING ELEMENTS&lt;/b&gt;&lt;/h3&gt;

&lt;div class=&quot;docText&quot;&gt;
Scripting elements allow you to insert Java code in your JSP 
pages. There are three types of scripting elements:&lt;/div&gt;
&lt;ul&gt;&lt;li&gt;
&lt;div class=&quot;docList&quot;&gt;
Scriptlets &lt;/div&gt;
&lt;/li&gt;&lt;li&gt;
&lt;div class=&quot;docList&quot;&gt;
Declarations &lt;/div&gt;
&lt;/li&gt;&lt;li&gt;
&lt;div class=&quot;docList&quot;&gt;
Expressions&amp;nbsp;&lt;/div&gt;
&lt;/li&gt;&lt;/ul&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;b&gt;1. Scriptlets&lt;/b&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;background-color: #f3f3f3;&quot;&gt;&amp;lt;% ... %&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;ul style=&quot;text-align: left;&quot;&gt;&lt;li&gt;Syntax looks similar to Directives. But don&#39;t get confused, Directives starts with &amp;lt;%@ i.e.&amp;nbsp;&lt;span style=&quot;background-color: #f3f3f3;&quot;&gt;&amp;lt;%@ ... %&amp;gt;&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;
&lt;div&gt;
&lt;table border=&quot;1&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;MsoTableGrid&quot; style=&quot;background: #F2F2F2; border-collapse: collapse; border: none; mso-background-themecolor: background1; mso-background-themeshade: 242; mso-border-alt: dotted windowtext .5pt; mso-border-insideh: .5pt dotted windowtext; mso-border-insidev: .5pt dotted windowtext; mso-padding-alt: 0in 5.4pt 0in 5.4pt; mso-yfti-tbllook: 1184;&quot;&gt;
 &lt;tbody&gt;
&lt;tr&gt;
  &lt;td style=&quot;border: dotted windowtext 1.0pt; mso-border-alt: dotted windowtext .5pt; padding: 0in 5.4pt 0in 5.4pt; width: 6.65in;&quot; valign=&quot;top&quot; width=&quot;638&quot;&gt;&lt;div class=&quot;MsoNormal&quot; style=&quot;margin-bottom: .0001pt; margin-bottom: 0in;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;margin-bottom: .0001pt; margin-bottom: 0in;&quot;&gt;
&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;; font-size: 10.0pt;&quot;&gt;&amp;lt;%&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;margin-bottom: .0001pt; margin-bottom: 0in;&quot;&gt;
&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;; font-size: 10.0pt;&quot;&gt;&amp;nbsp; try {&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;margin-bottom: .0001pt; margin-bottom: 0in;&quot;&gt;
&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;; font-size: 10.0pt;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;
  Class.forName(&quot;com.mysql.jdbc.Driver&quot;);&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;margin-bottom: .0001pt; margin-bottom: 0in;&quot;&gt;
&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;; font-size: 10.0pt;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; System.out.println(&quot;JDBC driver
  loaded&quot;);&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;margin-bottom: .0001pt; margin-bottom: 0in;&quot;&gt;
&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;; font-size: 10.0pt;&quot;&gt;&amp;nbsp; }&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;margin-bottom: .0001pt; margin-bottom: 0in;&quot;&gt;
&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;; font-size: 10.0pt;&quot;&gt;&amp;nbsp; catch (ClassNotFoundException e) {&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;margin-bottom: .0001pt; margin-bottom: 0in;&quot;&gt;
&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;; font-size: 10.0pt;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; System.out.println(e.toString());&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;margin-bottom: .0001pt; margin-bottom: 0in;&quot;&gt;
&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;; font-size: 10.0pt;&quot;&gt;&amp;nbsp; }&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;margin-bottom: .0001pt; margin-bottom: 0in;&quot;&gt;
&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;; font-size: 10.0pt;&quot;&gt;%&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;margin-bottom: .0001pt; margin-bottom: 0in;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;margin-bottom: .0001pt; margin-bottom: 0in;&quot;&gt;
&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;; font-size: 10.0pt;&quot;&gt;...&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;margin-bottom: .0001pt; margin-bottom: 0in;&quot;&gt;
&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;; font-size: 10.0pt;&quot;&gt;...&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;margin-bottom: .0001pt; margin-bottom: 0in;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;margin-bottom: .0001pt; margin-bottom: 0in;&quot;&gt;
&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;; font-size: 10.0pt;&quot;&gt;&amp;lt;%&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;margin-bottom: .0001pt; margin-bottom: 0in;&quot;&gt;
&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;; font-size: 10.0pt;&quot;&gt;out.println(&quot;You can
  do anything here&quot;);&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;margin-bottom: .0001pt; margin-bottom: 0in;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;margin-bottom: .0001pt; margin-bottom: 0in;&quot;&gt;
&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;; font-size: 10.0pt;&quot;&gt;String str = &quot;some
  string&quot;;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;margin-bottom: .0001pt; margin-bottom: 0in;&quot;&gt;
&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;; font-size: 10.0pt;&quot;&gt;str = str + &quot; string
  concatenation&quot;;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;margin-bottom: .0001pt; margin-bottom: 0in;&quot;&gt;
&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;; font-size: 10.0pt;&quot;&gt;out.println( str );&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;margin-bottom: .0001pt; margin-bottom: 0in;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;margin-bottom: .0001pt; margin-bottom: 0in;&quot;&gt;
&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;; font-size: 10.0pt;&quot;&gt;%&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;/td&gt;
 &lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;pre&gt;&lt;b&gt;2. Declarations&lt;/b&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span style=&quot;background-color: #f3f3f3;&quot;&gt;&amp;lt;%! ... %&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;ul style=&quot;text-align: left;&quot;&gt;&lt;li&gt;Used to declare methods and variables that can be used from any point in the JSP page.&lt;/li&gt;&lt;li&gt;Can appear anywhere throughout the page. For instance, a method declaration can 
appear above a page directive that imports a class, even though the class is 
used in the method.&lt;/li&gt;&lt;/ul&gt;
&lt;div&gt;
&lt;/div&gt;
&lt;table border=&quot;1&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;MsoTableGrid&quot; style=&quot;background: #F2F2F2; border-collapse: collapse; border: none; mso-background-themecolor: background1; mso-background-themeshade: 242; mso-border-alt: dotted windowtext .5pt; mso-border-insideh: .5pt dotted windowtext; mso-border-insidev: .5pt dotted windowtext; mso-padding-alt: 0in 5.4pt 0in 5.4pt; mso-yfti-tbllook: 1184;&quot;&gt;
 &lt;tbody&gt;
&lt;tr&gt;
  &lt;td style=&quot;border: dotted windowtext 1.0pt; mso-border-alt: dotted windowtext .5pt; padding: 0in 5.4pt 0in 5.4pt; width: 6.65in;&quot; valign=&quot;top&quot; width=&quot;638&quot;&gt;&lt;div class=&quot;MsoNormal&quot; style=&quot;margin-bottom: .0001pt; margin-bottom: 0in;&quot;&gt;
&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;; font-size: 10.0pt;&quot;&gt;&amp;lt;%! &lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;margin-bottom: .0001pt; margin-bottom: 0in;&quot;&gt;
&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;; font-size: 10.0pt;&quot;&gt;&amp;nbsp; String getSystemTime() {&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;margin-bottom: .0001pt; margin-bottom: 0in;&quot;&gt;
&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;; font-size: 10.0pt;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; return
  Calendar.getInstance().getTime().toString(); &lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;margin-bottom: .0001pt; margin-bottom: 0in;&quot;&gt;
&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;; font-size: 10.0pt;&quot;&gt;&amp;nbsp; } &lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;margin-bottom: .0001pt; margin-bottom: 0in;&quot;&gt;
&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;; font-size: 10.0pt;&quot;&gt;%&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;margin-bottom: .0001pt; margin-bottom: 0in;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;margin-bottom: .0001pt; margin-bottom: 0in;&quot;&gt;
&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;; font-size: 10.0pt;&quot;&gt;&amp;lt;%@ page
  import=&quot;java.util.Calendar&quot; %&amp;gt; &lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;margin-bottom: .0001pt; margin-bottom: 0in;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;margin-bottom: .0001pt; margin-bottom: 0in;&quot;&gt;
&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;; font-size: 10.0pt;&quot;&gt;&amp;lt;% &lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;margin-bottom: .0001pt; margin-bottom: 0in;&quot;&gt;
&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;; font-size: 10.0pt;&quot;&gt;&amp;nbsp; out.println(&quot;Current Time: &quot; +
  getSystemTime()); &lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;margin-bottom: .0001pt; margin-bottom: 0in;&quot;&gt;
&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;; font-size: 10.0pt;&quot;&gt;%&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;/td&gt;
 &lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;div style=&quot;text-align: left;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;b&gt;3. Expressions&amp;nbsp;&lt;/b&gt;&lt;br /&gt;
&lt;span style=&quot;background-color: #f3f3f3;&quot;&gt;&amp;lt;%= ... %&amp;gt; &lt;/span&gt;&lt;br /&gt;
&lt;ul style=&quot;text-align: left;&quot;&gt;&lt;li&gt;Expressions get evaluated when the JSP page is requested and their results are 
converted into a String and &lt;i&gt;fed to the print method of the out implicit object.&amp;nbsp;&lt;/i&gt;&lt;/li&gt;&lt;li&gt;If the result cannot be converted into a String, an error will be raised at 
translation time. If this is not detected at translation time, at 
request-processing time, a ClassCastException will be raised.&lt;/li&gt;&lt;li&gt;Don&#39;t need to add a semicolon at the end of an expression&lt;/li&gt;&lt;/ul&gt;
&lt;br /&gt;
Below is the two equivalent statements:&lt;br /&gt;
&lt;br /&gt;
&lt;table border=&quot;1&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;MsoTableGrid&quot; style=&quot;background: rgb(242, 242, 242); border-collapse: collapse; border: medium; text-align: left;&quot;&gt;
 &lt;tbody&gt;
&lt;tr&gt;
  &lt;td style=&quot;border: dotted windowtext 1.0pt; mso-border-alt: dotted windowtext .5pt; padding: 0in 5.4pt 0in 5.4pt; width: 6.65in;&quot; valign=&quot;top&quot; width=&quot;638&quot;&gt;&lt;div class=&quot;MsoNormal&quot; style=&quot;margin-bottom: .0001pt; margin-bottom: 0in;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;margin-bottom: .0001pt; margin-bottom: 0in;&quot;&gt;
&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;; font-size: 10.0pt;&quot;&gt;&amp;lt;!-- Expression --&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;margin-bottom: .0001pt; margin-bottom: 0in;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;margin-bottom: .0001pt; margin-bottom: 0in;&quot;&gt;
&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;; font-size: 10.0pt;&quot;&gt;&amp;lt;%= java.util.Calendar.getInstance().getTime()
  %&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;margin-bottom: .0001pt; margin-bottom: 0in;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;margin-bottom: .0001pt; margin-bottom: 0in;&quot;&gt;
&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;; font-size: 10.0pt;&quot;&gt;&amp;lt;!-- Equivalent
  Scriptlet --&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;margin-bottom: .0001pt; margin-bottom: 0in;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;margin-bottom: .0001pt; margin-bottom: 0in;&quot;&gt;
&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;; font-size: 10.0pt;&quot;&gt;&amp;lt;%
  out.print(java.util.Calendar.getInstance().getTime()); %&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;margin-bottom: .0001pt; margin-bottom: 0in;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;/td&gt;
 &lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;i&gt;&lt;br /&gt;&lt;br /&gt;&lt;/i&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.gtiwari333.com/feeds/4007515057254624207/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://blog.gtiwari333.com/2024/06/jsp-basics-java-server-pages.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8219113377173546175/posts/default/4007515057254624207'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8219113377173546175/posts/default/4007515057254624207'/><link rel='alternate' type='text/html' href='http://blog.gtiwari333.com/2024/06/jsp-basics-java-server-pages.html' title='JSP basics - Java Server Pages'/><author><name>GT</name><uri>http://www.blogger.com/profile/16923656636145211711</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8219113377173546175.post-4728128155498578439</id><published>2023-07-09T20:25:00.002+01:00</published><updated>2023-07-09T20:25:14.335+01:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Computer/Technology Tips"/><title type='text'>How to reset “Replace Toner” warning on Brother  MFC-L2710DW Printer</title><content type='html'>&lt;p&gt;&lt;span style=&quot;font-size: medium;&quot;&gt;&lt;b&gt;How to reset “Replace Toner” warning on Brother&amp;nbsp; MFC-L2710DW Printer and print ~100 more pages without replacing the toner!&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: medium;&quot;&gt;&lt;b&gt;&amp;nbsp;&lt;/b&gt;&lt;/span&gt;
&lt;/p&gt;&lt;ol style=&quot;text-align: left;&quot;&gt;&lt;li&gt;&lt;p style=&quot;line-height: 100%; margin-bottom: 0in;&quot;&gt;&lt;span style=&quot;font-weight: normal;&quot;&gt;Open&lt;/span&gt;
	the front cover.&lt;/p&gt;
	&lt;/li&gt;&lt;li&gt;&lt;p style=&quot;line-height: 100%; margin-bottom: 0in;&quot;&gt;Press &lt;b&gt;Clear&lt;/b&gt;
	and &lt;b&gt;Stop/Exit&lt;/b&gt; button simultaneously and press &lt;b&gt;Clear&lt;/b&gt;
	button once.&lt;/p&gt;
	&lt;/li&gt;&lt;li&gt;&lt;p style=&quot;line-height: 100%; margin-bottom: 0in;&quot;&gt;It will show
the following on the display:&lt;/p&gt;&lt;p style=&quot;line-height: 100%; margin-bottom: 0in; margin-left: 120px;&quot;&gt;&amp;nbsp;&lt;span style=&quot;font-family: Nimbus Mono PS;&quot;&gt;&lt;b&gt;Reset Menu&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;&lt;/ol&gt;
&lt;p style=&quot;line-height: 100%; margin-bottom: 0in;&quot;&gt;&lt;span style=&quot;font-family: Nimbus Mono PS;&quot;&gt;&lt;b&gt;		
   &lt;span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span&gt;&amp;nbsp; &lt;/span&gt;K.TNR-STR&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;ol start=&quot;4&quot;&gt;&lt;li&gt;&lt;p style=&quot;line-height: 100%; margin-bottom: 0in;&quot;&gt;Press &lt;b&gt;UP&lt;/b&gt;
	arrow once. It will show “&lt;span style=&quot;font-family: Nimbus Mono PS;&quot;&gt;&lt;b&gt;K.TNR-HC&lt;/b&gt;&lt;/span&gt;”.
	Press &lt;b&gt;OK.&lt;/b&gt;&lt;/p&gt;
	&lt;/li&gt;&lt;li&gt;&lt;p style=&quot;line-height: 100%; margin-bottom: 0in;&quot;&gt;Press &lt;b&gt;UP&lt;/b&gt;
	arrow for reset.&lt;/p&gt;
	&lt;/li&gt;&lt;li&gt;&lt;p style=&quot;line-height: 100%; margin-bottom: 0in;&quot;&gt;Close the
	cover. DONE!&lt;/p&gt;&lt;p style=&quot;line-height: 100%; margin-bottom: 0in;&quot;&gt;&amp;nbsp;&lt;/p&gt;&lt;p style=&quot;line-height: 100%; margin-bottom: 0in;&quot;&gt;NOW ENJOY! &lt;br /&gt;&lt;/p&gt;
&lt;/li&gt;&lt;/ol&gt;

&lt;p&gt;&lt;style type=&quot;text/css&quot;&gt;p { line-height: 115%; margin-bottom: 0.1in; background: transparent }&lt;/style&gt;&lt;/p&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.gtiwari333.com/feeds/4728128155498578439/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://blog.gtiwari333.com/2023/07/how-to-reset-replace-toner-warning-on.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8219113377173546175/posts/default/4728128155498578439'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8219113377173546175/posts/default/4728128155498578439'/><link rel='alternate' type='text/html' href='http://blog.gtiwari333.com/2023/07/how-to-reset-replace-toner-warning-on.html' title='How to reset “Replace Toner” warning on Brother  MFC-L2710DW Printer'/><author><name>GT</name><uri>http://www.blogger.com/profile/16923656636145211711</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8219113377173546175.post-6591639979922348946</id><published>2023-04-23T20:01:00.003+01:00</published><updated>2023-04-23T20:07:55.347+01:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Image Processing"/><category scheme="http://www.blogger.com/atom/ns#" term="java"/><category scheme="http://www.blogger.com/atom/ns#" term="pdf"/><title type='text'>Java PDF to Image Conversion using PDFBox</title><content type='html'>&lt;p&gt;Here are few snippets of code that you can use to convert a PDF file to images eg: tiff, png, multi-page tiff. It uses a open source library &lt;a href=&quot;https://pdfbox.apache.org/&quot; target=&quot;_blank&quot;&gt;PDFBox&lt;/a&gt; version 3&lt;br /&gt;&lt;/p&gt;&lt;p&gt;The Apache PDFBox&lt;sup&gt;®&lt;/sup&gt; library is an open source Java tool for working with
    PDF documents. This project allows creation of new PDF documents, manipulation of existing
    documents and the ability to extract content from documents.&lt;/p&gt;&lt;p&gt;PDFBox comes with following features:&lt;/p&gt;&lt;ul style=&quot;text-align: left;&quot;&gt;&lt;li&gt;Extract Unicode text from PDF files.&lt;/li&gt;&lt;li&gt;Split a single PDF into many files or merge multiple PDF files.&lt;/li&gt;&lt;li&gt;Extract data from PDF forms or fill a PDF form.&lt;/li&gt;&lt;li&gt;Validate PDF files against the PDF/A-1b standard.&lt;/li&gt;&lt;li&gt;Print a PDF file using the standard Java printing API.&lt;/li&gt;&lt;li&gt;Save PDFs as image files, such as PNG or JPEG.&lt;/li&gt;&lt;li&gt;Create a PDF from scratch, with embedded fonts and images.&lt;/li&gt;&lt;/ul&gt;&lt;h3 style=&quot;text-align: left;&quot;&gt;Convert PDF to PNG/JPG/BMP etc: &lt;span&gt;&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;&lt;/h3&gt;&lt;div style=&quot;background-color: #2b2b2b; color: #a9b7c6; font-family: &amp;quot;JetBrains Mono&amp;quot;, monospace; font-size: 9.8pt; white-space: pre;&quot;&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;public static void &lt;/span&gt;&lt;span style=&quot;color: #ffc66d;&quot;&gt;convertToSeparateImageFiles&lt;/span&gt;(File pdf&lt;span style=&quot;color: #cc7832;&quot;&gt;, &lt;/span&gt;String type) &lt;span style=&quot;color: #cc7832;&quot;&gt;throws &lt;/span&gt;Exception {&lt;br /&gt;    &lt;span style=&quot;color: #cc7832;&quot;&gt;int &lt;/span&gt;DPI = &lt;span style=&quot;color: #6897bb;&quot;&gt;300&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;    &lt;/span&gt;ImageType IMAGE_TYPE = ImageType.&lt;span style=&quot;color: #9876aa; font-style: italic;&quot;&gt;RGB&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;;&lt;/span&gt;&lt;span style=&quot;color: grey;&quot;&gt;//This can be GRAY,ARGB,BINARY, BGR&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: grey;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: grey;&quot;&gt;    &lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;try &lt;/span&gt;(PDDocument document = Loader.&lt;span style=&quot;font-style: italic;&quot;&gt;loadPDF&lt;/span&gt;(pdf)) {&lt;br /&gt;        PDFRenderer pdfRenderer = &lt;span style=&quot;color: #cc7832;&quot;&gt;new &lt;/span&gt;PDFRenderer(document)&lt;span style=&quot;color: #cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;        for &lt;/span&gt;(&lt;span style=&quot;color: #cc7832;&quot;&gt;int &lt;/span&gt;page = &lt;span style=&quot;color: #6897bb;&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;; &lt;/span&gt;page &amp;lt; document.getNumberOfPages()&lt;span style=&quot;color: #cc7832;&quot;&gt;; &lt;/span&gt;page++) {&lt;br /&gt;            BufferedImage bim = pdfRenderer.renderImageWithDPI(page&lt;span style=&quot;color: #cc7832;&quot;&gt;, &lt;/span&gt;DPI&lt;span style=&quot;color: #cc7832;&quot;&gt;, &lt;/span&gt;IMAGE_TYPE)&lt;span style=&quot;color: #cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;            &lt;/span&gt;File outputFile = &lt;span style=&quot;color: #cc7832;&quot;&gt;new &lt;/span&gt;File(pdf.getAbsoluteFile().getParent() + &lt;br /&gt;                    File.&lt;span style=&quot;color: #9876aa; font-style: italic;&quot;&gt;separator &lt;/span&gt;+ pdf.getName() + &lt;span style=&quot;color: #6a8759;&quot;&gt;&quot;-P-&quot; &lt;/span&gt;+ page + &lt;span style=&quot;color: #6a8759;&quot;&gt;&quot;.&quot; &lt;/span&gt;+ type)&lt;span style=&quot;color: #cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;            &lt;/span&gt;ImageIO.&lt;span style=&quot;font-style: italic;&quot;&gt;write&lt;/span&gt;(bim&lt;span style=&quot;color: #cc7832;&quot;&gt;, &lt;/span&gt;type&lt;span style=&quot;color: #cc7832;&quot;&gt;, &lt;/span&gt;outputFile)&lt;span style=&quot;color: #cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;        &lt;/span&gt;}&lt;br /&gt;    }&lt;br /&gt;}&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;h3 style=&quot;text-align: left;&quot;&gt;&lt;br /&gt;&lt;/h3&gt;&lt;h3 style=&quot;text-align: left;&quot;&gt;Convert PDF to PNG/JPG/BMP etc with compression &lt;br /&gt;&lt;/h3&gt;&lt;div style=&quot;background-color: #2b2b2b; color: #a9b7c6; font-family: &amp;quot;JetBrains Mono&amp;quot;, monospace; font-size: 9.8pt; white-space: pre;&quot;&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;public static void &lt;/span&gt;&lt;span style=&quot;color: #ffc66d;&quot;&gt;convertToSeparateImageFilesWithCompression&lt;/span&gt;(File pdf&lt;span style=&quot;color: #cc7832;&quot;&gt;, &lt;/span&gt;String type) &lt;span style=&quot;color: #cc7832;&quot;&gt;throws &lt;/span&gt;Exception {&lt;br /&gt;    &lt;span style=&quot;color: #cc7832;&quot;&gt;int &lt;/span&gt;DPI = &lt;span style=&quot;color: #6897bb;&quot;&gt;300&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;    &lt;/span&gt;ImageType IMAGE_TYPE = ImageType.&lt;span style=&quot;color: #9876aa; font-style: italic;&quot;&gt;RGB&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;;&lt;/span&gt;&lt;span style=&quot;color: grey;&quot;&gt;//This can be GRAY,ARGB,BINARY, BGR&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: grey;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: grey;&quot;&gt;    &lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;try &lt;/span&gt;(PDDocument document = Loader.&lt;span style=&quot;font-style: italic;&quot;&gt;loadPDF&lt;/span&gt;(pdf)) {&lt;br /&gt;        ImageWriter writer = &lt;span style=&quot;color: #cc7832;&quot;&gt;null;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;        try &lt;/span&gt;{&lt;br /&gt;            writer = ImageIO.&lt;span style=&quot;font-style: italic;&quot;&gt;getImageWritersByFormatName&lt;/span&gt;(type).next()&lt;span style=&quot;color: #cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;            &lt;/span&gt;ImageWriteParam params = writer.getDefaultWriteParam()&lt;span style=&quot;color: #cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;            &lt;/span&gt;params.setCompressionMode(ImageWriteParam.&lt;span style=&quot;color: #9876aa; font-style: italic;&quot;&gt;MODE_EXPLICIT&lt;/span&gt;)&lt;span style=&quot;color: #cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;            &lt;/span&gt;params.setCompressionQuality(&lt;span style=&quot;color: #6897bb;&quot;&gt;0.6f&lt;/span&gt;)&lt;span style=&quot;color: #cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;            &lt;/span&gt;PDFRenderer pdfRenderer = &lt;span style=&quot;color: #cc7832;&quot;&gt;new &lt;/span&gt;PDFRenderer(document)&lt;span style=&quot;color: #cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;            for &lt;/span&gt;(&lt;span style=&quot;color: #cc7832;&quot;&gt;int &lt;/span&gt;page = &lt;span style=&quot;color: #6897bb;&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;; &lt;/span&gt;page &amp;lt; document.getNumberOfPages()&lt;span style=&quot;color: #cc7832;&quot;&gt;; &lt;/span&gt;page++) {&lt;br /&gt;                BufferedImage bim = pdfRenderer.renderImageWithDPI(page&lt;span style=&quot;color: #cc7832;&quot;&gt;, &lt;/span&gt;DPI&lt;span style=&quot;color: #cc7832;&quot;&gt;, &lt;/span&gt;IMAGE_TYPE)&lt;span style=&quot;color: #cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;                &lt;/span&gt;File outputFile = &lt;span style=&quot;color: #cc7832;&quot;&gt;new &lt;/span&gt;File(pdf.getAbsoluteFile().getParent() +&lt;br /&gt;                        File.&lt;span style=&quot;color: #9876aa; font-style: italic;&quot;&gt;separator &lt;/span&gt;+ pdf.getName() + &lt;span style=&quot;color: #6a8759;&quot;&gt;&quot;-compressed-P-&quot; &lt;/span&gt;+ page + &lt;span style=&quot;color: #6a8759;&quot;&gt;&quot;.&quot; &lt;/span&gt;+ type)&lt;span style=&quot;color: #cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;                &lt;/span&gt;ImageOutputStream outputStream = &lt;span style=&quot;color: #cc7832;&quot;&gt;new &lt;/span&gt;FileImageOutputStream(outputFile)&lt;span style=&quot;color: #cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;                &lt;/span&gt;writer.setOutput(outputStream)&lt;span style=&quot;color: #cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;                &lt;/span&gt;writer.write(&lt;span style=&quot;color: #cc7832;&quot;&gt;null, new &lt;/span&gt;IIOImage(bim&lt;span style=&quot;color: #cc7832;&quot;&gt;, null, null&lt;/span&gt;)&lt;span style=&quot;color: #cc7832;&quot;&gt;, &lt;/span&gt;params)&lt;span style=&quot;color: #cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;            &lt;/span&gt;}&lt;br /&gt;        } &lt;span style=&quot;color: #cc7832;&quot;&gt;finally &lt;/span&gt;{&lt;br /&gt;            &lt;span style=&quot;color: #cc7832;&quot;&gt;if &lt;/span&gt;(writer != &lt;span style=&quot;color: #cc7832;&quot;&gt;null&lt;/span&gt;) {&lt;br /&gt;                writer.dispose()&lt;span style=&quot;color: #cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;            &lt;/span&gt;}&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;}&lt;/div&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;h3 style=&quot;text-align: left;&quot;&gt;&amp;nbsp;Convert PDF to single page tiff files&lt;/h3&gt;&lt;div style=&quot;background-color: #2b2b2b; color: #a9b7c6; font-family: &amp;quot;JetBrains Mono&amp;quot;, monospace; font-size: 9.8pt; white-space: pre;&quot;&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;public static void &lt;/span&gt;&lt;span style=&quot;color: #ffc66d;&quot;&gt;convertToSinglePageTiffs&lt;/span&gt;(File pdf) &lt;span style=&quot;color: #cc7832;&quot;&gt;throws &lt;/span&gt;Exception {&lt;br /&gt;    &lt;span style=&quot;color: #cc7832;&quot;&gt;int &lt;/span&gt;DPI = &lt;span style=&quot;color: #6897bb;&quot;&gt;300&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;    &lt;/span&gt;ImageType IMAGE_TYPE = ImageType.&lt;span style=&quot;color: #9876aa; font-style: italic;&quot;&gt;BINARY&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;;&lt;/span&gt;&lt;span style=&quot;color: grey;&quot;&gt;//This can be GRAY,ARGB,BINARY, BGR&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: grey;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: grey;&quot;&gt;    &lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;try &lt;/span&gt;(PDDocument document = Loader.&lt;span style=&quot;font-style: italic;&quot;&gt;loadPDF&lt;/span&gt;(pdf)) {&lt;br /&gt;&lt;br /&gt;        ImageWriter writer = &lt;span style=&quot;color: #cc7832;&quot;&gt;null;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;        try &lt;/span&gt;{&lt;br /&gt;            writer = ImageIO.&lt;span style=&quot;font-style: italic;&quot;&gt;getImageWritersByFormatName&lt;/span&gt;(&lt;span style=&quot;color: #6a8759;&quot;&gt;&quot;tiff&quot;&lt;/span&gt;).next()&lt;span style=&quot;color: #cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;            &lt;/span&gt;ImageWriteParam params = writer.getDefaultWriteParam()&lt;span style=&quot;color: #cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;            &lt;/span&gt;params.setCompressionMode(ImageWriteParam.&lt;span style=&quot;color: #9876aa; font-style: italic;&quot;&gt;MODE_EXPLICIT&lt;/span&gt;)&lt;span style=&quot;color: #cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;            &lt;/span&gt;&lt;span style=&quot;color: grey;&quot;&gt;// Compression Types: None, PackBits, ZLib, Deflate, LZW, JPEG and CCITT&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: grey;&quot;&gt;            &lt;/span&gt;params.setCompressionType(&lt;span style=&quot;color: #6a8759;&quot;&gt;&quot;LZW&quot;&lt;/span&gt;)&lt;span style=&quot;color: #cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;            &lt;/span&gt;params.setCompressionQuality(&lt;span style=&quot;color: #6897bb;&quot;&gt;0.8f&lt;/span&gt;)&lt;span style=&quot;color: #cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;            &lt;/span&gt;PDFRenderer pdfRenderer = &lt;span style=&quot;color: #cc7832;&quot;&gt;new &lt;/span&gt;PDFRenderer(document)&lt;span style=&quot;color: #cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;            for &lt;/span&gt;(&lt;span style=&quot;color: #cc7832;&quot;&gt;int &lt;/span&gt;page = &lt;span style=&quot;color: #6897bb;&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;; &lt;/span&gt;page &amp;lt; document.getNumberOfPages()&lt;span style=&quot;color: #cc7832;&quot;&gt;; &lt;/span&gt;page++) {&lt;br /&gt;                BufferedImage bim = pdfRenderer.renderImageWithDPI(page&lt;span style=&quot;color: #cc7832;&quot;&gt;, &lt;/span&gt;DPI&lt;span style=&quot;color: #cc7832;&quot;&gt;, &lt;/span&gt;IMAGE_TYPE)&lt;span style=&quot;color: #cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;                &lt;/span&gt;File outputFile = &lt;span style=&quot;color: #cc7832;&quot;&gt;new &lt;/span&gt;File(pdf.getAbsoluteFile().getParent() +&lt;br /&gt;                        File.&lt;span style=&quot;color: #9876aa; font-style: italic;&quot;&gt;separator &lt;/span&gt;+ pdf.getName() + &lt;span style=&quot;color: #6a8759;&quot;&gt;&quot;-compressed-P-&quot; &lt;/span&gt;+ page + &lt;span style=&quot;color: #6a8759;&quot;&gt;&quot;.tif&quot;&lt;/span&gt;)&lt;span style=&quot;color: #cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;                &lt;/span&gt;ImageOutputStream outputStream = &lt;span style=&quot;color: #cc7832;&quot;&gt;new &lt;/span&gt;FileImageOutputStream(outputFile)&lt;span style=&quot;color: #cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;                &lt;/span&gt;writer.setOutput(outputStream)&lt;span style=&quot;color: #cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;                &lt;/span&gt;writer.write(&lt;span style=&quot;color: #cc7832;&quot;&gt;null, new &lt;/span&gt;IIOImage(bim&lt;span style=&quot;color: #cc7832;&quot;&gt;, null, null&lt;/span&gt;)&lt;span style=&quot;color: #cc7832;&quot;&gt;, &lt;/span&gt;params)&lt;span style=&quot;color: #cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;            &lt;/span&gt;}&lt;br /&gt;        } &lt;span style=&quot;color: #cc7832;&quot;&gt;finally &lt;/span&gt;{&lt;br /&gt;            &lt;span style=&quot;color: #cc7832;&quot;&gt;if &lt;/span&gt;(writer != &lt;span style=&quot;color: #cc7832;&quot;&gt;null&lt;/span&gt;) {&lt;br /&gt;                writer.dispose()&lt;span style=&quot;color: #cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;            &lt;/span&gt;}&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;}&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;h3 style=&quot;text-align: left;&quot;&gt;Convert PDF to a multi-page tiff file&lt;/h3&gt;&lt;div style=&quot;background-color: #2b2b2b; color: #a9b7c6; font-family: &amp;quot;JetBrains Mono&amp;quot;, monospace; font-size: 9.8pt; white-space: pre;&quot;&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;public static void &lt;/span&gt;&lt;span style=&quot;color: #ffc66d;&quot;&gt;convertToMultipageTiff&lt;/span&gt;(File pdf&lt;span style=&quot;color: #cc7832;&quot;&gt;, &lt;/span&gt;File outputTiff) &lt;span style=&quot;color: #cc7832;&quot;&gt;throws &lt;/span&gt;Exception {&lt;br /&gt;    &lt;span style=&quot;color: #cc7832;&quot;&gt;int &lt;/span&gt;DPI = &lt;span style=&quot;color: #6897bb;&quot;&gt;300&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;    &lt;/span&gt;ImageType IMAGE_TYPE = ImageType.&lt;span style=&quot;color: #9876aa; font-style: italic;&quot;&gt;GRAY&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;;&lt;/span&gt;&lt;span style=&quot;color: grey;&quot;&gt;//This can be GRAY,ARGB,BINARY, BGR&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: grey;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: grey;&quot;&gt;    &lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;try &lt;/span&gt;(PDDocument document = Loader.&lt;span style=&quot;font-style: italic;&quot;&gt;loadPDF&lt;/span&gt;(pdf)) {&lt;br /&gt;        &lt;span style=&quot;color: #cc7832;&quot;&gt;try &lt;/span&gt;(ImageOutputStream ios = ImageIO.&lt;span style=&quot;font-style: italic;&quot;&gt;createImageOutputStream&lt;/span&gt;(outputTiff)) {&lt;br /&gt;&lt;br /&gt;            ImageWriter writer = &lt;span style=&quot;color: #cc7832;&quot;&gt;null;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;            try &lt;/span&gt;{&lt;br /&gt;                writer = ImageIO.&lt;span style=&quot;font-style: italic;&quot;&gt;getImageWritersByFormatName&lt;/span&gt;(&lt;span style=&quot;color: #6a8759;&quot;&gt;&quot;tiff&quot;&lt;/span&gt;).next()&lt;span style=&quot;color: #cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;                &lt;/span&gt;writer.setOutput(ios)&lt;span style=&quot;color: #cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;                &lt;/span&gt;writer.prepareWriteSequence(&lt;span style=&quot;color: #cc7832;&quot;&gt;null&lt;/span&gt;)&lt;span style=&quot;color: #cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;                &lt;/span&gt;ImageWriteParam params = writer.getDefaultWriteParam()&lt;span style=&quot;color: #cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;                &lt;/span&gt;params.setCompressionMode(ImageWriteParam.&lt;span style=&quot;color: #9876aa; font-style: italic;&quot;&gt;MODE_EXPLICIT&lt;/span&gt;)&lt;span style=&quot;color: #cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;                &lt;/span&gt;&lt;span style=&quot;color: grey;&quot;&gt;// Compression Types: None, PackBits, ZLib, Deflate, LZW, JPEG and CCITT&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: grey;&quot;&gt;                &lt;/span&gt;params.setCompressionType(&lt;span style=&quot;color: #6a8759;&quot;&gt;&quot;LZW&quot;&lt;/span&gt;)&lt;span style=&quot;color: #cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;                &lt;/span&gt;params.setCompressionQuality(&lt;span style=&quot;color: #6897bb;&quot;&gt;0.8f&lt;/span&gt;)&lt;span style=&quot;color: #cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;                &lt;/span&gt;PDFRenderer pdfRenderer = &lt;span style=&quot;color: #cc7832;&quot;&gt;new &lt;/span&gt;PDFRenderer(document)&lt;span style=&quot;color: #cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;                for &lt;/span&gt;(&lt;span style=&quot;color: #cc7832;&quot;&gt;int &lt;/span&gt;page = &lt;span style=&quot;color: #6897bb;&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;; &lt;/span&gt;page &amp;lt; document.getNumberOfPages()&lt;span style=&quot;color: #cc7832;&quot;&gt;; &lt;/span&gt;page++) {&lt;br /&gt;                    BufferedImage bim = pdfRenderer.renderImageWithDPI(page&lt;span style=&quot;color: #cc7832;&quot;&gt;, &lt;/span&gt;DPI&lt;span style=&quot;color: #cc7832;&quot;&gt;, &lt;/span&gt;IMAGE_TYPE)&lt;span style=&quot;color: #cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;                    &lt;/span&gt;IIOMetadata metadata = writer.getDefaultImageMetadata(&lt;span style=&quot;color: #cc7832;&quot;&gt;new &lt;/span&gt;ImageTypeSpecifier(bim)&lt;span style=&quot;color: #cc7832;&quot;&gt;, &lt;/span&gt;params)&lt;span style=&quot;color: #cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;                    &lt;/span&gt;writer.writeToSequence(&lt;span style=&quot;color: #cc7832;&quot;&gt;new &lt;/span&gt;IIOImage(bim&lt;span style=&quot;color: #cc7832;&quot;&gt;, null, &lt;/span&gt;metadata)&lt;span style=&quot;color: #cc7832;&quot;&gt;, &lt;/span&gt;params)&lt;span style=&quot;color: #cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;                &lt;/span&gt;}&lt;br /&gt;            } &lt;span style=&quot;color: #cc7832;&quot;&gt;finally &lt;/span&gt;{&lt;br /&gt;                &lt;span style=&quot;color: #cc7832;&quot;&gt;if &lt;/span&gt;(writer != &lt;span style=&quot;color: #cc7832;&quot;&gt;null&lt;/span&gt;) {&lt;br /&gt;                    writer.dispose()&lt;span style=&quot;color: #cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;                &lt;/span&gt;}&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;}&lt;/div&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;h2 style=&quot;text-align: left;&quot;&gt;Full code:&lt;/h2&gt;&lt;p&gt;Uses dependency:&lt;/p&gt;&lt;div style=&quot;background-color: #2b2b2b; color: #a9b7c6; font-family: &amp;quot;JetBrains Mono&amp;quot;, monospace; font-size: 9.8pt; white-space: pre;&quot;&gt;&lt;span style=&quot;color: #e8bf6a;&quot;&gt;&amp;lt;dependency&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #e8bf6a;&quot;&gt;    &amp;lt;groupId&amp;gt;&lt;/span&gt;org.apache.pdfbox&lt;span style=&quot;color: #e8bf6a;&quot;&gt;&amp;lt;/groupId&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #e8bf6a;&quot;&gt;    &amp;lt;artifactId&amp;gt;&lt;/span&gt;pdfbox&lt;span style=&quot;color: #e8bf6a;&quot;&gt;&amp;lt;/artifactId&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #e8bf6a;&quot;&gt;    &amp;lt;version&amp;gt;&lt;/span&gt;3.0.0-RC1&lt;span style=&quot;color: #e8bf6a;&quot;&gt;&amp;lt;/version&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #e8bf6a;&quot;&gt;&amp;lt;/dependency&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;div style=&quot;background-color: #2b2b2b; color: #a9b7c6; font-family: &amp;quot;JetBrains Mono&amp;quot;, monospace; font-size: 9.8pt; white-space: pre;&quot;&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;package &lt;/span&gt;pdf&lt;span style=&quot;color: #cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;import &lt;/span&gt;org.apache.pdfbox.Loader&lt;span style=&quot;color: #cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;import &lt;/span&gt;org.apache.pdfbox.pdmodel.PDDocument&lt;span style=&quot;color: #cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;import &lt;/span&gt;org.apache.pdfbox.rendering.ImageType&lt;span style=&quot;color: #cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;import &lt;/span&gt;org.apache.pdfbox.rendering.PDFRenderer&lt;span style=&quot;color: #cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;import &lt;/span&gt;javax.imageio.*&lt;span style=&quot;color: #cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;import &lt;/span&gt;javax.imageio.metadata.IIOMetadata&lt;span style=&quot;color: #cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;import &lt;/span&gt;javax.imageio.stream.FileImageOutputStream&lt;span style=&quot;color: #cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;import &lt;/span&gt;javax.imageio.stream.ImageOutputStream&lt;span style=&quot;color: #cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;import &lt;/span&gt;java.awt.image.BufferedImage&lt;span style=&quot;color: #cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;import &lt;/span&gt;java.io.File&lt;span style=&quot;color: #cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;public class &lt;/span&gt;PDFUtils {&lt;br /&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;public static void &lt;/span&gt;&lt;span style=&quot;color: #ffc66d;&quot;&gt;main&lt;/span&gt;(String[] args) &lt;span style=&quot;color: #cc7832;&quot;&gt;throws &lt;/span&gt;Exception {&lt;br /&gt;    File pdf = &lt;span style=&quot;color: #cc7832;&quot;&gt;new &lt;/span&gt;File(&lt;span style=&quot;color: #6a8759;&quot;&gt;&quot;test.pdf&quot;&lt;/span&gt;)&lt;span style=&quot;color: #cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;    &lt;/span&gt;&lt;span style=&quot;font-style: italic;&quot;&gt;convertToSeparateImageFiles&lt;/span&gt;(pdf&lt;span style=&quot;color: #cc7832;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: #6a8759;&quot;&gt;&quot;png&quot;&lt;/span&gt;)&lt;span style=&quot;color: #cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;    &lt;/span&gt;&lt;span style=&quot;font-style: italic;&quot;&gt;convertToSeparateImageFilesWithCompression&lt;/span&gt;(pdf&lt;span style=&quot;color: #cc7832;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: #6a8759;&quot;&gt;&quot;jpg&quot;&lt;/span&gt;)&lt;span style=&quot;color: #cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;    &lt;/span&gt;&lt;span style=&quot;color: grey;&quot;&gt;//tiff&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: grey;&quot;&gt;    &lt;/span&gt;&lt;span style=&quot;font-style: italic;&quot;&gt;convertToSinglePageTiffs&lt;/span&gt;(pdf)&lt;span style=&quot;color: #cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;    &lt;/span&gt;&lt;span style=&quot;font-style: italic;&quot;&gt;convertToMultipageTiff&lt;/span&gt;(pdf&lt;span style=&quot;color: #cc7832;&quot;&gt;, new &lt;/span&gt;File(pdf.getAbsoluteFile().getParent() +&lt;br /&gt;            File.&lt;span style=&quot;color: #9876aa; font-style: italic;&quot;&gt;separator &lt;/span&gt;+ pdf.getName() + &lt;span style=&quot;color: #6a8759;&quot;&gt;&quot;multi-page.tif&quot;&lt;/span&gt;))&lt;span style=&quot;color: #cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;&lt;br /&gt;&lt;/span&gt;}&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;public static void &lt;/span&gt;&lt;span style=&quot;color: #ffc66d;&quot;&gt;convertToSeparateImageFiles&lt;/span&gt;(File pdf&lt;span style=&quot;color: #cc7832;&quot;&gt;, &lt;/span&gt;String type) &lt;span style=&quot;color: #cc7832;&quot;&gt;throws &lt;/span&gt;Exception {&lt;br /&gt;    &lt;span style=&quot;color: #cc7832;&quot;&gt;int &lt;/span&gt;DPI = &lt;span style=&quot;color: #6897bb;&quot;&gt;300&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;    &lt;/span&gt;ImageType IMAGE_TYPE = ImageType.&lt;span style=&quot;color: #9876aa; font-style: italic;&quot;&gt;RGB&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;;&lt;/span&gt;&lt;span style=&quot;color: grey;&quot;&gt;//This can be GRAY,ARGB,BINARY, BGR&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: grey;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: grey;&quot;&gt;    &lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;try &lt;/span&gt;(PDDocument document = Loader.&lt;span style=&quot;font-style: italic;&quot;&gt;loadPDF&lt;/span&gt;(pdf)) {&lt;br /&gt;        PDFRenderer pdfRenderer = &lt;span style=&quot;color: #cc7832;&quot;&gt;new &lt;/span&gt;PDFRenderer(document)&lt;span style=&quot;color: #cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;        for &lt;/span&gt;(&lt;span style=&quot;color: #cc7832;&quot;&gt;int &lt;/span&gt;page = &lt;span style=&quot;color: #6897bb;&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;; &lt;/span&gt;page &amp;lt; document.getNumberOfPages()&lt;span style=&quot;color: #cc7832;&quot;&gt;; &lt;/span&gt;page++) {&lt;br /&gt;            BufferedImage bim = pdfRenderer.renderImageWithDPI(page&lt;span style=&quot;color: #cc7832;&quot;&gt;, &lt;/span&gt;DPI&lt;span style=&quot;color: #cc7832;&quot;&gt;, &lt;/span&gt;IMAGE_TYPE)&lt;span style=&quot;color: #cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;            &lt;/span&gt;File outputFile = &lt;span style=&quot;color: #cc7832;&quot;&gt;new &lt;/span&gt;File(pdf.getAbsoluteFile().getParent() +&lt;br /&gt;                    File.&lt;span style=&quot;color: #9876aa; font-style: italic;&quot;&gt;separator &lt;/span&gt;+ pdf.getName() + &lt;span style=&quot;color: #6a8759;&quot;&gt;&quot;-P-&quot; &lt;/span&gt;+ page + &lt;span style=&quot;color: #6a8759;&quot;&gt;&quot;.&quot; &lt;/span&gt;+ type)&lt;span style=&quot;color: #cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;            &lt;/span&gt;ImageIO.&lt;span style=&quot;font-style: italic;&quot;&gt;write&lt;/span&gt;(bim&lt;span style=&quot;color: #cc7832;&quot;&gt;, &lt;/span&gt;type&lt;span style=&quot;color: #cc7832;&quot;&gt;, &lt;/span&gt;outputFile)&lt;span style=&quot;color: #cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;        &lt;/span&gt;}&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;public static void &lt;/span&gt;&lt;span style=&quot;color: #ffc66d;&quot;&gt;convertToSeparateImageFilesWithCompression&lt;/span&gt;(File pdf&lt;span style=&quot;color: #cc7832;&quot;&gt;, &lt;/span&gt;String type) &lt;span style=&quot;color: #cc7832;&quot;&gt;throws &lt;/span&gt;Exception {&lt;br /&gt;    &lt;span style=&quot;color: #cc7832;&quot;&gt;int &lt;/span&gt;DPI = &lt;span style=&quot;color: #6897bb;&quot;&gt;300&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;    &lt;/span&gt;ImageType IMAGE_TYPE = ImageType.&lt;span style=&quot;color: #9876aa; font-style: italic;&quot;&gt;RGB&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;;&lt;/span&gt;&lt;span style=&quot;color: grey;&quot;&gt;//This can be GRAY,ARGB,BINARY, BGR&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: grey;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: grey;&quot;&gt;    &lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;try &lt;/span&gt;(PDDocument document = Loader.&lt;span style=&quot;font-style: italic;&quot;&gt;loadPDF&lt;/span&gt;(pdf)) {&lt;br /&gt;        ImageWriter writer = &lt;span style=&quot;color: #cc7832;&quot;&gt;null;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;        try &lt;/span&gt;{&lt;br /&gt;            writer = ImageIO.&lt;span style=&quot;font-style: italic;&quot;&gt;getImageWritersByFormatName&lt;/span&gt;(type).next()&lt;span style=&quot;color: #cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;            &lt;/span&gt;ImageWriteParam params = writer.getDefaultWriteParam()&lt;span style=&quot;color: #cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;            &lt;/span&gt;params.setCompressionMode(ImageWriteParam.&lt;span style=&quot;color: #9876aa; font-style: italic;&quot;&gt;MODE_EXPLICIT&lt;/span&gt;)&lt;span style=&quot;color: #cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;            &lt;/span&gt;params.setCompressionQuality(&lt;span style=&quot;color: #6897bb;&quot;&gt;0.6f&lt;/span&gt;)&lt;span style=&quot;color: #cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;            &lt;/span&gt;PDFRenderer pdfRenderer = &lt;span style=&quot;color: #cc7832;&quot;&gt;new &lt;/span&gt;PDFRenderer(document)&lt;span style=&quot;color: #cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;            for &lt;/span&gt;(&lt;span style=&quot;color: #cc7832;&quot;&gt;int &lt;/span&gt;page = &lt;span style=&quot;color: #6897bb;&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;; &lt;/span&gt;page &amp;lt; document.getNumberOfPages()&lt;span style=&quot;color: #cc7832;&quot;&gt;; &lt;/span&gt;page++) {&lt;br /&gt;                BufferedImage bim = pdfRenderer.renderImageWithDPI(page&lt;span style=&quot;color: #cc7832;&quot;&gt;, &lt;/span&gt;DPI&lt;span style=&quot;color: #cc7832;&quot;&gt;, &lt;/span&gt;IMAGE_TYPE)&lt;span style=&quot;color: #cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;                &lt;/span&gt;File outputFile = &lt;span style=&quot;color: #cc7832;&quot;&gt;new &lt;/span&gt;File(pdf.getAbsoluteFile().getParent() +&lt;br /&gt;                        File.&lt;span style=&quot;color: #9876aa; font-style: italic;&quot;&gt;separator &lt;/span&gt;+ pdf.getName() + &lt;span style=&quot;color: #6a8759;&quot;&gt;&quot;-compressed-P-&quot; &lt;/span&gt;+ page + &lt;span style=&quot;color: #6a8759;&quot;&gt;&quot;.&quot; &lt;/span&gt;+ type)&lt;span style=&quot;color: #cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;                &lt;/span&gt;ImageOutputStream outputStream = &lt;span style=&quot;color: #cc7832;&quot;&gt;new &lt;/span&gt;FileImageOutputStream(outputFile)&lt;span style=&quot;color: #cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;                &lt;/span&gt;writer.setOutput(outputStream)&lt;span style=&quot;color: #cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;                &lt;/span&gt;writer.write(&lt;span style=&quot;color: #cc7832;&quot;&gt;null, new &lt;/span&gt;IIOImage(bim&lt;span style=&quot;color: #cc7832;&quot;&gt;, null, null&lt;/span&gt;)&lt;span style=&quot;color: #cc7832;&quot;&gt;, &lt;/span&gt;params)&lt;span style=&quot;color: #cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;            &lt;/span&gt;}&lt;br /&gt;        } &lt;span style=&quot;color: #cc7832;&quot;&gt;finally &lt;/span&gt;{&lt;br /&gt;            &lt;span style=&quot;color: #cc7832;&quot;&gt;if &lt;/span&gt;(writer != &lt;span style=&quot;color: #cc7832;&quot;&gt;null&lt;/span&gt;) {&lt;br /&gt;                writer.dispose()&lt;span style=&quot;color: #cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;            &lt;/span&gt;}&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;public static void &lt;/span&gt;&lt;span style=&quot;color: #ffc66d;&quot;&gt;convertToSinglePageTiffs&lt;/span&gt;(File pdf) &lt;span style=&quot;color: #cc7832;&quot;&gt;throws &lt;/span&gt;Exception {&lt;br /&gt;    &lt;span style=&quot;color: #cc7832;&quot;&gt;int &lt;/span&gt;DPI = &lt;span style=&quot;color: #6897bb;&quot;&gt;300&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;    &lt;/span&gt;ImageType IMAGE_TYPE = ImageType.&lt;span style=&quot;color: #9876aa; font-style: italic;&quot;&gt;BINARY&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;;&lt;/span&gt;&lt;span style=&quot;color: grey;&quot;&gt;//This can be GRAY,ARGB,BINARY, BGR&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: grey;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: grey;&quot;&gt;    &lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;try &lt;/span&gt;(PDDocument document = Loader.&lt;span style=&quot;font-style: italic;&quot;&gt;loadPDF&lt;/span&gt;(pdf)) {&lt;br /&gt;&lt;br /&gt;        ImageWriter writer = &lt;span style=&quot;color: #cc7832;&quot;&gt;null;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;        try &lt;/span&gt;{&lt;br /&gt;            writer = ImageIO.&lt;span style=&quot;font-style: italic;&quot;&gt;getImageWritersByFormatName&lt;/span&gt;(&lt;span style=&quot;color: #6a8759;&quot;&gt;&quot;tiff&quot;&lt;/span&gt;).next()&lt;span style=&quot;color: #cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;            &lt;/span&gt;ImageWriteParam params = writer.getDefaultWriteParam()&lt;span style=&quot;color: #cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;            &lt;/span&gt;params.setCompressionMode(ImageWriteParam.&lt;span style=&quot;color: #9876aa; font-style: italic;&quot;&gt;MODE_EXPLICIT&lt;/span&gt;)&lt;span style=&quot;color: #cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;            &lt;/span&gt;&lt;span style=&quot;color: grey;&quot;&gt;// Compression Types: None, PackBits, ZLib, Deflate, LZW, JPEG and CCITT&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: grey;&quot;&gt;            &lt;/span&gt;params.setCompressionType(&lt;span style=&quot;color: #6a8759;&quot;&gt;&quot;LZW&quot;&lt;/span&gt;)&lt;span style=&quot;color: #cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;            &lt;/span&gt;params.setCompressionQuality(&lt;span style=&quot;color: #6897bb;&quot;&gt;0.8f&lt;/span&gt;)&lt;span style=&quot;color: #cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;            &lt;/span&gt;PDFRenderer pdfRenderer = &lt;span style=&quot;color: #cc7832;&quot;&gt;new &lt;/span&gt;PDFRenderer(document)&lt;span style=&quot;color: #cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;            for &lt;/span&gt;(&lt;span style=&quot;color: #cc7832;&quot;&gt;int &lt;/span&gt;page = &lt;span style=&quot;color: #6897bb;&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;; &lt;/span&gt;page &amp;lt; document.getNumberOfPages()&lt;span style=&quot;color: #cc7832;&quot;&gt;; &lt;/span&gt;page++) {&lt;br /&gt;                BufferedImage bim = pdfRenderer.renderImageWithDPI(page&lt;span style=&quot;color: #cc7832;&quot;&gt;, &lt;/span&gt;DPI&lt;span style=&quot;color: #cc7832;&quot;&gt;, &lt;/span&gt;IMAGE_TYPE)&lt;span style=&quot;color: #cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;                &lt;/span&gt;File outputFile = &lt;span style=&quot;color: #cc7832;&quot;&gt;new &lt;/span&gt;File(pdf.getAbsoluteFile().getParent() +&lt;br /&gt;                        File.&lt;span style=&quot;color: #9876aa; font-style: italic;&quot;&gt;separator &lt;/span&gt;+ pdf.getName() + &lt;span style=&quot;color: #6a8759;&quot;&gt;&quot;-compressed-P-&quot; &lt;/span&gt;+ page + &lt;span style=&quot;color: #6a8759;&quot;&gt;&quot;.tif&quot;&lt;/span&gt;)&lt;span style=&quot;color: #cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;                &lt;/span&gt;ImageOutputStream outputStream = &lt;span style=&quot;color: #cc7832;&quot;&gt;new &lt;/span&gt;FileImageOutputStream(outputFile)&lt;span style=&quot;color: #cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;                &lt;/span&gt;writer.setOutput(outputStream)&lt;span style=&quot;color: #cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;                &lt;/span&gt;writer.write(&lt;span style=&quot;color: #cc7832;&quot;&gt;null, new &lt;/span&gt;IIOImage(bim&lt;span style=&quot;color: #cc7832;&quot;&gt;, null, null&lt;/span&gt;)&lt;span style=&quot;color: #cc7832;&quot;&gt;, &lt;/span&gt;params)&lt;span style=&quot;color: #cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;            &lt;/span&gt;}&lt;br /&gt;        } &lt;span style=&quot;color: #cc7832;&quot;&gt;finally &lt;/span&gt;{&lt;br /&gt;            &lt;span style=&quot;color: #cc7832;&quot;&gt;if &lt;/span&gt;(writer != &lt;span style=&quot;color: #cc7832;&quot;&gt;null&lt;/span&gt;) {&lt;br /&gt;                writer.dispose()&lt;span style=&quot;color: #cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;            &lt;/span&gt;}&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;public static void &lt;/span&gt;&lt;span style=&quot;color: #ffc66d;&quot;&gt;convertToMultipageTiff&lt;/span&gt;(File pdf&lt;span style=&quot;color: #cc7832;&quot;&gt;, &lt;/span&gt;File outputTiff) &lt;span style=&quot;color: #cc7832;&quot;&gt;throws &lt;/span&gt;Exception {&lt;br /&gt;    &lt;span style=&quot;color: #cc7832;&quot;&gt;int &lt;/span&gt;DPI = &lt;span style=&quot;color: #6897bb;&quot;&gt;300&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;    &lt;/span&gt;ImageType IMAGE_TYPE = ImageType.&lt;span style=&quot;color: #9876aa; font-style: italic;&quot;&gt;GRAY&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;;&lt;/span&gt;&lt;span style=&quot;color: grey;&quot;&gt;//This can be GRAY,ARGB,BINARY, BGR&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: grey;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: grey;&quot;&gt;    &lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;try &lt;/span&gt;(PDDocument document = Loader.&lt;span style=&quot;font-style: italic;&quot;&gt;loadPDF&lt;/span&gt;(pdf)) {&lt;br /&gt;        &lt;span style=&quot;color: #cc7832;&quot;&gt;try &lt;/span&gt;(ImageOutputStream ios = ImageIO.&lt;span style=&quot;font-style: italic;&quot;&gt;createImageOutputStream&lt;/span&gt;(outputTiff)) {&lt;br /&gt;&lt;br /&gt;            ImageWriter writer = &lt;span style=&quot;color: #cc7832;&quot;&gt;null;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;            try &lt;/span&gt;{&lt;br /&gt;                writer = ImageIO.&lt;span style=&quot;font-style: italic;&quot;&gt;getImageWritersByFormatName&lt;/span&gt;(&lt;span style=&quot;color: #6a8759;&quot;&gt;&quot;tiff&quot;&lt;/span&gt;).next()&lt;span style=&quot;color: #cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;                &lt;/span&gt;writer.setOutput(ios)&lt;span style=&quot;color: #cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;                &lt;/span&gt;writer.prepareWriteSequence(&lt;span style=&quot;color: #cc7832;&quot;&gt;null&lt;/span&gt;)&lt;span style=&quot;color: #cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;                &lt;/span&gt;ImageWriteParam params = writer.getDefaultWriteParam()&lt;span style=&quot;color: #cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;                &lt;/span&gt;params.setCompressionMode(ImageWriteParam.&lt;span style=&quot;color: #9876aa; font-style: italic;&quot;&gt;MODE_EXPLICIT&lt;/span&gt;)&lt;span style=&quot;color: #cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;                &lt;/span&gt;&lt;span style=&quot;color: grey;&quot;&gt;// Compression Types: None, PackBits, ZLib, Deflate, LZW, JPEG and CCITT&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: grey;&quot;&gt;                &lt;/span&gt;params.setCompressionType(&lt;span style=&quot;color: #6a8759;&quot;&gt;&quot;LZW&quot;&lt;/span&gt;)&lt;span style=&quot;color: #cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;                &lt;/span&gt;params.setCompressionQuality(&lt;span style=&quot;color: #6897bb;&quot;&gt;0.8f&lt;/span&gt;)&lt;span style=&quot;color: #cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;                &lt;/span&gt;PDFRenderer pdfRenderer = &lt;span style=&quot;color: #cc7832;&quot;&gt;new &lt;/span&gt;PDFRenderer(document)&lt;span style=&quot;color: #cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;                for &lt;/span&gt;(&lt;span style=&quot;color: #cc7832;&quot;&gt;int &lt;/span&gt;page = &lt;span style=&quot;color: #6897bb;&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;; &lt;/span&gt;page &amp;lt; document.getNumberOfPages()&lt;span style=&quot;color: #cc7832;&quot;&gt;; &lt;/span&gt;page++) {&lt;br /&gt;                    BufferedImage bim = pdfRenderer.renderImageWithDPI(page&lt;span style=&quot;color: #cc7832;&quot;&gt;, &lt;/span&gt;DPI&lt;span style=&quot;color: #cc7832;&quot;&gt;, &lt;/span&gt;IMAGE_TYPE)&lt;span style=&quot;color: #cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;                    &lt;/span&gt;IIOMetadata metadata = writer.getDefaultImageMetadata(&lt;span style=&quot;color: #cc7832;&quot;&gt;new &lt;/span&gt;ImageTypeSpecifier(bim)&lt;span style=&quot;color: #cc7832;&quot;&gt;, &lt;/span&gt;params)&lt;span style=&quot;color: #cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;                    &lt;/span&gt;writer.writeToSequence(&lt;span style=&quot;color: #cc7832;&quot;&gt;new &lt;/span&gt;IIOImage(bim&lt;span style=&quot;color: #cc7832;&quot;&gt;, null, &lt;/span&gt;metadata)&lt;span style=&quot;color: #cc7832;&quot;&gt;, &lt;/span&gt;params)&lt;span style=&quot;color: #cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;                &lt;/span&gt;}&lt;br /&gt;            } &lt;span style=&quot;color: #cc7832;&quot;&gt;finally &lt;/span&gt;{&lt;br /&gt;                &lt;span style=&quot;color: #cc7832;&quot;&gt;if &lt;/span&gt;(writer != &lt;span style=&quot;color: #cc7832;&quot;&gt;null&lt;/span&gt;) {&lt;br /&gt;                    writer.dispose()&lt;span style=&quot;color: #cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;                &lt;/span&gt;}&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;}&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.gtiwari333.com/feeds/6591639979922348946/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://blog.gtiwari333.com/2023/04/java-pdf-to-image-conversion-using.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8219113377173546175/posts/default/6591639979922348946'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8219113377173546175/posts/default/6591639979922348946'/><link rel='alternate' type='text/html' href='http://blog.gtiwari333.com/2023/04/java-pdf-to-image-conversion-using.html' title='Java PDF to Image Conversion using PDFBox'/><author><name>GT</name><uri>http://www.blogger.com/profile/16923656636145211711</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8219113377173546175.post-4901376689524075126</id><published>2021-12-02T00:57:00.003+00:00</published><updated>2021-12-02T00:57:26.927+00:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="git"/><title type='text'>git reset/revert to previous commit</title><content type='html'>&lt;p&gt;Sometimes we &quot;accidentally&quot; merge something that&#39;s not ready for release/qa&amp;nbsp; and need to rollback/reset/revert the commits to a cleaner state.&lt;/p&gt;&lt;p&gt;Here&#39;s how you can safely reset your git to previous commit:&lt;/p&gt;&lt;p&gt;1) find the older commit id to where you want to reset.&lt;/p&gt;&lt;p&gt;2) do &lt;span style=&quot;background-color: #eeeeee;&quot;&gt;&lt;span style=&quot;color: #444444;&quot;&gt;git status&lt;/span&gt;&lt;/span&gt; to confirm there are no uncommitted changes on the current branch&amp;nbsp;&amp;nbsp;&lt;/p&gt;&lt;p&gt;3) reset to a commit, &lt;br /&gt;&lt;/p&gt;&lt;pre style=&quot;background-color: #2b2b2b; color: #a9b7c6; font-family: &amp;quot;JetBrains Mono&amp;quot;, monospace;&quot;&gt;&lt;span style=&quot;font-size: medium;&quot;&gt;git reset --hard COMMIT_ID&lt;br /&gt;git reset HEAD@{1}&lt;br /&gt;git add .&lt;br /&gt;git commit -m &quot;reverting to commit COMMIT_ID&quot;&lt;/span&gt;&lt;/pre&gt;&lt;p&gt;4) cherry pick or patch any other commit that you like to add&lt;/p&gt;&lt;br /&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.gtiwari333.com/feeds/4901376689524075126/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://blog.gtiwari333.com/2021/12/git-resetrevert-to-previous-commit.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8219113377173546175/posts/default/4901376689524075126'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8219113377173546175/posts/default/4901376689524075126'/><link rel='alternate' type='text/html' href='http://blog.gtiwari333.com/2021/12/git-resetrevert-to-previous-commit.html' title='git reset/revert to previous commit'/><author><name>GT</name><uri>http://www.blogger.com/profile/16923656636145211711</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8219113377173546175.post-5686877861834615141</id><published>2021-07-17T01:10:00.006+01:00</published><updated>2021-07-17T01:14:45.692+01:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Hibernate"/><category scheme="http://www.blogger.com/atom/ns#" term="java"/><category scheme="http://www.blogger.com/atom/ns#" term="spring-framework"/><title type='text'>How to make integration tests faster without @DirtiesContext</title><content type='html'>&lt;p style=&quot;text-align: center;&quot;&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;&lt;b&gt;If your only excuse to use @DirtiesContext is to re-initialize database between tests, then this blog post is for you.&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Spring&#39;s @DirtiesContext is very useful to make your integration tests faster by indicating the underlying Spring ApplicationContext is modified and forcing it to reload the context (&lt;b&gt;not the whole application)&lt;/b&gt; between tests.&lt;/p&gt;&lt;p&gt;This is particularly useful when we want to reset the state of database between tests. This allows us to group many tests together in a same class so that we can easily share some test data, assertions etc. So your test code would look this this:&lt;/p&gt;&lt;pre style=&quot;background-color: #2b2b2b; color: #a9b7c6; font-family: &amp;quot;JetBrains Mono&amp;quot;, monospace; font-size: 9.8pt;&quot;&gt;&lt;span style=&quot;color: #bbb529;&quot;&gt;@SpringBootTest&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #bbb529;&quot;&gt;@DirtiesContext&lt;/span&gt;(classMode = &lt;span style=&quot;color: #9876aa; font-style: italic;&quot;&gt;AFTER_EACH_TEST_METHOD&lt;/span&gt;)&lt;br /&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;class &lt;/span&gt;SomeTest {&lt;br /&gt;&lt;br /&gt;    @Autowired SomeService &lt;span style=&quot;color: #9876aa;&quot;&gt;serv&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;    &lt;/span&gt;@Autowired DataCreator &lt;span style=&quot;color: #9876aa;&quot;&gt;dc&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;    &lt;/span&gt;&lt;span style=&quot;color: #bbb529;&quot;&gt;@Test&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #bbb529;&quot;&gt;    &lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;void &lt;/span&gt;&lt;span style=&quot;color: #ffc66d;&quot;&gt;someTest1&lt;/span&gt;() {&lt;br /&gt;        &lt;span style=&quot;color: grey;&quot;&gt;//prepare data&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: grey;&quot;&gt;        &lt;/span&gt;&lt;span style=&quot;color: #9876aa;&quot;&gt;dc&lt;/span&gt;.initData()&lt;span style=&quot;color: #cc7832;&quot;&gt;;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;        &lt;/span&gt;&lt;span style=&quot;color: grey;&quot;&gt;//run test&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: grey;&quot;&gt;        &lt;/span&gt;&lt;span style=&quot;color: #9876aa;&quot;&gt;serv&lt;/span&gt;.modifySomeData()&lt;span style=&quot;color: #cc7832;&quot;&gt;;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;        &lt;/span&gt;&lt;span style=&quot;color: grey;&quot;&gt;//verify &lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: grey;&quot;&gt;    &lt;/span&gt;}&lt;br /&gt;&lt;br /&gt;    &lt;span style=&quot;color: #bbb529;&quot;&gt;@Test&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #bbb529;&quot;&gt;    &lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;void &lt;/span&gt;&lt;span style=&quot;color: #ffc66d;&quot;&gt;someTest2&lt;/span&gt;() {&lt;br /&gt;        &lt;span style=&quot;color: grey;&quot;&gt;//prepare data&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: grey;&quot;&gt;        &lt;/span&gt;&lt;span style=&quot;color: #9876aa;&quot;&gt;dc&lt;/span&gt;.initData(&lt;span style=&quot;color: #6897bb;&quot;&gt;2&lt;/span&gt;)&lt;span style=&quot;color: #cc7832;&quot;&gt;;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;        &lt;/span&gt;&lt;span style=&quot;color: grey;&quot;&gt;//run test&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: grey;&quot;&gt;        &lt;/span&gt;&lt;span style=&quot;color: #9876aa;&quot;&gt;serv&lt;/span&gt;.modifyAnotherData()&lt;span style=&quot;color: #cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;        &lt;/span&gt;&lt;span style=&quot;color: #9876aa;&quot;&gt;serv&lt;/span&gt;.doSomethingElse()&lt;span style=&quot;color: #cc7832;&quot;&gt;;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;        &lt;/span&gt;&lt;span style=&quot;color: grey;&quot;&gt;//verify &lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: grey;&quot;&gt;    &lt;/span&gt;}&lt;br /&gt;}&lt;/pre&gt;&lt;h4 style=&quot;text-align: left;&quot;&gt;Problem with @DirtiesContext &lt;br /&gt;&lt;/h4&gt;&lt;p&gt;This has one major flaw though. By resetting the ApplicationContext, it would also drop all the databases and need to re-create them after every test. So, if the only reason to use @DirtiesContext is to reset the database, then there&#39;s a better way of doing this.&lt;/p&gt;&lt;h4 style=&quot;text-align: left;&quot;&gt;Is deleting records from all table not a good solution? &lt;br /&gt;&lt;/h4&gt;&lt;p&gt;Correct. Deleting records is still a slow operation. When you have a good amount to test data, the @DirtiesContext can sometimes becomes faster than deleting the records one by one. Also, there&#39;s referential integrity between tables that enforces you to follow a series of deletes to first delete records from child tables and go up.&amp;nbsp; &lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;h4 style=&quot;text-align: left;&quot;&gt;&lt;b&gt;Table Truncate to the rescue&lt;/b&gt;&lt;/h4&gt;&lt;p&gt;Truncate (truncate table X) is faster way to delete records from database than deleting records. If we already know the list of table and join tables then we can loop through them and execute the TRUNCATE TABLE command. One advantage of this approach is that we can skip truncating some lookup tables that will always have constant records. &lt;br /&gt;&lt;/p&gt;&lt;h4 style=&quot;text-align: left;&quot;&gt;How to Truncate H2 Tables:&lt;/h4&gt;&lt;div style=&quot;text-align: left;&quot;&gt;Note that before we execute the TRUNCATE TABLE we should disable the referential integrity.&lt;br /&gt;&lt;/div&gt;&lt;pre style=&quot;background-color: #2b2b2b; color: #a9b7c6; font-family: &amp;quot;JetBrains Mono&amp;quot;, monospace; font-size: 9.8pt;&quot;&gt;&lt;span style=&quot;color: #9876aa;&quot;&gt;em&lt;/span&gt;.createNativeQuery(&lt;span style=&quot;color: #6a8759;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;background-color: #364135; color: #6a8759;&quot;&gt;SET REFERENTIAL_INTEGRITY FALSE&lt;/span&gt;&lt;span style=&quot;color: #6a8759;&quot;&gt;&quot;&lt;/span&gt;).executeUpdate()&lt;span style=&quot;color: #cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;for &lt;/span&gt;(String t : &lt;span style=&quot;color: #9876aa;&quot;&gt;tableNames&lt;/span&gt;) {&lt;br /&gt;    &lt;span style=&quot;color: #9876aa;&quot;&gt;em&lt;/span&gt;.createNativeQuery(&lt;span style=&quot;color: #6a8759;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;background-color: #364135; color: #6a8759;&quot;&gt;TRUNCATE TABLE &lt;/span&gt;&lt;span style=&quot;color: #6a8759;&quot;&gt;&quot; &lt;/span&gt;+ t ).executeUpdate()&lt;span style=&quot;color: #cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;}&lt;br /&gt;&lt;span style=&quot;color: #9876aa;&quot;&gt;em&lt;/span&gt;.createNativeQuery(&lt;span style=&quot;color: #6a8759;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;background-color: #364135; color: #6a8759;&quot;&gt;SET REFERENTIAL_INTEGRITY TRUE&lt;/span&gt;&lt;span style=&quot;color: #6a8759;&quot;&gt;&quot;&lt;/span&gt;).executeUpdate()&lt;span style=&quot;color: #cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;h4 style=&quot;text-align: left;&quot;&gt;Integrating everything together (&lt;a href=&quot;https://github.com/gtiwari333/spring-boot-blog-app&quot; target=&quot;_blank&quot;&gt;Sample App @ GitHub&lt;/a&gt;):&lt;/h4&gt;&lt;p&gt;TestDataManager &lt;a href=&quot;https://blog.gtiwari333.com/2021/07/jpahibernate-get-find-all-table-and.html&quot; target=&quot;_blank&quot;&gt;to grab list of tables&lt;/a&gt;, truncate and populate the test data: &lt;br /&gt;&lt;/p&gt;&lt;pre style=&quot;background-color: #2b2b2b; color: #a9b7c6; font-family: &amp;quot;JetBrains Mono&amp;quot;, monospace; font-size: 9.8pt;&quot;&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;import &lt;/span&gt;gt.app.DataCreator&lt;span style=&quot;color: #cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;import &lt;/span&gt;gt.app.config.MetadataExtractorIntegrator&lt;span style=&quot;color: #cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;import &lt;/span&gt;lombok.&lt;span style=&quot;color: #bbb529;&quot;&gt;RequiredArgsConstructor&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;import &lt;/span&gt;org.hibernate.boot.Metadata&lt;span style=&quot;color: #cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;import &lt;/span&gt;org.hibernate.mapping.Collection&lt;span style=&quot;color: #cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;import &lt;/span&gt;org.hibernate.mapping.PersistentClass&lt;span style=&quot;color: #cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;import &lt;/span&gt;org.springframework.beans.factory.InitializingBean&lt;span style=&quot;color: #cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;import &lt;/span&gt;org.springframework.stereotype.&lt;span style=&quot;color: #bbb529;&quot;&gt;Service&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;import &lt;/span&gt;org.springframework.transaction.annotation.&lt;span style=&quot;color: #bbb529;&quot;&gt;Transactional&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;import &lt;/span&gt;javax.persistence.EntityManager&lt;span style=&quot;color: #cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;import &lt;/span&gt;java.util.ArrayList&lt;span style=&quot;color: #cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;import &lt;/span&gt;java.util.List&lt;span style=&quot;color: #cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #bbb529;&quot;&gt;@Service&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #bbb529;&quot;&gt;@RequiredArgsConstructor&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;public class &lt;/span&gt;TestDataManager &lt;span style=&quot;color: #cc7832;&quot;&gt;implements &lt;/span&gt;InitializingBean {&lt;br /&gt;    &lt;span style=&quot;color: #cc7832;&quot;&gt;final &lt;/span&gt;EntityManager &lt;span style=&quot;color: #9876aa;&quot;&gt;em&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;    final &lt;/span&gt;DataCreator &lt;span style=&quot;color: #9876aa;&quot;&gt;dataCreator&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;    private final &lt;/span&gt;List&amp;lt;String&amp;gt; &lt;span style=&quot;color: #9876aa;&quot;&gt;tableNames &lt;/span&gt;= &lt;span style=&quot;color: #cc7832;&quot;&gt;new &lt;/span&gt;ArrayList&amp;lt;&amp;gt;()&lt;span style=&quot;color: #cc7832;&quot;&gt;; &lt;/span&gt;&lt;span style=&quot;color: grey;&quot;&gt;//shared&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: grey;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: grey;&quot;&gt;    &lt;/span&gt;&lt;span style=&quot;color: #bbb529;&quot;&gt;@Override&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #bbb529;&quot;&gt;    &lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;public void &lt;/span&gt;&lt;span style=&quot;color: #ffc66d;&quot;&gt;afterPropertiesSet&lt;/span&gt;() {&lt;br /&gt;        Metadata metadata = MetadataExtractorIntegrator.&lt;span style=&quot;color: #9876aa; font-style: italic;&quot;&gt;INSTANCE&lt;/span&gt;.getMetadata()&lt;span style=&quot;color: #cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;        for &lt;/span&gt;(Collection persistentClass : metadata.getCollectionBindings()) {&lt;br /&gt;            &lt;span style=&quot;color: #9876aa;&quot;&gt;tableNames&lt;/span&gt;.add(persistentClass.getCollectionTable().getExportIdentifier())&lt;span style=&quot;color: #cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;        &lt;/span&gt;}&lt;br /&gt;&lt;br /&gt;        &lt;span style=&quot;color: #cc7832;&quot;&gt;for &lt;/span&gt;(PersistentClass persistentClass : metadata.getEntityBindings()) {&lt;br /&gt;            &lt;span style=&quot;color: #9876aa;&quot;&gt;tableNames&lt;/span&gt;.add(persistentClass.getTable().getExportIdentifier())&lt;span style=&quot;color: #cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;        &lt;/span&gt;}&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    &lt;span style=&quot;color: #bbb529;&quot;&gt;@Transactional&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #bbb529;&quot;&gt;    &lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;public void &lt;/span&gt;&lt;span style=&quot;color: #ffc66d;&quot;&gt;truncateTablesAndRecreate&lt;/span&gt;() {&lt;br /&gt;        truncateTables()&lt;span style=&quot;color: #cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;        &lt;/span&gt;&lt;span style=&quot;color: #9876aa;&quot;&gt;dataCreator&lt;/span&gt;.initData()&lt;span style=&quot;color: #cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;    &lt;/span&gt;}&lt;br /&gt;&lt;br /&gt;    &lt;span style=&quot;color: #cc7832;&quot;&gt;void &lt;/span&gt;&lt;span style=&quot;color: #ffc66d;&quot;&gt;truncateTables&lt;/span&gt;() {&lt;br /&gt;        &lt;span style=&quot;color: #9876aa;&quot;&gt;em&lt;/span&gt;.createNativeQuery(&lt;span style=&quot;color: #6a8759;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;background-color: #364135; color: #6a8759;&quot;&gt;SET REFERENTIAL_INTEGRITY FALSE&lt;/span&gt;&lt;span style=&quot;color: #6a8759;&quot;&gt;&quot;&lt;/span&gt;).executeUpdate()&lt;span style=&quot;color: #cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;        for &lt;/span&gt;(String tableName : &lt;span style=&quot;color: #9876aa;&quot;&gt;tableNames&lt;/span&gt;) {&lt;br /&gt;            &lt;span style=&quot;color: #9876aa;&quot;&gt;em&lt;/span&gt;.createNativeQuery(&lt;span style=&quot;color: #6a8759;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;background-color: #364135; color: #6a8759;&quot;&gt;TRUNCATE TABLE &lt;/span&gt;&lt;span style=&quot;color: #6a8759;&quot;&gt;&quot; &lt;/span&gt;+ tableName).executeUpdate()&lt;span style=&quot;color: #cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;        &lt;/span&gt;}&lt;br /&gt;        &lt;span style=&quot;color: #9876aa;&quot;&gt;em&lt;/span&gt;.createNativeQuery(&lt;span style=&quot;color: #6a8759;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;background-color: #364135; color: #6a8759;&quot;&gt;SET REFERENTIAL_INTEGRITY TRUE&lt;/span&gt;&lt;span style=&quot;color: #6a8759;&quot;&gt;&quot;&lt;/span&gt;).executeUpdate()&lt;span style=&quot;color: #cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;    &lt;/span&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;Call the truncateTablesAndRecreate() @BeforeEach test&lt;br /&gt;&lt;/p&gt;&lt;pre style=&quot;background-color: #2b2b2b; color: #a9b7c6; font-family: &amp;quot;JetBrains Mono&amp;quot;, monospace; font-size: 9.8pt;&quot;&gt;&lt;span style=&quot;color: #bbb529;&quot;&gt;@SpringBootTest&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;class &lt;/span&gt;WebAppIT {&lt;br /&gt;&lt;br /&gt;    &lt;span style=&quot;color: #bbb529;&quot;&gt;@Autowired&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #bbb529;&quot;&gt;    &lt;/span&gt;TestDataManager tdm&lt;span style=&quot;color: #cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;    &lt;/span&gt;&lt;span style=&quot;color: #bbb529;&quot;&gt;@BeforeEach&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #bbb529;&quot;&gt;    &lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;void resetDB&lt;/span&gt;(){&lt;br /&gt;        tdm.truncateTablesAndRecreate()&lt;span style=&quot;color: #cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;    &lt;/span&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;h2 style=&quot;text-align: left;&quot;&gt;&amp;nbsp;&lt;/h2&gt;&lt;h4 style=&quot;text-align: left;&quot;&gt;This is awesome, how about other databases?&lt;br /&gt;&lt;/h4&gt;&lt;p&gt;&lt;b&gt;To get a List of tables: &lt;/b&gt;You can rely on &lt;a href=&quot;https://blog.gtiwari333.com/2021/07/jpahibernate-get-find-all-table-and.html&quot; target=&quot;_blank&quot;&gt;Hibernate&#39;s Metadata to grab list of table/join tables&lt;/a&gt;.&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;b&gt;Truncate command: &lt;/b&gt;Each database has different command to set the referential integrity and truncate. This above example is for H2.&lt;/p&gt;&lt;p&gt;You can do the following for MySQL&lt;/p&gt;&lt;pre style=&quot;background-color: #2b2b2b; color: #a9b7c6; font-family: &amp;quot;JetBrains Mono&amp;quot;, monospace; font-size: 9.8pt;&quot;&gt;&lt;br /&gt;&lt;span style=&quot;color: grey;&quot;&gt;//for MySQL:&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #9876aa;&quot;&gt;em&lt;/span&gt;.createNativeQuery(&lt;span style=&quot;color: #6a8759;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;background-color: #364135; color: #6a8759;&quot;&gt;SET @@foreign_key_checks = 0&lt;/span&gt;&lt;span style=&quot;color: #6a8759;&quot;&gt;&quot;&lt;/span&gt;).executeUpdate()&lt;span style=&quot;color: #cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;for &lt;/span&gt;(String tableName : &lt;span style=&quot;color: #9876aa;&quot;&gt;tableNames&lt;/span&gt;) {&lt;br /&gt;    &lt;span style=&quot;color: #9876aa;&quot;&gt;em&lt;/span&gt;.createNativeQuery(&lt;span style=&quot;color: #6a8759;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;background-color: #364135; color: #6a8759;&quot;&gt;TRUNCATE TABLE &lt;/span&gt;&lt;span style=&quot;color: #6a8759;&quot;&gt;&quot; &lt;/span&gt;+ tableName).executeUpdate()&lt;span style=&quot;color: #cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;}&lt;br /&gt;&lt;span style=&quot;color: #9876aa;&quot;&gt;em&lt;/span&gt;.createNativeQuery(&lt;span style=&quot;color: #6a8759;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;background-color: #364135; color: #6a8759;&quot;&gt;SET @@foreign_key_checks = 1&lt;/span&gt;&lt;span style=&quot;color: #6a8759;&quot;&gt;&quot;&lt;/span&gt;).executeUpdate()&lt;span style=&quot;color: #cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;For other populate databases, you can take reference from Hibernate&#39;s Test code itself. They are available at:&lt;a href=&quot;https://github.com/hibernate/hibernate-orm/tree/main/hibernate-testing/src/main/java/org/hibernate/testing/cleaner&quot; target=&quot;_blank&quot;&gt; Hibernate GitHub&lt;/a&gt;. The *Cleaner classes have code snippet that describes how to perform truncate on each database.&lt;br /&gt;&lt;/p&gt;&lt;h4 style=&quot;text-align: left;&quot;&gt;How fast the tests ran after this update?&lt;/h4&gt;&lt;p&gt;Very fast! In a big application (Spring Boot, H2) with 62 tables and 315 tests that were using @DirtiesContext, we reduced our test execution time from 18 minutes to 4minutes.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;h4 style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;font-size: medium;&quot;&gt;&lt;b&gt;Full working example is available &lt;a href=&quot;https://github.com/gtiwari333/spring-boot-blog-app/blob/master/src/test/java/gt/app/frwk/TestDataManager.java&quot; target=&quot;_blank&quot;&gt;at this sample app&lt;/a&gt;.&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.gtiwari333.com/feeds/5686877861834615141/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://blog.gtiwari333.com/2021/07/making-integration-tests-faster-without.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8219113377173546175/posts/default/5686877861834615141'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8219113377173546175/posts/default/5686877861834615141'/><link rel='alternate' type='text/html' href='http://blog.gtiwari333.com/2021/07/making-integration-tests-faster-without.html' title='How to make integration tests faster without @DirtiesContext'/><author><name>GT</name><uri>http://www.blogger.com/profile/16923656636145211711</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8219113377173546175.post-7107783707557742549</id><published>2021-07-16T23:49:00.003+01:00</published><updated>2021-07-16T23:49:32.848+01:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Hibernate"/><category scheme="http://www.blogger.com/atom/ns#" term="java"/><category scheme="http://www.blogger.com/atom/ns#" term="spring-framework"/><title type='text'>JPA/Hibernate get find all Table and Column metadata </title><content type='html'>&lt;div&gt;&lt;h3 style=&quot;text-align: left;&quot;&gt;How to use Hibernate Metadata to find All columns and tables&lt;br /&gt;&lt;/h3&gt;&lt;p&gt;Getting the Hibernate&#39;s Metadata object into the Spring application is tricky. Luckily, Hibernate Provides an Integrator API (org.hibernate.integrator.spi.Integrator) that we can use to customize/interact with Hibernate. Its the same API that Caching, Bean Validation etc library uses to integrate with Hibernate.&amp;nbsp;&lt;/p&gt;&lt;p&gt;Also, Spring Boot provides HibernatePropertiesCustomizer to link the &#39;hibernate.integrator_provider&#39; property to Integrator implementation.&lt;/p&gt;&lt;p&gt;Here&#39;s how we can configure the Hibernate Integrator to read metadata.&lt;/p&gt;&lt;h3 style=&quot;text-align: left;&quot;&gt;Step 1) create a extractor implementation&lt;/h3&gt;&lt;p&gt;This class is a singleton class and does absolutely nothing other than exposing the Metadata and Database. Since this is singleton this class and the database, metadata objects can be statically accessed using MetadataExtractorIntegrator.INSTANCE&lt;br /&gt;&lt;/p&gt;&lt;pre style=&quot;background-color: #2b2b2b; color: #a9b7c6; font-family: &#39;JetBrains Mono&#39;,monospace; font-size: 9.8pt;&quot;&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;import &lt;/span&gt;lombok.&lt;span style=&quot;color: #bbb529;&quot;&gt;Data&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;import &lt;/span&gt;org.hibernate.boot.Metadata&lt;span style=&quot;color: #cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;import &lt;/span&gt;org.hibernate.boot.model.relational.Database&lt;span style=&quot;color: #cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;import &lt;/span&gt;org.hibernate.engine.spi.SessionFactoryImplementor&lt;span style=&quot;color: #cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;import &lt;/span&gt;org.hibernate.integrator.spi.Integrator&lt;span style=&quot;color: #cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;import &lt;/span&gt;org.hibernate.service.spi.SessionFactoryServiceRegistry&lt;span style=&quot;color: #cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #bbb529;&quot;&gt;@Data&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;public class &lt;/span&gt;MetadataExtractorIntegrator &lt;span style=&quot;color: #cc7832;&quot;&gt;implements &lt;/span&gt;Integrator {&lt;br /&gt;&lt;br /&gt;    &lt;span style=&quot;color: #cc7832;&quot;&gt;public static final &lt;/span&gt;MetadataExtractorIntegrator &lt;span style=&quot;color: #9876aa; font-style: italic;&quot;&gt;INSTANCE &lt;/span&gt;= &lt;br /&gt;                            &lt;span style=&quot;color: #cc7832;&quot;&gt;new &lt;/span&gt;MetadataExtractorIntegrator()&lt;span style=&quot;color: #cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;    private &lt;/span&gt;Database &lt;span style=&quot;color: #9876aa;&quot;&gt;database&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;    private &lt;/span&gt;Metadata &lt;span style=&quot;color: #9876aa;&quot;&gt;metadata&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;    &lt;/span&gt;&lt;span style=&quot;color: #bbb529;&quot;&gt;@Override&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #bbb529;&quot;&gt;    &lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;public void &lt;/span&gt;&lt;span style=&quot;color: #ffc66d;&quot;&gt;integrate&lt;/span&gt;(Metadata metadata&lt;span style=&quot;color: #cc7832;&quot;&gt;, &lt;/span&gt;SessionFactoryImplementor sf&lt;span style=&quot;color: #cc7832;&quot;&gt;, &lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;                          &lt;/span&gt;SessionFactoryServiceRegistry sr) {&lt;br /&gt;        &lt;span style=&quot;color: #cc7832;&quot;&gt;this&lt;/span&gt;.&lt;span style=&quot;color: #9876aa;&quot;&gt;database &lt;/span&gt;= metadata.getDatabase()&lt;span style=&quot;color: #cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;        this&lt;/span&gt;.&lt;span style=&quot;color: #9876aa;&quot;&gt;metadata &lt;/span&gt;= metadata&lt;span style=&quot;color: #cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;    &lt;/span&gt;}&lt;br /&gt;&lt;br /&gt;    &lt;span style=&quot;color: #bbb529;&quot;&gt;@Override&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #bbb529;&quot;&gt;    &lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;public void &lt;/span&gt;&lt;span style=&quot;color: #ffc66d;&quot;&gt;disintegrate&lt;/span&gt;(SessionFactoryImplementor sf&lt;span style=&quot;color: #cc7832;&quot;&gt;, &lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;                             &lt;/span&gt;SessionFactoryServiceRegistry sr) {&lt;br /&gt;    }&lt;br /&gt;}&lt;/pre&gt;&lt;h3 style=&quot;text-align: left;&quot;&gt;Step 2) Register the Spring Hibernate Customizer&lt;/h3&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;div&gt;&lt;pre style=&quot;background-color: #2b2b2b; color: #a9b7c6; font-family: &#39;JetBrains Mono&#39;,monospace; font-size: 9.8pt;&quot;&gt;&lt;br /&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;import &lt;/span&gt;org.hibernate.jpa.boot.spi.IntegratorProvider&lt;span style=&quot;color: #cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;import &lt;/span&gt;org.springframework.boot.autoconfigure.orm.jpa.HibernatePropertiesCustomizer&lt;span style=&quot;color: #cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;import &lt;/span&gt;org.springframework.context.annotation.&lt;span style=&quot;color: #bbb529;&quot;&gt;Configuration&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;import &lt;/span&gt;java.util.List&lt;span style=&quot;color: #cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;import &lt;/span&gt;java.util.Map&lt;span style=&quot;color: #cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #bbb529;&quot;&gt;@Configuration&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;public class &lt;/span&gt;HibernateConfig &lt;span style=&quot;color: #cc7832;&quot;&gt;implements &lt;/span&gt;HibernatePropertiesCustomizer {&lt;br /&gt;    &lt;span style=&quot;color: #bbb529;&quot;&gt;@Override&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #bbb529;&quot;&gt;    &lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;public void &lt;/span&gt;&lt;span style=&quot;color: #ffc66d;&quot;&gt;customize&lt;/span&gt;(Map&amp;lt;String&lt;span style=&quot;color: #cc7832;&quot;&gt;, &lt;/span&gt;Object&amp;gt; hibernateProps) {&lt;br /&gt;        hibernateProps.put(&lt;span style=&quot;color: #6a8759;&quot;&gt;&quot;hibernate.integrator_provider&quot;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;,&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;            &lt;/span&gt;(IntegratorProvider) () -&amp;gt; List.&lt;span style=&quot;font-style: italic;&quot;&gt;of&lt;/span&gt;(MetadataExtractorIntegrator.&lt;span style=&quot;color: #9876aa; font-style: italic;&quot;&gt;INSTANCE&lt;/span&gt;))&lt;span style=&quot;color: #cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;    &lt;/span&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;h3 style=&quot;text-align: left;&quot;&gt;Step 3) Use MetadataExtractorIntegrator.metadata to extract the metadata&lt;/h3&gt;&lt;p&gt;This is a simple Spring Component that uses Metadata.getCollectionBindings and Metadata.getEntityBindings to extract the tables, columns, PK and type &lt;br /&gt;&lt;/p&gt;&lt;pre style=&quot;background-color: #2b2b2b; color: #a9b7c6; font-family: &#39;JetBrains Mono&#39;,monospace; font-size: 9.8pt;&quot;&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;import &lt;/span&gt;lombok.&lt;span style=&quot;color: #bbb529;&quot;&gt;RequiredArgsConstructor&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;import &lt;/span&gt;lombok.extern.slf4j.&lt;span style=&quot;color: #bbb529;&quot;&gt;Slf4j&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;import &lt;/span&gt;org.hibernate.boot.Metadata&lt;span style=&quot;color: #cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;import &lt;/span&gt;org.hibernate.mapping.*&lt;span style=&quot;color: #cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;import &lt;/span&gt;org.springframework.beans.factory.InitializingBean&lt;span style=&quot;color: #cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;import &lt;/span&gt;org.springframework.stereotype.&lt;span style=&quot;color: #bbb529;&quot;&gt;Component&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;import &lt;/span&gt;javax.persistence.EntityManager&lt;span style=&quot;color: #cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;import &lt;/span&gt;java.util.Iterator&lt;span style=&quot;color: #cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #bbb529;&quot;&gt;@Component&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #bbb529;&quot;&gt;@RequiredArgsConstructor&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #bbb529;&quot;&gt;@Slf4j&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;public class &lt;/span&gt;DBMetadataReader &lt;span style=&quot;color: #cc7832;&quot;&gt;implements &lt;/span&gt;InitializingBean {&lt;br /&gt;    &lt;span style=&quot;color: #cc7832;&quot;&gt;final &lt;/span&gt;EntityManager &lt;span style=&quot;color: #9876aa;&quot;&gt;em&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;    &lt;/span&gt;&lt;span style=&quot;color: #bbb529;&quot;&gt;@Override&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #bbb529;&quot;&gt;    &lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;public void &lt;/span&gt;&lt;span style=&quot;color: #ffc66d;&quot;&gt;afterPropertiesSet&lt;/span&gt;() {&lt;br /&gt;&lt;br /&gt;        Metadata metadata = MetadataExtractorIntegrator.&lt;span style=&quot;color: #9876aa; font-style: italic;&quot;&gt;INSTANCE&lt;/span&gt;.getMetadata()&lt;span style=&quot;color: #cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;        &lt;/span&gt;&lt;span style=&quot;color: grey;&quot;&gt;//Collection tables&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: grey;&quot;&gt;        &lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;for &lt;/span&gt;(Collection c : metadata.getCollectionBindings()) {&lt;br /&gt;            &lt;span style=&quot;color: #9876aa; font-style: italic;&quot;&gt;log&lt;/span&gt;.info(&lt;span style=&quot;color: #6a8759;&quot;&gt;&quot;Collection table: {}&quot;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;, &lt;/span&gt;c.getCollectionTable().getQualifiedTableName())&lt;span style=&quot;color: #cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;            for &lt;/span&gt;(Iterator&amp;lt;Column&amp;gt; it = c.getCollectionTable().getColumnIterator()&lt;span style=&quot;color: #cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;                 &lt;/span&gt;it.hasNext()&lt;span style=&quot;color: #cc7832;&quot;&gt;; &lt;/span&gt;) {&lt;br /&gt;                Column property = it.next()&lt;span style=&quot;color: #cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;                &lt;/span&gt;&lt;span style=&quot;color: #9876aa; font-style: italic;&quot;&gt;log&lt;/span&gt;.info(&lt;span style=&quot;color: #6a8759;&quot;&gt;&quot;   {}   {} &quot;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;, &lt;/span&gt;property.getName()&lt;span style=&quot;color: #cc7832;&quot;&gt;, &lt;/span&gt;property.getSqlType())&lt;span style=&quot;color: #cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;            &lt;/span&gt;}&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        &lt;span style=&quot;color: grey;&quot;&gt;//all entities&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: grey;&quot;&gt;        &lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;for &lt;/span&gt;(PersistentClass pc : metadata.getEntityBindings()) {&lt;br /&gt;            Table table = pc.getTable()&lt;span style=&quot;color: #cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;            &lt;/span&gt;&lt;span style=&quot;color: #9876aa; font-style: italic;&quot;&gt;log&lt;/span&gt;.info(&lt;span style=&quot;color: #6a8759;&quot;&gt;&quot;Entity: {} - {}&quot;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;, &lt;/span&gt;pc.getClassName()&lt;span style=&quot;color: #cc7832;&quot;&gt;, &lt;/span&gt;table.getName())&lt;span style=&quot;color: #cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;            &lt;/span&gt;KeyValue identifier = pc.getIdentifier()&lt;span style=&quot;color: #cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;            &lt;/span&gt;&lt;span style=&quot;color: grey;&quot;&gt;//PK&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: grey;&quot;&gt;            &lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;for &lt;/span&gt;(Iterator&amp;lt;Selectable&amp;gt; it = identifier.getColumnIterator()&lt;span style=&quot;color: #cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;                 &lt;/span&gt;it.hasNext()&lt;span style=&quot;color: #cc7832;&quot;&gt;; &lt;/span&gt;) {&lt;br /&gt;                Column column = (Column) it.next()&lt;span style=&quot;color: #cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;                &lt;/span&gt;&lt;span style=&quot;color: #9876aa; font-style: italic;&quot;&gt;log&lt;/span&gt;.info(&lt;span style=&quot;color: #6a8759;&quot;&gt;&quot;    PK: {}  {}&quot;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;, &lt;/span&gt;column.getName()&lt;span style=&quot;color: #cc7832;&quot;&gt;, &lt;/span&gt;column.getSqlType())&lt;span style=&quot;color: #cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;            &lt;/span&gt;}&lt;br /&gt;&lt;br /&gt;            &lt;span style=&quot;color: grey;&quot;&gt;//property/columns&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: grey;&quot;&gt;            &lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;for &lt;/span&gt;(Iterator it = pc.getPropertyIterator()&lt;span style=&quot;color: #cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;                 &lt;/span&gt;it.hasNext()&lt;span style=&quot;color: #cc7832;&quot;&gt;; &lt;/span&gt;) {&lt;br /&gt;                Property property = (Property) it.next()&lt;span style=&quot;color: #cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;                for &lt;/span&gt;(Iterator columnIterator = property.getColumnIterator()&lt;span style=&quot;color: #cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;                     &lt;/span&gt;columnIterator.hasNext()&lt;span style=&quot;color: #cc7832;&quot;&gt;; &lt;/span&gt;) {&lt;br /&gt;                    Column column = (Column) columnIterator.next()&lt;span style=&quot;color: #cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;                    &lt;/span&gt;&lt;span style=&quot;color: #9876aa; font-style: italic;&quot;&gt;log&lt;/span&gt;.info(&lt;span style=&quot;color: #6a8759;&quot;&gt;&quot;    {}  {}&quot;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;, &lt;/span&gt;column.getName()&lt;span style=&quot;color: #cc7832;&quot;&gt;, &lt;/span&gt;column.getSqlType())&lt;span style=&quot;color: #cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;                &lt;/span&gt;}&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;}&lt;/pre&gt;&lt;h3 style=&quot;text-align: left;&quot;&gt;Example Project:&lt;/h3&gt;&lt;p&gt;Checkout my &lt;a href=&quot;https://github.com/gtiwari333/spring-boot-blog-app&quot; target=&quot;_blank&quot;&gt;sample github project &lt;/a&gt;and &lt;a href=&quot;https://github.com/gtiwari333/spring-boot-blog-app/blob/master/src/test/java/gt/app/config/DBMetadataReader.java&quot; target=&quot;_blank&quot;&gt;the source&lt;/a&gt; for working example&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.gtiwari333.com/feeds/7107783707557742549/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://blog.gtiwari333.com/2021/07/jpahibernate-get-find-all-table-and.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8219113377173546175/posts/default/7107783707557742549'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8219113377173546175/posts/default/7107783707557742549'/><link rel='alternate' type='text/html' href='http://blog.gtiwari333.com/2021/07/jpahibernate-get-find-all-table-and.html' title='JPA/Hibernate get find all Table and Column metadata '/><author><name>GT</name><uri>http://www.blogger.com/profile/16923656636145211711</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8219113377173546175.post-7315242848774097181</id><published>2021-07-08T04:44:00.005+01:00</published><updated>2021-07-10T07:08:07.033+01:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="java"/><category scheme="http://www.blogger.com/atom/ns#" term="spring-framework"/><title type='text'>SpringFox Swagger with Groovy - fixing slow startup / heap space error</title><content type='html'>&lt;h4 style=&quot;text-align: center;&quot;&gt;Story of how we reduced app startup time by 20x and heap usage by 7x&lt;br&gt;&lt;/h4&gt;&lt;p&gt;Few months ago, we started developing a &lt;a href=&quot;https://spring.io/projects/spring-boot&quot; target=&quot;_blank&quot;&gt;Spring Boot&lt;/a&gt; app in Groovy. It is a typical app with ton of CRUD logic and few REST endpoints. It also had a Swagger UI configured with &lt;a href=&quot;https://github.com/springfox/springfox&quot; target=&quot;_blank&quot;&gt;SpringFox Swagger&lt;/a&gt;.  Though it was taking ~35 seconds to start and taking ~700MB heap space, no-one in the team really cared about the slowness and memory usage of the application.&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;As our application grew bigger, we added more DB tables and endpoints which resulted in further slowness and required more heap space. It was ~3 minutes startup with almost 1.4GB heap at its worst state. Again no-one really bothered to fix it... until the application randomly failed to start and started crashing randomly with OutOfMemoryError.&lt;br&gt;&lt;/p&gt;&lt;h3 style=&quot;text-align: left;&quot;&gt;&lt;br&gt;&lt;/h3&gt;&lt;h3 style=&quot;text-align: left;&quot;&gt;Problem Identification: Thread Dump using IntelliJ &lt;br&gt;&lt;/h3&gt;&lt;table align=&quot;center&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot; style=&quot;margin-left: auto; margin-right: auto;&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style=&quot;text-align: center;&quot;&gt;&lt;img alt=&quot;&quot; height=&quot;205&quot; src=&quot;data:image/png;base64,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Ffv9Swi7bDTTtQv5b96KSypHcLBDtrSwexydPYso27YbGYZwdhV7zmvlD4LNRHPVNde5Z6dtMCWH//AZfEOsfp+PPGNVdpbDBJgAE2ACFzcBq3ns4gawibSvr9iD3+ZRAPH1Tpy8QPTS59bhRG0c9h08jd9F3vrmAtGGi8kEVk+An9/Vs+M7Nx6BC9GeNx5FLhETYAJMQJwA+11xVhdLyiurr8BttiP45GiYKXkxhnAh2V+suegScvBvO7bgHXonXutrx329tpAZpDHGzeKYABPYQATSat+KtxSP4eCLTVH23t1ABVYoisFgCIit8gxXBWB8mQkwASbABJgAE9j8BMLsKLFhlNYbU/AW3/JM0OpxVVE63LODaOBg64apIy7I+SXAz+/55c+5x5bARrbn2GrK0pgAE2ACG4MA+92NUQ8XaykuRvtbcozhwWPTeKGwGLebjLRvIwdcL1b7Z70vZgKb1/txwPVitmvWnQkwASbABJgAE9jwBFIyy/C9Ld6VSNyuRQxNj+Mrrf1o3fAl5wIyASbAzy/bABNgAkyACTABJsAELgwCb7QdAq1Sy0cQgTXhsuTAy31teFmW180338zsmQATuGgIJOLNN5dtCm1ffPHFAD14SeFNUa2sBBNgAkyACawnAV5SeD1pc15MgAkwASbABJgAE2ACTIAJMAEmwASYABNgAkyACTCBjUUgeElh+e7IG6ukXBomwASYABNgAkyACTABJsAEmAATYAJMgAkwASbABJgAE2ACTIAJMAEmwASYwAYnwAHXDV5BXDwmwASYABNgAkyACTABJsAEmAATYAJMgAkwASbABJgAE2ACTIAJMAEmwAQ2LgEOuG7cuuGSMQEmwASYABNgAkyACTABJsAEmAATYAJMgAkwASbABJgAE2ACTIAJMAEmsMEJcMB1g1cQF48JMAEmwASYABNgAkyACTABJsAEmAATYAJMgAkwASbABJgAE2ACTIAJMIGNS4ADrhu3brhkTIAJMAEmwASYABNgAkyACTABJsAEmAATYAJMgAkwASbABJgAE2ACTIAJbHACHHDd4BXExWMCTIAJMAEmwASYABNgAkyACTABJsAEmAATYAJMgAkwASbABJgAE2ACTGDjEuCA68atGy4ZE2ACTIAJMAEmwASYABNgAkyACTABJsAEmAATYAJMgAkwASbABJgAE2ACG5wA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cN38dcwaMgEmwASYABNgAhcwgZTMMnxvi3clErdrEUPT4/hKaz9aL2CduOhM4GIhwM/vxVLTrCcTYAJMgAkwgQuHwBtth/CGQHFF0wmI2lRJmMumqk5W5kIgsOTAy7Sf6ssXQlm5jBc9AV5S+KI3AQbABJgAE2ACagnwksJqiXF6JsAEmAATYAJMgAkwASbABJgAE2ACTIAJMAEmwASYwOYhELyksHbzqMaaMAEmwASYABNgAkyACTABJsAEmAATYAJMgAkwASbABJgAE2ACTIAJMAEmwATWlwAHXNeXN+fGBJgAE2ACTIAJMAEmwASYABNgAkyACTABJsAEmAATYAJMgAkwASbABJjAJiLAAddNVJmsChNgAkyACTABJsAEmAATYAJMgAkwASbABJgAE2ACTIAJMAEmwASYABNgAutLIG59s+PcmAATYAJMgAkwASbABJgAE2ACTIAJMAEmwASYABNYawKpqalrnQXLZwLrRsBms61bXpwRE2ACTIAJMIHVEOAZrquhxvcwASbABJgAE2ACTIAJMAEmwASYABNgAkyACTABJsAEmAATYAJMgAkwASbABIgAB1zZDJgAE2ACTIAJMAEmwASYABNgAkyACTABJsAEmAATYAJMgAkwASbABJgAE2ACqyTAAddVguPbmAATYAJMgAkwASbABJgAE2ACTIAJMAEmwASYABNgAkyACTABJsAEmAATYAIccGUbYAJMgAkwASbABJgAE2ACTIAJMAEmwASYABNgAkyACTABJsAEmAATYAJMgAmskgAHXFcJjm9jAkyACTABJsAEmAAT+P/bOw/wxq7rzv8BorH33nvnzHC6RvKojYpjOd5kv3WL3L9dR47cJDteO9lda7/IidZykb/YUazsumy869jfxrLkWJJVp1LD4Qw57L2CIEAQJAASIEAC2PMAkEQj8UCCM+TMed83+oT37jv3nN+5777He+49lwkwgVuTQEF6AR5OkNyaxu1Dq9gf+9BprDITYAJMgAkwASbABJgAE2ACTOA2I8AB19vM4WwuE2ACTIAJMAEmwASYABNgAlsTKBQCrvEccN2a0o27yv64caz3Q00x8nicTotH7H5QlnVkArtJQJ6Au9NikbCbdbBsJsAEmAATYAJMgAkwAdEEOOAqGhUXZAJMgAkwASbABPZ+7QThAAAgAElEQVQnARU+dOAE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&quot; style=&quot;margin-left: auto; margin-right: auto;&quot; width=&quot;640&quot;&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;text-align: center;&quot;&gt;The IntelliJ thread-dump showing the main thread always stuck at springfox&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;I started the application in debug mode in IntelliJ and took thread dump several times to see what&#39;s the main thread is doing. I found that in all thread dumps, the main thread was stuck around springfox.documentation.spring.web.readers.parameter.ModelAttributeParameterExpander.expand() method. &lt;br&gt;&lt;/p&gt;&lt;p&gt; &lt;/p&gt;&lt;p&gt;So, I dig into the ModelAttributeParameterExpander#expand() method was able to quickly confirm that it was trying to expand the fields from the @ModelAttribute to render into the Swagger UI - which is exposed in a JSON endpoint host:port/v3/api-docs.&amp;nbsp;&amp;nbsp;&lt;/p&gt;Once the application started (after about 3 mins), I opened up the host:port/v3/api-docs endpoint locally and amazed by the size of JSON response. It WAS 1240MB! That explained why Swagger UI used to take longer.&amp;nbsp;&lt;h3 style=&quot;text-align: left;&quot;&gt;&lt;br&gt;&lt;/h3&gt;&lt;h3 style=&quot;text-align: left;&quot;&gt;Problem Isolation: &lt;br&gt;&lt;/h3&gt;&lt;p&gt;To isolate the problem, I commented out all the endpoints that&#39;s using @ModelAttribute and just like I expected, &lt;b&gt;the app started within 9 seconds, took about 200MB heap, the swagger UI loaded within one second, the host:port/v3/api-docs endpoint response was about 20KB.&lt;/b&gt;&lt;/p&gt;&lt;pre style=&quot;background-color: #2b2b2b; color: #a9b7c6; font-family: &amp;quot;JetBrains Mono&amp;quot;, monospace; font-size: 9.8pt;&quot;&gt;&lt;span style=&quot;color: #bbb529;&quot;&gt;@GetMapping&lt;/span&gt;(&lt;span style=&quot;color: #6a8759;&quot;&gt;&quot;/test&quot;&lt;/span&gt;)&lt;br&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;void &lt;/span&gt;test(&lt;span style=&quot;color: #bbb529;&quot;&gt;@ModelAttribute &lt;/span&gt;A a) { //commented out all the endpoints to isolate problem&lt;/pre&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;Then I dig through the code inside ModelAttributeParameterExpander#expand() and I found that its collecting all the fields and properties inside the @ModelAttribute class and recursively calls the expand() method for all the sub-fields and properties. &lt;br&gt;&lt;/p&gt;&lt;pre style=&quot;background-color: #2b2b2b; color: #a9b7c6; font-family: &amp;quot;JetBrains Mono&amp;quot;, monospace; font-size: 9.8pt;&quot;&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;public &lt;/span&gt;List&amp;lt;Compatibility&amp;lt;Parameter&lt;span style=&quot;color: #cc7832;&quot;&gt;, &lt;/span&gt;RequestParameter&amp;gt;&amp;gt; &lt;span style=&quot;color: #ffc66d;&quot;&gt;expand&lt;/span&gt;(ExpansionContext context) {&lt;br&gt;    List&amp;lt;Compatibility&amp;lt;Parameter&lt;span style=&quot;color: #cc7832;&quot;&gt;, &lt;/span&gt;RequestParameter&amp;gt;&amp;gt; parameters = &lt;span style=&quot;color: #cc7832;&quot;&gt;new &lt;/span&gt;ArrayList()&lt;span style=&quot;color: #cc7832;&quot;&gt;;&lt;br&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;    &lt;/span&gt;Set&amp;lt;PropertyDescriptor&amp;gt; propertyDescriptors = &lt;span style=&quot;color: #cc7832;&quot;&gt;this&lt;/span&gt;.propertyDescriptors(context.getParamType().getErasedType())&lt;span style=&quot;color: #cc7832;&quot;&gt;;&lt;br&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;    &lt;/span&gt;Map&amp;lt;Method&lt;span style=&quot;color: #cc7832;&quot;&gt;, &lt;/span&gt;PropertyDescriptor&amp;gt; propertyLookupByGetter = &lt;span style=&quot;color: #cc7832;&quot;&gt;this&lt;/span&gt;.propertyDescriptorsByMethod(context.getParamType().getErasedType()&lt;span style=&quot;color: #cc7832;&quot;&gt;, &lt;/span&gt;propertyDescriptors)&lt;span style=&quot;color: #cc7832;&quot;&gt;;&lt;br&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;    &lt;/span&gt;Iterable&amp;lt;ResolvedMethod&amp;gt; getters = (Iterable)&lt;span style=&quot;color: #cc7832;&quot;&gt;this&lt;/span&gt;.&lt;span style=&quot;color: #9876aa;&quot;&gt;accessors&lt;/span&gt;.in(context.getParamType()).stream().filter(&lt;span style=&quot;color: #cc7832;&quot;&gt;this&lt;/span&gt;.onlyValidGetters(propertyLookupByGetter.keySet())).collect(Collectors.&lt;span style=&quot;font-style: italic;&quot;&gt;toList&lt;/span&gt;())&lt;span style=&quot;color: #cc7832;&quot;&gt;;&lt;br&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;    ... &lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;&lt;br&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;    &lt;/span&gt;Stream&amp;lt;ModelAttributeField&amp;gt; collectionTypes = attributes.stream().filter(&lt;span style=&quot;color: #cc7832;&quot;&gt;this&lt;/span&gt;.isCollection().and(&lt;span style=&quot;color: #cc7832;&quot;&gt;this&lt;/span&gt;.recursiveCollectionItemType(context.getParamType()).negate()))&lt;span style=&quot;color: #cc7832;&quot;&gt;;&lt;br&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;    &lt;/span&gt;collectionTypes.forEachOrdered((each) -&amp;gt; {&lt;br&gt; &lt;span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/span&gt;....&lt;br&gt;         &lt;span style=&quot;color: #b389c5;&quot;&gt;parameters&lt;/span&gt;.addAll(&lt;span style=&quot;color: #cc7832;&quot;&gt;this&lt;/span&gt;.expand(childContext))&lt;span style=&quot;color: #cc7832;&quot;&gt;; //nested&lt;/span&gt;&lt;/pre&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;I dig further and found that it was grabing the getMetaClass method generated by Groovy and recursively looking at all the get* methods and the parameters inside MetaClass class.&lt;/p&gt;&lt;pre style=&quot;background-color: #2b2b2b; color: #a9b7c6; font-family: &amp;quot;JetBrains Mono&amp;quot;, monospace; font-size: 9.8pt;&quot;&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;public static class &lt;/span&gt;MyClass &lt;span style=&quot;color: #cc7832;&quot;&gt;implements &lt;/span&gt;GroovyObject {&lt;br&gt;    //..fields&lt;br&gt;&lt;br&gt;    &lt;span style=&quot;color: #bbb529;&quot;&gt;@Generated&lt;br&gt;&lt;/span&gt;&lt;span style=&quot;color: #bbb529;&quot;&gt;    @Internal&lt;br&gt;&lt;/span&gt;&lt;span style=&quot;color: #bbb529;&quot;&gt;    @Transient&lt;br&gt;&lt;/span&gt;&lt;span style=&quot;color: #bbb529;&quot;&gt;    &lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;public &lt;/span&gt;MetaClass &lt;span style=&quot;color: #ffc66d;&quot;&gt;getMetaClass&lt;/span&gt;() {  //this was treated as class property&lt;/pre&gt;&lt;p&gt;MetaClass: it contains several get* method. All of them were processed by Swagger&lt;br&gt;&lt;/p&gt;&lt;pre style=&quot;background-color: #2b2b2b; color: #a9b7c6; font-family: &amp;quot;JetBrains Mono&amp;quot;, monospace; font-size: 9.8pt;&quot;&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;public interface &lt;/span&gt;MetaClass &lt;span style=&quot;color: #cc7832;&quot;&gt;extends &lt;/span&gt;MetaObjectProtocol {&lt;br&gt;    Object &lt;span style=&quot;color: #ffc66d;&quot;&gt;invokeMethod&lt;/span&gt;(Class var1&lt;span style=&quot;color: #cc7832;&quot;&gt;, &lt;/span&gt;Object var2&lt;span style=&quot;color: #cc7832;&quot;&gt;, &lt;/span&gt;String var3&lt;span style=&quot;color: #cc7832;&quot;&gt;, &lt;/span&gt;Object[] var4&lt;span style=&quot;color: #cc7832;&quot;&gt;, boolean &lt;/span&gt;var5&lt;span style=&quot;color: #cc7832;&quot;&gt;, boolean &lt;/span&gt;var6)&lt;span style=&quot;color: #cc7832;&quot;&gt;;&lt;br&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;&lt;br&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;    &lt;/span&gt;Object &lt;span style=&quot;color: #ffc66d;&quot;&gt;getProperty&lt;/span&gt;(Class var1&lt;span style=&quot;color: #cc7832;&quot;&gt;, &lt;/span&gt;Object var2&lt;span style=&quot;color: #cc7832;&quot;&gt;, &lt;/span&gt;String var3&lt;span style=&quot;color: #cc7832;&quot;&gt;, boolean &lt;/span&gt;var4&lt;span style=&quot;color: #cc7832;&quot;&gt;, boolean &lt;/span&gt;var5)&lt;span style=&quot;color: #cc7832;&quot;&gt;;&lt;br&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;&lt;br&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;    void &lt;/span&gt;&lt;span style=&quot;color: #ffc66d;&quot;&gt;setProperty&lt;/span&gt;(Class var1&lt;span style=&quot;color: #cc7832;&quot;&gt;, &lt;/span&gt;Object var2&lt;span style=&quot;color: #cc7832;&quot;&gt;, &lt;/span&gt;String var3&lt;span style=&quot;color: #cc7832;&quot;&gt;, &lt;/span&gt;Object var4&lt;span style=&quot;color: #cc7832;&quot;&gt;, boolean &lt;/span&gt;var5&lt;span style=&quot;color: #cc7832;&quot;&gt;, boolean &lt;/span&gt;var6)&lt;span style=&quot;color: #cc7832;&quot;&gt;;&lt;br&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;&lt;br&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;    &lt;/span&gt;Object &lt;span style=&quot;color: #ffc66d;&quot;&gt;invokeMissingMethod&lt;/span&gt;(Object var1&lt;span style=&quot;color: #cc7832;&quot;&gt;, &lt;/span&gt;String var2&lt;span style=&quot;color: #cc7832;&quot;&gt;, &lt;/span&gt;Object[] var3)&lt;span style=&quot;color: #cc7832;&quot;&gt;;&lt;br&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;&lt;br&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;    &lt;/span&gt;Object &lt;span style=&quot;color: #ffc66d;&quot;&gt;invokeMissingProperty&lt;/span&gt;(Object var1&lt;span style=&quot;color: #cc7832;&quot;&gt;, &lt;/span&gt;String var2&lt;span style=&quot;color: #cc7832;&quot;&gt;, &lt;/span&gt;Object var3&lt;span style=&quot;color: #cc7832;&quot;&gt;, boolean &lt;/span&gt;var4)&lt;span style=&quot;color: #cc7832;&quot;&gt;;&lt;br&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;&lt;br&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;    &lt;/span&gt;Object &lt;span style=&quot;color: #ffc66d;&quot;&gt;getAttribute&lt;/span&gt;(Class var1&lt;span style=&quot;color: #cc7832;&quot;&gt;, &lt;/span&gt;Object var2&lt;span style=&quot;color: #cc7832;&quot;&gt;, &lt;/span&gt;String var3&lt;span style=&quot;color: #cc7832;&quot;&gt;, boolean &lt;/span&gt;var4)&lt;span style=&quot;color: #cc7832;&quot;&gt;;&lt;br&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;&lt;br&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;    void &lt;/span&gt;&lt;span style=&quot;color: #ffc66d;&quot;&gt;setAttribute&lt;/span&gt;(Class var1&lt;span style=&quot;color: #cc7832;&quot;&gt;, &lt;/span&gt;Object var2&lt;span style=&quot;color: #cc7832;&quot;&gt;, &lt;/span&gt;String var3&lt;span style=&quot;color: #cc7832;&quot;&gt;, &lt;/span&gt;Object var4&lt;span style=&quot;color: #cc7832;&quot;&gt;, boolean &lt;/span&gt;var5&lt;span style=&quot;color: #cc7832;&quot;&gt;, boolean &lt;/span&gt;var6)&lt;span style=&quot;color: #cc7832;&quot;&gt;;&lt;br&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;&lt;br&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;    void &lt;/span&gt;&lt;span style=&quot;color: #ffc66d;&quot;&gt;initialize&lt;/span&gt;()&lt;span style=&quot;color: #cc7832;&quot;&gt;;&lt;br&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;&lt;br&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;    &lt;/span&gt;List&amp;lt;MetaProperty&amp;gt; &lt;span style=&quot;color: #ffc66d;&quot;&gt;getProperties&lt;/span&gt;()&lt;span style=&quot;color: #cc7832;&quot;&gt;;&lt;br&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;&lt;br&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;    &lt;/span&gt;List&amp;lt;MetaMethod&amp;gt; &lt;span style=&quot;color: #ffc66d;&quot;&gt;getMethods&lt;/span&gt;()&lt;span style=&quot;color: #cc7832;&quot;&gt;;&lt;br&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;&lt;br&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;    &lt;/span&gt;ClassNode &lt;span style=&quot;color: #ffc66d;&quot;&gt;getClassNode&lt;/span&gt;()&lt;span style=&quot;color: #cc7832;&quot;&gt;;&lt;br&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;&lt;br&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;    &lt;/span&gt;List&amp;lt;MetaMethod&amp;gt; &lt;span style=&quot;color: #ffc66d;&quot;&gt;getMetaMethods&lt;/span&gt;()&lt;span style=&quot;color: #cc7832;&quot;&gt;;&lt;br&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;&lt;br&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;    int &lt;/span&gt;&lt;span style=&quot;color: #ffc66d;&quot;&gt;selectConstructorAndTransformArguments&lt;/span&gt;(&lt;span style=&quot;color: #cc7832;&quot;&gt;int &lt;/span&gt;var1&lt;span style=&quot;color: #cc7832;&quot;&gt;, &lt;/span&gt;Object[] var2)&lt;span style=&quot;color: #cc7832;&quot;&gt;;&lt;br&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;&lt;br&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;    &lt;/span&gt;MetaMethod &lt;span style=&quot;color: #ffc66d;&quot;&gt;pickMethod&lt;/span&gt;(String var1&lt;span style=&quot;color: #cc7832;&quot;&gt;, &lt;/span&gt;Class[] var2)&lt;span style=&quot;color: #cc7832;&quot;&gt;;&lt;br&gt;&lt;/span&gt;}&lt;/pre&gt;&lt;p&gt;&lt;/p&gt;&lt;h3 style=&quot;text-align: left;&quot;&gt;&lt;br&gt;&lt;/h3&gt;&lt;h3 style=&quot;text-align: left;&quot;&gt;Solution:&lt;/h3&gt;&lt;p&gt;I found that there were &lt;a href=&quot;https://github.com/springfox/springfox/issues?q=metaclass&quot; target=&quot;_blank&quot;&gt;few discussions already in springfox &lt;/a&gt;GitHub project and &lt;a href=&quot;https://github.com/springfox/springfox/issues/752&quot; target=&quot;_blank&quot;&gt;solution was also discussed&lt;/a&gt;. The solution is to configure the Docket object to ignore MetaClass class using ignoredParameterTypes() method:&lt;/p&gt;&lt;pre style=&quot;background-color: #2b2b2b; color: #a9b7c6; font-family: &amp;quot;JetBrains Mono&amp;quot;, monospace; font-size: 9.8pt;&quot;&gt;   &lt;span style=&quot;color: #bbb529;&quot;&gt;@Bean&lt;br&gt;&lt;/span&gt;&lt;span style=&quot;color: #bbb529;&quot;&gt;    &lt;/span&gt;Docket docket(){&lt;br&gt;        &lt;span style=&quot;color: #cc7832;&quot;&gt;new &lt;/span&gt;Docket(DocumentationType.&lt;span style=&quot;color: #9876aa; font-style: italic;&quot;&gt;OAS_30&lt;/span&gt;)&lt;br&gt;                .ignoredParameterTypes(MetaClass)&lt;br&gt;    }&lt;br&gt;&lt;br&gt;}&lt;/pre&gt;&lt;p&gt;Now the application takes about 9 seconds to start and takes about 200MB heap space. That was a great reduction from 3min/1.4GB.&lt;br&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;h3 style=&quot;text-align: left;&quot;&gt;&lt;br&gt;&lt;/h3&gt;&lt;h3 style=&quot;text-align: left;&quot;&gt;Reproducible example:&lt;/h3&gt;&lt;p&gt;The following simple app was taking 10 seconds to start, the http://localhost:8080/v3/api-docs returns 58.5MB JSON response. Once I comment out the test method and rerun it just takes 1.7 seconds. Also, the http://localhost:8080/v3/api-docs returns 5KB JSON response.&lt;br&gt;&lt;/p&gt;&lt;pre style=&quot;background-color: #2b2b2b; color: #a9b7c6; font-family: &amp;quot;JetBrains Mono&amp;quot;, monospace; font-size: 9.8pt;&quot;&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;package &lt;/span&gt;gt.swagger.demo&lt;br&gt;&lt;br&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;import &lt;/span&gt;org.springframework.boot.SpringApplication&lt;br&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;import &lt;/span&gt;org.springframework.boot.autoconfigure.&lt;span style=&quot;color: #bbb529;&quot;&gt;SpringBootApplication&lt;/span&gt;&lt;br&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;import &lt;/span&gt;org.springframework.web.bind.annotation.*&lt;br&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;import &lt;/span&gt;springfox.documentation.swagger2.annotations.&lt;span style=&quot;color: #bbb529;&quot;&gt;EnableSwagger2&lt;br&gt;&lt;/span&gt;&lt;span style=&quot;color: #bbb529;&quot;&gt;&lt;br&gt;&lt;/span&gt;&lt;span style=&quot;color: #bbb529;&quot;&gt;@SpringBootApplication&lt;br&gt;&lt;/span&gt;&lt;span style=&quot;color: #bbb529;&quot;&gt;@EnableSwagger2&lt;br&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;class &lt;/span&gt;SwaggerTestApp {&lt;br&gt;    &lt;span style=&quot;color: #cc7832;&quot;&gt;static void &lt;/span&gt;main(String[] args) {&lt;br&gt;        SpringApplication.&lt;span style=&quot;color: #9876aa; font-style: italic;&quot;&gt;run&lt;/span&gt;(SwaggerTestApp, args)&lt;br&gt;    }&lt;br&gt;}&lt;br&gt;&lt;br&gt;&lt;span style=&quot;color: #bbb529;&quot;&gt;@RestController&lt;br&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;class &lt;/span&gt;Controller {&lt;br&gt;&lt;br&gt;    &lt;span style=&quot;color: #bbb529;&quot;&gt;@GetMapping&lt;/span&gt;(&lt;span style=&quot;color: #6a8759;&quot;&gt;&quot;/test&quot;&lt;/span&gt;)&lt;br&gt;    &lt;span style=&quot;color: #cc7832;&quot;&gt;void &lt;/span&gt;test(&lt;span style=&quot;color: #bbb529;&quot;&gt;@ModelAttribute &lt;/span&gt;A a) {&lt;br&gt;    }&lt;br&gt;&lt;br&gt;    &lt;span style=&quot;color: #cc7832;&quot;&gt;static class &lt;/span&gt;A {&lt;br&gt;        String &lt;span style=&quot;color: #9876aa;&quot;&gt;a&lt;/span&gt;&lt;span style=&quot;color: #9876aa;&quot;&gt;&lt;br&gt;&lt;/span&gt;&lt;span style=&quot;color: #9876aa;&quot;&gt;    &lt;/span&gt;}&lt;br&gt;}&lt;br&gt;&lt;br&gt;&lt;/pre&gt;&lt;p&gt;When I add more endpoints with @ModelAttribute or when I nest the &#39;A&#39; class with class B, the application starts taking a lot of time to start and takes up more heap space &lt;/p&gt;&lt;pre style=&quot;background-color: #2b2b2b; color: #a9b7c6; font-family: &amp;quot;JetBrains Mono&amp;quot;, monospace; font-size: 9.8pt;&quot;&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;static class &lt;/span&gt;A {&lt;br&gt;    String &lt;span style=&quot;color: #9876aa;&quot;&gt;a&lt;br&gt;&lt;/span&gt;&lt;span style=&quot;color: #9876aa;&quot;&gt;    &lt;/span&gt;B &lt;span style=&quot;color: #9876aa;&quot;&gt;b1&lt;/span&gt;, &lt;span style=&quot;color: #9876aa;&quot;&gt;b2&lt;/span&gt;, &lt;span style=&quot;color: #9876aa;&quot;&gt;b3&lt;/span&gt;, &lt;span style=&quot;color: #9876aa;&quot;&gt;b4&lt;/span&gt;, &lt;span style=&quot;color: #9876aa;&quot;&gt;b5&lt;/span&gt; ,&lt;span style=&quot;color: #9876aa;&quot;&gt;b6&lt;/span&gt;, &lt;span style=&quot;color: #9876aa;&quot;&gt;b7&lt;/span&gt;, &lt;span style=&quot;color: #9876aa;&quot;&gt;b8&lt;/span&gt;, &lt;span style=&quot;color: #9876aa;&quot;&gt;b9&lt;/span&gt;&lt;span style=&quot;color: #9876aa;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #9876aa;&quot;&gt;&lt;br&gt;&lt;/span&gt;}&lt;br&gt;&lt;br&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;static class &lt;/span&gt;B {&lt;br&gt;    String &lt;span style=&quot;color: #9876aa;&quot;&gt;b&lt;br&gt;&lt;/span&gt;}&lt;/pre&gt;&lt;p&gt;The problem can be solved by configuring the following bean:&lt;/p&gt;&lt;pre style=&quot;background-color: #2b2b2b; color: #a9b7c6; font-family: &amp;quot;JetBrains Mono&amp;quot;, monospace; font-size: 9.8pt;&quot;&gt;&lt;span style=&quot;color: #bbb529;&quot;&gt;@Configuration&lt;br&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;class &lt;/span&gt;SwaggerConfig {&lt;br&gt;&lt;br&gt;    &lt;span style=&quot;color: #bbb529;&quot;&gt;@Bean&lt;br&gt;&lt;/span&gt;&lt;span style=&quot;color: #bbb529;&quot;&gt;    &lt;/span&gt;Docket docket(){&lt;br&gt;        &lt;span style=&quot;color: #cc7832;&quot;&gt;new &lt;/span&gt;Docket(DocumentationType.&lt;span style=&quot;color: #9876aa; font-style: italic;&quot;&gt;OAS_30&lt;/span&gt;)&lt;br&gt;                .ignoredParameterTypes(MetaClass)&lt;br&gt;    }&lt;br&gt;&lt;br&gt;}&lt;/pre&gt;&lt;p&gt;POM.xml:&lt;/p&gt;&lt;pre style=&quot;background-color: #2b2b2b; color: #a9b7c6; font-family: &amp;quot;JetBrains Mono&amp;quot;, monospace; font-size: 9.8pt;&quot;&gt;&lt;span style=&quot;color: #e8bf6a;&quot;&gt;&amp;lt;?&lt;/span&gt;&lt;span style=&quot;color: #bababa;&quot;&gt;xml version&lt;/span&gt;&lt;span style=&quot;color: #6a8759;&quot;&gt;=&quot;1.0&quot; &lt;/span&gt;&lt;span style=&quot;color: #bababa;&quot;&gt;encoding&lt;/span&gt;&lt;span style=&quot;color: #6a8759;&quot;&gt;=&quot;UTF-8&quot;&lt;/span&gt;&lt;span style=&quot;color: #e8bf6a;&quot;&gt;?&amp;gt;&lt;br&gt;&lt;/span&gt;&lt;span style=&quot;color: #e8bf6a;&quot;&gt;&amp;lt;project &lt;/span&gt;&lt;span style=&quot;color: #bababa;&quot;&gt;xmlns&lt;/span&gt;&lt;span style=&quot;color: #6a8759;&quot;&gt;=&quot;http://maven.apache.org/POM/4.0.0&quot; &lt;/span&gt;&lt;span style=&quot;color: #bababa;&quot;&gt;xmlns:&lt;/span&gt;&lt;span style=&quot;color: #9876aa;&quot;&gt;xsi&lt;/span&gt;&lt;span style=&quot;color: #6a8759;&quot;&gt;=&quot;http://www.w3.org/2001/XMLSchema-instance&quot;&lt;br&gt;&lt;/span&gt;&lt;span style=&quot;color: #6a8759;&quot;&gt;         &lt;/span&gt;&lt;span style=&quot;color: #9876aa;&quot;&gt;xsi&lt;/span&gt;&lt;span style=&quot;color: #bababa;&quot;&gt;:schemaLocation&lt;/span&gt;&lt;span style=&quot;color: #6a8759;&quot;&gt;=&quot;http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd&quot;&lt;/span&gt;&lt;span style=&quot;color: #e8bf6a;&quot;&gt;&amp;gt;&lt;br&gt;&lt;/span&gt;&lt;span style=&quot;color: #e8bf6a;&quot;&gt;    &amp;lt;modelVersion&amp;gt;&lt;/span&gt;4.0.0&lt;span style=&quot;color: #e8bf6a;&quot;&gt;&amp;lt;/modelVersion&amp;gt;&lt;br&gt;&lt;/span&gt;&lt;span style=&quot;color: #e8bf6a;&quot;&gt;    &amp;lt;parent&amp;gt;&lt;br&gt;&lt;/span&gt;&lt;span style=&quot;color: #e8bf6a;&quot;&gt;        &amp;lt;groupId&amp;gt;&lt;/span&gt;org.springframework.boot&lt;span style=&quot;color: #e8bf6a;&quot;&gt;&amp;lt;/groupId&amp;gt;&lt;br&gt;&lt;/span&gt;&lt;span style=&quot;color: #e8bf6a;&quot;&gt;        &amp;lt;artifactId&amp;gt;&lt;/span&gt;spring-boot-starter-parent&lt;span style=&quot;color: #e8bf6a;&quot;&gt;&amp;lt;/artifactId&amp;gt;&lt;br&gt;&lt;/span&gt;&lt;span style=&quot;color: #e8bf6a;&quot;&gt;        &amp;lt;version&amp;gt;&lt;/span&gt;2.5.2&lt;span style=&quot;color: #e8bf6a;&quot;&gt;&amp;lt;/version&amp;gt;&lt;br&gt;&lt;/span&gt;&lt;span style=&quot;color: #e8bf6a;&quot;&gt;        &amp;lt;relativePath/&amp;gt; &lt;/span&gt;&lt;span style=&quot;color: grey;&quot;&gt;&amp;lt;!-- lookup parent from repository --&amp;gt;&lt;br&gt;&lt;/span&gt;&lt;span style=&quot;color: grey;&quot;&gt;    &lt;/span&gt;&lt;span style=&quot;color: #e8bf6a;&quot;&gt;&amp;lt;/parent&amp;gt;&lt;br&gt;&lt;/span&gt;&lt;span style=&quot;color: #e8bf6a;&quot;&gt;    &amp;lt;groupId&amp;gt;&lt;/span&gt;gt.swagg&lt;span style=&quot;color: #e8bf6a;&quot;&gt;&amp;lt;/groupId&amp;gt;&lt;br&gt;&lt;/span&gt;&lt;span style=&quot;color: #e8bf6a;&quot;&gt;    &amp;lt;artifactId&amp;gt;&lt;/span&gt;sb25-swagger3&lt;span style=&quot;color: #e8bf6a;&quot;&gt;&amp;lt;/artifactId&amp;gt;&lt;br&gt;&lt;/span&gt;&lt;span style=&quot;color: #e8bf6a;&quot;&gt;    &amp;lt;version&amp;gt;&lt;/span&gt;0.0.1-SNAPSHOT&lt;span style=&quot;color: #e8bf6a;&quot;&gt;&amp;lt;/version&amp;gt;&lt;br&gt;&lt;/span&gt;&lt;span style=&quot;color: #e8bf6a;&quot;&gt;    &amp;lt;packaging&amp;gt;&lt;/span&gt;jar&lt;span style=&quot;color: #e8bf6a;&quot;&gt;&amp;lt;/packaging&amp;gt;&lt;br&gt;&lt;/span&gt;&lt;span style=&quot;color: #e8bf6a;&quot;&gt;&lt;br&gt;&lt;/span&gt;&lt;span style=&quot;color: #e8bf6a;&quot;&gt;    &amp;lt;properties&amp;gt;&lt;br&gt;&lt;/span&gt;&lt;span style=&quot;color: #e8bf6a;&quot;&gt;        &amp;lt;java.version&amp;gt;&lt;/span&gt;11&lt;span style=&quot;color: #e8bf6a;&quot;&gt;&amp;lt;/java.version&amp;gt;&lt;br&gt;&lt;/span&gt;&lt;span style=&quot;color: #e8bf6a;&quot;&gt;    &amp;lt;/properties&amp;gt;&lt;br&gt;&lt;/span&gt;&lt;span style=&quot;color: #e8bf6a;&quot;&gt;&lt;br&gt;&lt;/span&gt;&lt;span style=&quot;color: #e8bf6a;&quot;&gt;    &amp;lt;dependencies&amp;gt;&lt;br&gt;&lt;/span&gt;&lt;span style=&quot;color: #e8bf6a;&quot;&gt;        &amp;lt;dependency&amp;gt;&lt;br&gt;&lt;/span&gt;&lt;span style=&quot;color: #e8bf6a;&quot;&gt;            &amp;lt;groupId&amp;gt;&lt;/span&gt;org.springframework.boot&lt;span style=&quot;color: #e8bf6a;&quot;&gt;&amp;lt;/groupId&amp;gt;&lt;br&gt;&lt;/span&gt;&lt;span style=&quot;color: #e8bf6a;&quot;&gt;            &amp;lt;artifactId&amp;gt;&lt;/span&gt;spring-boot-starter-web&lt;span style=&quot;color: #e8bf6a;&quot;&gt;&amp;lt;/artifactId&amp;gt;&lt;br&gt;&lt;/span&gt;&lt;span style=&quot;color: #e8bf6a;&quot;&gt;        &amp;lt;/dependency&amp;gt;&lt;br&gt;&lt;/span&gt;&lt;span style=&quot;color: #e8bf6a;&quot;&gt;        &amp;lt;dependency&amp;gt;&lt;br&gt;&lt;/span&gt;&lt;span style=&quot;color: #e8bf6a;&quot;&gt;            &amp;lt;groupId&amp;gt;&lt;/span&gt;io.springfox&lt;span style=&quot;color: #e8bf6a;&quot;&gt;&amp;lt;/groupId&amp;gt;&lt;br&gt;&lt;/span&gt;&lt;span style=&quot;color: #e8bf6a;&quot;&gt;            &amp;lt;artifactId&amp;gt;&lt;/span&gt;springfox-boot-starter&lt;span style=&quot;color: #e8bf6a;&quot;&gt;&amp;lt;/artifactId&amp;gt;&lt;br&gt;&lt;/span&gt;&lt;span style=&quot;color: #e8bf6a;&quot;&gt;            &amp;lt;version&amp;gt;&lt;/span&gt;3.0.0&lt;span style=&quot;color: #e8bf6a;&quot;&gt;&amp;lt;/version&amp;gt;&lt;br&gt;&lt;/span&gt;&lt;span style=&quot;color: #e8bf6a;&quot;&gt;        &amp;lt;/dependency&amp;gt;&lt;br&gt;&lt;/span&gt;&lt;span style=&quot;color: #e8bf6a;&quot;&gt;        &amp;lt;dependency&amp;gt;&lt;br&gt;&lt;/span&gt;&lt;span style=&quot;color: #e8bf6a;&quot;&gt;            &amp;lt;groupId&amp;gt;&lt;/span&gt;org.codehaus.groovy&lt;span style=&quot;color: #e8bf6a;&quot;&gt;&amp;lt;/groupId&amp;gt;&lt;br&gt;&lt;/span&gt;&lt;span style=&quot;color: #e8bf6a;&quot;&gt;            &amp;lt;artifactId&amp;gt;&lt;/span&gt;groovy&lt;span style=&quot;color: #e8bf6a;&quot;&gt;&amp;lt;/artifactId&amp;gt;&lt;br&gt;&lt;/span&gt;&lt;span style=&quot;color: #e8bf6a;&quot;&gt;        &amp;lt;/dependency&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #e8bf6a;&quot;&gt;&lt;br&gt;&lt;/span&gt;&lt;span style=&quot;color: #e8bf6a;&quot;&gt;    &amp;lt;/dependencies&amp;gt;&lt;br&gt;&lt;/span&gt;&lt;span style=&quot;color: #e8bf6a;&quot;&gt;&lt;br&gt;&lt;/span&gt;&lt;span style=&quot;color: #e8bf6a;&quot;&gt;    &amp;lt;build&amp;gt;&lt;br&gt;&lt;/span&gt;&lt;span style=&quot;color: #e8bf6a;&quot;&gt;        &amp;lt;plugins&amp;gt;&lt;br&gt;&lt;/span&gt;&lt;span style=&quot;color: #e8bf6a;&quot;&gt;            &amp;lt;plugin&amp;gt;&lt;br&gt;&lt;/span&gt;&lt;span style=&quot;color: #e8bf6a;&quot;&gt;                &amp;lt;groupId&amp;gt;&lt;/span&gt;org.springframework.boot&lt;span style=&quot;color: #e8bf6a;&quot;&gt;&amp;lt;/groupId&amp;gt;&lt;br&gt;&lt;/span&gt;&lt;span style=&quot;color: #e8bf6a;&quot;&gt;                &amp;lt;artifactId&amp;gt;&lt;/span&gt;spring-boot-maven-plugin&lt;span style=&quot;color: #e8bf6a;&quot;&gt;&amp;lt;/artifactId&amp;gt;&lt;br&gt;&lt;/span&gt;&lt;span style=&quot;color: #e8bf6a;&quot;&gt;            &amp;lt;/plugin&amp;gt;&lt;br&gt;&lt;/span&gt;&lt;span style=&quot;color: #e8bf6a;&quot;&gt;            &amp;lt;plugin&amp;gt;&lt;br&gt;&lt;/span&gt;&lt;span style=&quot;color: #e8bf6a;&quot;&gt;                &amp;lt;groupId&amp;gt;&lt;/span&gt;org.codehaus.gmavenplus&lt;span style=&quot;color: #e8bf6a;&quot;&gt;&amp;lt;/groupId&amp;gt;&lt;br&gt;&lt;/span&gt;&lt;span style=&quot;color: #e8bf6a;&quot;&gt;                &amp;lt;artifactId&amp;gt;&lt;/span&gt;gmavenplus-plugin&lt;span style=&quot;color: #e8bf6a;&quot;&gt;&amp;lt;/artifactId&amp;gt;&lt;br&gt;&lt;/span&gt;&lt;span style=&quot;color: #e8bf6a;&quot;&gt;                &amp;lt;version&amp;gt;&lt;/span&gt;1.11.0&lt;span style=&quot;color: #e8bf6a;&quot;&gt;&amp;lt;/version&amp;gt;&lt;br&gt;&lt;/span&gt;&lt;span style=&quot;color: #e8bf6a;&quot;&gt;                &amp;lt;executions&amp;gt;&lt;br&gt;&lt;/span&gt;&lt;span style=&quot;color: #e8bf6a;&quot;&gt;                    &amp;lt;execution&amp;gt;&lt;br&gt;&lt;/span&gt;&lt;span style=&quot;color: #e8bf6a;&quot;&gt;                        &amp;lt;goals&amp;gt;&lt;br&gt;&lt;/span&gt;&lt;span style=&quot;color: #e8bf6a;&quot;&gt;                            &amp;lt;goal&amp;gt;&lt;/span&gt;addSources&lt;span style=&quot;color: #e8bf6a;&quot;&gt;&amp;lt;/goal&amp;gt;&lt;br&gt;&lt;/span&gt;&lt;span style=&quot;color: #e8bf6a;&quot;&gt;                            &amp;lt;goal&amp;gt;&lt;/span&gt;addTestSources&lt;span style=&quot;color: #e8bf6a;&quot;&gt;&amp;lt;/goal&amp;gt;&lt;br&gt;&lt;/span&gt;&lt;span style=&quot;color: #e8bf6a;&quot;&gt;                            &amp;lt;goal&amp;gt;&lt;/span&gt;generateStubs&lt;span style=&quot;color: #e8bf6a;&quot;&gt;&amp;lt;/goal&amp;gt;&lt;br&gt;&lt;/span&gt;&lt;span style=&quot;color: #e8bf6a;&quot;&gt;                            &amp;lt;goal&amp;gt;&lt;/span&gt;compile&lt;span style=&quot;color: #e8bf6a;&quot;&gt;&amp;lt;/goal&amp;gt;&lt;br&gt;&lt;/span&gt;&lt;span style=&quot;color: #e8bf6a;&quot;&gt;                            &amp;lt;goal&amp;gt;&lt;/span&gt;generateTestStubs&lt;span style=&quot;color: #e8bf6a;&quot;&gt;&amp;lt;/goal&amp;gt;&lt;br&gt;&lt;/span&gt;&lt;span style=&quot;color: #e8bf6a;&quot;&gt;                            &amp;lt;goal&amp;gt;&lt;/span&gt;compileTests&lt;span style=&quot;color: #e8bf6a;&quot;&gt;&amp;lt;/goal&amp;gt;&lt;br&gt;&lt;/span&gt;&lt;span style=&quot;color: #e8bf6a;&quot;&gt;                            &amp;lt;goal&amp;gt;&lt;/span&gt;removeStubs&lt;span style=&quot;color: #e8bf6a;&quot;&gt;&amp;lt;/goal&amp;gt;&lt;br&gt;&lt;/span&gt;&lt;span style=&quot;color: #e8bf6a;&quot;&gt;                            &amp;lt;goal&amp;gt;&lt;/span&gt;removeTestStubs&lt;span style=&quot;color: #e8bf6a;&quot;&gt;&amp;lt;/goal&amp;gt;&lt;br&gt;&lt;/span&gt;&lt;span style=&quot;color: #e8bf6a;&quot;&gt;                        &amp;lt;/goals&amp;gt;&lt;br&gt;&lt;/span&gt;&lt;span style=&quot;color: #e8bf6a;&quot;&gt;                    &amp;lt;/execution&amp;gt;&lt;br&gt;&lt;/span&gt;&lt;span style=&quot;color: #e8bf6a;&quot;&gt;                &amp;lt;/executions&amp;gt;&lt;br&gt;&lt;/span&gt;&lt;span style=&quot;color: #e8bf6a;&quot;&gt;            &amp;lt;/plugin&amp;gt;&lt;br&gt;&lt;/span&gt;&lt;span style=&quot;color: #e8bf6a;&quot;&gt;        &amp;lt;/plugins&amp;gt;&lt;br&gt;&lt;/span&gt;&lt;span style=&quot;color: #e8bf6a;&quot;&gt;    &amp;lt;/build&amp;gt;&lt;br&gt;&lt;/span&gt;&lt;span style=&quot;color: #e8bf6a;&quot;&gt;&amp;lt;/project&amp;gt;&lt;br&gt;&lt;/span&gt;&lt;/pre&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;h3 style=&quot;text-align: left;&quot;&gt;Lesson learned:&lt;/h3&gt;&lt;p&gt;- Pay attention on why your application is starting slow. Even a small mis-configuration like this might use up lots of resources&lt;br&gt;&lt;/p&gt;&lt;p&gt;- Developer hour cost $$$. Make sure developers are not burning $$$ on non-trivial things like the slow application start&lt;/p&gt;&lt;p&gt;- Focus on how to increase developer productivity. I have seen devs compiling the whole project after every change to test it. Watch/educate developers to see if they are using the tools correctly&lt;br&gt;&lt;/p&gt;&lt;p&gt;- Java/JVM is fast. Like every other programming language, developers can misuse/misconfigure it to make it slow&lt;/p&gt;&lt;p&gt;- etc &lt;br&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.gtiwari333.com/feeds/7315242848774097181/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://blog.gtiwari333.com/2021/07/springfox-swagger-with-groovy-fixing.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8219113377173546175/posts/default/7315242848774097181'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8219113377173546175/posts/default/7315242848774097181'/><link rel='alternate' type='text/html' href='http://blog.gtiwari333.com/2021/07/springfox-swagger-with-groovy-fixing.html' title='SpringFox Swagger with Groovy - fixing slow startup / heap space error'/><author><name>GT</name><uri>http://www.blogger.com/profile/16923656636145211711</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8219113377173546175.post-1898713143785784776</id><published>2021-07-02T19:12:00.003+01:00</published><updated>2021-07-02T19:12:28.260+01:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Computer/Technology Tips"/><category scheme="http://www.blogger.com/atom/ns#" term="git"/><title type='text'>GIT write useful commit messages</title><content type='html'>&lt;p&gt;What&#39;s harder than choosing a variable name? IMO its composing a perfect code comment and commit message. Today we will discuss some bad commit messages, why they are bad and what we can do to improve those? &lt;br /&gt;&lt;/p&gt;&lt;p&gt;You made all the code updates, wrote tests and now its time to commit them with a commit message. Is &quot;Code Updated&quot; a sufficient? What about &quot;Issue fixed&quot;? Just imagine yourself reading the commit message some time later. Just like code comment, commit message should add context about why the code update was necessary?&amp;nbsp;&lt;/p&gt;&lt;p&gt;A good commit message helps a future developer(it might be you) to reestablish the context around a piece of code whenever the developer needs to dig through the history to find out why the code was changed. It also helps the code reviewer to what to expect on the code.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Unless your team follows squash merge (where all the individual commits in the PR are combined and the person merging the PR can put a single/meaningful commit message) you should pay extra attention when choosing. Commit messages like the following add no value. A good developer should never write these kind of commit messages.&lt;br /&gt;&lt;/p&gt;&lt;h4 style=&quot;text-align: left;&quot;&gt;Bad commit messages(taken from real life examples): &lt;/h4&gt;&lt;ul style=&quot;text-align: left;&quot;&gt;&lt;li&gt;&amp;nbsp;issue fix&lt;/li&gt;&lt;li&gt;&amp;nbsp;more changes &lt;br /&gt;&lt;/li&gt;&lt;li&gt;&amp;nbsp;logic updated&lt;/li&gt;&lt;li&gt;&amp;nbsp;updated code again&lt;/li&gt;&lt;li&gt;&amp;nbsp;added import function&lt;/li&gt;&lt;li&gt;&amp;nbsp;updated dialog box UI&lt;/li&gt;&lt;li&gt;&amp;nbsp;deleted column&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;/p&gt;&lt;h4 style=&quot;text-align: left;&quot;&gt;Good practices:&lt;/h4&gt;&lt;h3 style=&quot;text-align: left;&quot;&gt;Describe why the code was updated?&lt;/h3&gt;&lt;p&gt;&lt;b&gt;&quot;Issue fix&quot; &lt;/b&gt;doesn&#39;t indicate which issue number and what was the cause of issue? &lt;b&gt;&quot;Logic updated&quot;&lt;/b&gt; is super obvious and serves no purpose. &lt;b&gt;&quot;updated dialog box UI&quot;&lt;/b&gt; doesn&#39;t indicate which dialog box and why it was updated. &lt;b&gt;&quot;added import function&quot;&lt;/b&gt; doesn&#39;t indicate which data type does it import?&lt;br /&gt;&lt;/p&gt;&lt;h3 style=&quot;text-align: left;&quot;&gt;Refer the Issue/Jira/Story number&lt;/h3&gt;&lt;p&gt;All the code changes should be followed by a Jira/Story created by someone. Noone should just go ahead and make a arbitrary code change. Most of the git providers (github, bitbucket, gitlab etc) support hyperlinking of Jira/Issue number from commit message. eg: UI_APP:4555 Fixed broken button on IE9 caused by unsupported JS function&lt;br /&gt;&lt;/p&gt;&lt;h3 style=&quot;text-align: left;&quot;&gt;Commit frequency: per logical change&lt;/h3&gt;&lt;p&gt;Its good to do a new commit per logical change. eg: do a commit once the functional piece is working: &lt;br /&gt;&lt;/p&gt;&lt;ul style=&quot;text-align: left;&quot;&gt;&lt;li&gt;new column &#39;purchase_amount&#39; added on table &lt;br /&gt;&lt;/li&gt;&lt;li&gt;updated the backend to save new purchase_amount column&lt;/li&gt;&lt;li&gt;updated UI to display new column&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;For bigger update, use a heading and bullet points. The header can be short.&lt;br /&gt;&lt;/p&gt;&lt;h3 style=&quot;text-align: left;&quot;&gt;Commit frequency: commit often to have a periodic checkpoint&lt;/h3&gt;&lt;p&gt;Imagine you are working on a BIG feature where you modified several files. At some point you are able to make few things working (point X). But when you work on additional changes the things that worked earlier started breaking. Later you are in a position where you don&#39;t know how to revert the new changes to get back to the point X where few things were function. If you had committed your changes at point X, it would have made it super easy to revert local changes to that point.&lt;/p&gt;&lt;h3 style=&quot;text-align: left;&quot;&gt;Few good examples: &amp;nbsp;&amp;nbsp; &lt;br /&gt;&lt;/h3&gt;&lt;ul style=&quot;text-align: left;&quot;&gt;&lt;li&gt;dialog box UI updated to support multiple callback functions on both Cancel and Save event –&amp;gt;&lt;b&gt; instead of updated dialog box ui&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/b&gt;&amp;nbsp;&amp;nbsp;&lt;/li&gt;&lt;li&gt;removed the employer contribution period field as we&#39;re no longer using it –&amp;gt; &lt;b&gt;instead of removed employer contribution period field&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/b&gt;&lt;/li&gt;&lt;li&gt;add member import function for the employer user –&amp;gt; &lt;b&gt;instead of added import function&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/b&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.gtiwari333.com/feeds/1898713143785784776/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://blog.gtiwari333.com/2021/07/git-write-useful-commit-messages.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8219113377173546175/posts/default/1898713143785784776'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8219113377173546175/posts/default/1898713143785784776'/><link rel='alternate' type='text/html' href='http://blog.gtiwari333.com/2021/07/git-write-useful-commit-messages.html' title='GIT write useful commit messages'/><author><name>GT</name><uri>http://www.blogger.com/profile/16923656636145211711</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8219113377173546175.post-580469022487297238</id><published>2021-06-14T19:55:00.000+01:00</published><updated>2022-08-15T23:32:53.915+01:00</updated><title type='text'>KeyCloak docker-compose import realm file</title><content type='html'>&lt;h4 style=&quot;text-align: left;&quot;&gt;Example of docker-compose for keycloak 18 with ability to import a realm file:&lt;/h4&gt;&lt;p&gt;It assumes the realm-export.json file is in /PATH_OF_realm-export.json_FILE/&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;docker-compose.yml:&lt;br /&gt;&lt;/p&gt;&lt;pre style=&quot;background-color: #2b2b2b; color: #a9b7c6; font-family: &#39;JetBrains Mono&#39;,monospace; font-size: 9.8pt;&quot;&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;version&lt;/span&gt;: &lt;span style=&quot;color: #6a8759;&quot;&gt;&#39;3&#39;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;services&lt;/span&gt;:&lt;br /&gt;    &lt;span style=&quot;color: #cc7832;&quot;&gt;keycloak&lt;/span&gt;:&lt;br /&gt;        &lt;span style=&quot;color: #cc7832;&quot;&gt;image&lt;/span&gt;: &lt;span style=&quot;color: #6a8759;&quot;&gt;&#39;quay.io/keycloak/keycloak:18.0.2&#39;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #6a8759;&quot;&gt;        &lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;container_name&lt;/span&gt;: keycloak&lt;br /&gt;        &lt;span style=&quot;color: #cc7832;&quot;&gt;command&lt;/span&gt;: [ &lt;span style=&quot;color: #6a8759;&quot;&gt;&#39;start-dev --import-realm&#39; &lt;/span&gt;]&lt;br /&gt;        &lt;span style=&quot;color: #cc7832;&quot;&gt;environment&lt;/span&gt;:&lt;br /&gt;            - KEYCLOAK_DB=dev-file&lt;br /&gt;            - KEYCLOAK_ADMIN=admin&lt;br /&gt;            - KEYCLOAK_ADMIN_PASSWORD=admin&lt;br /&gt;            - KEYCLOAK_FEATURES=scripts&lt;br /&gt;            - KEYCLOAK_HTTP_PORT=8080&lt;br /&gt;        &lt;span style=&quot;color: #cc7832;&quot;&gt;volumes&lt;/span&gt;:&lt;br /&gt;            - /PATH_OF_realm-export.json_FILE/:/opt/keycloak/data/import&lt;br /&gt;        &lt;span style=&quot;color: #cc7832;&quot;&gt;ports&lt;/span&gt;:&lt;br /&gt;            - 8082:8080&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;p&gt;&lt;/p&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.gtiwari333.com/feeds/580469022487297238/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://blog.gtiwari333.com/2022/07/keycloak-docker-compose-import-realm.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8219113377173546175/posts/default/580469022487297238'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8219113377173546175/posts/default/580469022487297238'/><link rel='alternate' type='text/html' href='http://blog.gtiwari333.com/2022/07/keycloak-docker-compose-import-realm.html' title='KeyCloak docker-compose import realm file'/><author><name>GT</name><uri>http://www.blogger.com/profile/16923656636145211711</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8219113377173546175.post-8704884840299696447</id><published>2021-05-13T00:59:00.000+01:00</published><updated>2022-08-15T23:33:17.986+01:00</updated><title type='text'>Kafka - a working docker-compose </title><content type='html'>&lt;p&gt;Here&#39;s a working docker-compose that runs zookeeper, kafka and kafka-ui in same network.&lt;br /&gt;&lt;/p&gt;&lt;pre style=&quot;background-color: #2b2b2b; color: #a9b7c6; font-family: &amp;quot;JetBrains Mono&amp;quot;, monospace; font-size: 9.8pt;&quot;&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;version&lt;/span&gt;: &lt;span style=&quot;color: #6a8759;&quot;&gt;&#39;3.8&#39;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;services&lt;/span&gt;:&lt;br /&gt;&lt;br /&gt;    &lt;span style=&quot;color: #cc7832;&quot;&gt;zookeeper&lt;/span&gt;:&lt;br /&gt;        &lt;span style=&quot;color: #cc7832;&quot;&gt;container_name&lt;/span&gt;: zookeeper&lt;br /&gt;        &lt;span style=&quot;color: #cc7832;&quot;&gt;image&lt;/span&gt;: confluentinc/cp-zookeeper:latest&lt;br /&gt;        &lt;span style=&quot;color: #cc7832;&quot;&gt;hostname&lt;/span&gt;: zookeeper&lt;br /&gt;        &lt;span style=&quot;color: #cc7832;&quot;&gt;restart&lt;/span&gt;: always&lt;br /&gt;        &lt;span style=&quot;color: #cc7832;&quot;&gt;environment&lt;/span&gt;:&lt;br /&gt;            &lt;span style=&quot;color: #cc7832;&quot;&gt;ZOOKEEPER_SERVER_ID&lt;/span&gt;: 1&lt;br /&gt;            &lt;span style=&quot;color: #cc7832;&quot;&gt;ZOOKEEPER_CLIENT_PORT&lt;/span&gt;: 2181&lt;br /&gt;            &lt;span style=&quot;color: #cc7832;&quot;&gt;ZOOKEEPER_TICK_TIME&lt;/span&gt;: 2000&lt;br /&gt;            &lt;span style=&quot;color: #cc7832;&quot;&gt;ZOOKEEPER_INIT_LIMIT&lt;/span&gt;: 5&lt;br /&gt;            &lt;span style=&quot;color: #cc7832;&quot;&gt;ZOOKEEPER_SYNC_LIMIT&lt;/span&gt;: 2&lt;br /&gt;        &lt;span style=&quot;color: #cc7832;&quot;&gt;ports&lt;/span&gt;:&lt;br /&gt;            - 2181:2181&lt;br /&gt;&lt;br /&gt;    &lt;span style=&quot;color: #cc7832;&quot;&gt;kafka&lt;/span&gt;:&lt;br /&gt;        &lt;span style=&quot;color: #cc7832;&quot;&gt;container_name&lt;/span&gt;: kafka&lt;br /&gt;        &lt;span style=&quot;color: #cc7832;&quot;&gt;image&lt;/span&gt;: confluentinc/cp-kafka:latest&lt;br /&gt;        &lt;span style=&quot;color: #cc7832;&quot;&gt;depends_on&lt;/span&gt;:&lt;br /&gt;            - zookeeper&lt;br /&gt;        &lt;span style=&quot;color: #cc7832;&quot;&gt;restart&lt;/span&gt;: always&lt;br /&gt;        &lt;span style=&quot;color: #cc7832;&quot;&gt;environment&lt;/span&gt;:&lt;br /&gt;            &lt;span style=&quot;color: #cc7832;&quot;&gt;KAFKA_BROKER_ID&lt;/span&gt;: 1&lt;br /&gt;            &lt;span style=&quot;color: #cc7832;&quot;&gt;KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR&lt;/span&gt;: 1&lt;br /&gt;            &lt;span style=&quot;color: #cc7832;&quot;&gt;KAFKA_ZOOKEEPER_CONNECT&lt;/span&gt;: zookeeper:2181&lt;br /&gt;            &lt;span style=&quot;color: #cc7832;&quot;&gt;KAFKA_ADVERTISED_LISTENERS&lt;/span&gt;: PLAINTEXT://localhost:9092,RMOFF_DOCKER_HACK://kafka:9093&lt;br /&gt;            &lt;span style=&quot;color: #cc7832;&quot;&gt;KAFKA_LISTENERS&lt;/span&gt;: PLAINTEXT://:9092,RMOFF_DOCKER_HACK://:9093&lt;br /&gt;            &lt;span style=&quot;color: #cc7832;&quot;&gt;KAFKA_LISTENER_SECURITY_PROTOCOL_MAP&lt;/span&gt;: PLAINTEXT:PLAINTEXT,RMOFF_DOCKER_HACK:PLAINTEXT&lt;br /&gt;            &lt;span style=&quot;color: #cc7832;&quot;&gt;KAFKA_INTER_BROKER_LISTENER_NAME&lt;/span&gt;: RMOFF_DOCKER_HACK&lt;br /&gt;        &lt;span style=&quot;color: #cc7832;&quot;&gt;ports&lt;/span&gt;:&lt;br /&gt;            - 9092:9092&lt;br /&gt;&lt;br /&gt;    &lt;span style=&quot;color: #cc7832;&quot;&gt;kouncil&lt;/span&gt;:&lt;br /&gt;        &lt;span style=&quot;color: #cc7832;&quot;&gt;container_name&lt;/span&gt;: kouncil&lt;br /&gt;        &lt;span style=&quot;color: #cc7832;&quot;&gt;image&lt;/span&gt;: consdata/kouncil:latest&lt;br /&gt;        &lt;span style=&quot;color: #cc7832;&quot;&gt;restart&lt;/span&gt;: always&lt;br /&gt;        &lt;span style=&quot;color: #cc7832;&quot;&gt;depends_on&lt;/span&gt;:&lt;br /&gt;            - kafka&lt;br /&gt;        &lt;span style=&quot;color: #cc7832;&quot;&gt;environment&lt;/span&gt;:&lt;br /&gt;            &lt;span style=&quot;color: #cc7832;&quot;&gt;bootstrapServers&lt;/span&gt;: kafka:9093&lt;br /&gt;            &lt;span style=&quot;color: #cc7832;&quot;&gt;BOOTSTRAPSERVERS&lt;/span&gt;: kafka:9093&lt;br /&gt;            &lt;span style=&quot;color: #cc7832;&quot;&gt;BOOTSTRAP_SERVERS&lt;/span&gt;: kafka:9093&lt;br /&gt;        &lt;span style=&quot;color: #cc7832;&quot;&gt;ports&lt;/span&gt;:&lt;br /&gt;            - 8888:8080&lt;br /&gt;&lt;/pre&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.gtiwari333.com/feeds/8704884840299696447/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://blog.gtiwari333.com/2021/12/kafka-working-docker-compose.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8219113377173546175/posts/default/8704884840299696447'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8219113377173546175/posts/default/8704884840299696447'/><link rel='alternate' type='text/html' href='http://blog.gtiwari333.com/2021/12/kafka-working-docker-compose.html' title='Kafka - a working docker-compose '/><author><name>GT</name><uri>http://www.blogger.com/profile/16923656636145211711</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8219113377173546175.post-4208482189758545676</id><published>2021-04-18T17:54:00.005+01:00</published><updated>2021-04-18T17:57:07.070+01:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="spring-framework"/><title type='text'>Spring Boot - shutdown and restart application programmatically</title><content type='html'>&lt;p&gt;Today we will be discussing how to shutdown and restart a Spring application programmatically.&lt;/p&gt;&lt;h3 style=&quot;text-align: left;&quot;&gt;1) New Project&lt;br /&gt;&lt;/h3&gt;&lt;p&gt;First let&#39;s create a simple spring boot app with web dependency so that we can setup an endpoint to trigger the shutdown and restart. Let&#39;s head over to&amp;nbsp; https://start.spring.io/ and choose web and other dependencies that you need&lt;br /&gt;&lt;/p&gt;&lt;h3 style=&quot;text-align: left;&quot;&gt;2) Few words about ApplicationContext and ConfigurableApplicationContext&lt;/h3&gt;&lt;p&gt;ApplicationContext is the central interface that represents the Spring IoC
container and is responsible for instantiating, configuring, and assembling the
beans.&amp;nbsp; ConfigurableApplicationContext is another interface that extends&amp;nbsp; ApplicationContext and provides facilities to configure refresh, startup &amp;amp; shutdown of the application and allows registration of custom listeners to respond to those events.&lt;/p&gt;&lt;h3 style=&quot;text-align: left;&quot;&gt;3) Let&#39;s code!&lt;/h3&gt;&lt;h4 style=&quot;text-align: left;&quot;&gt;3.1) Simple App&lt;/h4&gt;&lt;p&gt;Run the application and store ConfigurableApplicationContext in a static variable appCtx so that we can use it later&lt;br /&gt;&lt;/p&gt;&lt;pre style=&quot;background-color: #2b2b2b; color: #a9b7c6; font-family: &amp;quot;JetBrains Mono&amp;quot;, monospace; font-size: 9.8pt;&quot;&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;import &lt;/span&gt;org.springframework.boot.SpringApplication&lt;span style=&quot;color: #cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;import &lt;/span&gt;org.springframework.boot.autoconfigure.&lt;span style=&quot;color: #bbb529;&quot;&gt;SpringBootApplication&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;import &lt;/span&gt;org.springframework.context.ConfigurableApplicationContext&lt;span style=&quot;color: #cc7832;&quot;&gt;;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #bbb529;&quot;&gt;@SpringBootApplication&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;public class &lt;/span&gt;App {&lt;br /&gt;&lt;br /&gt;    &lt;span style=&quot;color: #cc7832;&quot;&gt;static &lt;/span&gt;ConfigurableApplicationContext &lt;span style=&quot;color: #9876aa; font-style: italic;&quot;&gt;appCtx&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;    public static void &lt;/span&gt;&lt;span style=&quot;color: #ffc66d;&quot;&gt;main&lt;/span&gt;(String[] args) {&lt;br /&gt;        &lt;span style=&quot;color: #9876aa; font-style: italic;&quot;&gt;appCtx &lt;/span&gt;= SpringApplication.&lt;span style=&quot;font-style: italic;&quot;&gt;run&lt;/span&gt;(App.&lt;span style=&quot;color: #cc7832;&quot;&gt;class, &lt;/span&gt;args)&lt;span style=&quot;color: #cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;    &lt;/span&gt;}&lt;/pre&gt;&lt;h4 style=&quot;text-align: left;&quot;&gt;3.2) Shutdown - call ConfigurableApplicationContext.close()&amp;nbsp; &lt;br /&gt;&lt;/h4&gt;&lt;p&gt;This closes the application context, releasing all resources and locks that the implementation might hold. This includes destroying all cached singleton beans.&lt;br /&gt;&lt;/p&gt;&lt;pre style=&quot;background-color: #2b2b2b; color: #a9b7c6; font-family: &amp;quot;JetBrains Mono&amp;quot;, monospace; font-size: 9.8pt;&quot;&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;static void &lt;/span&gt;&lt;span style=&quot;color: #ffc66d;&quot;&gt;shutdown&lt;/span&gt;() {&lt;br /&gt;    &lt;span style=&quot;color: #9876aa; font-style: italic;&quot;&gt;appCtx&lt;/span&gt;.close()&lt;span style=&quot;color: #cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;}&lt;/pre&gt;&lt;h4 style=&quot;text-align: left;&quot;&gt;3.3) Restart&lt;/h4&gt;&lt;p&gt;We know how to stop and start the application. To stop, we can simply do:&lt;/p&gt;&lt;pre style=&quot;background-color: #2b2b2b; color: #a9b7c6; font-family: &amp;quot;JetBrains Mono&amp;quot;, monospace; font-size: 9.8pt;&quot;&gt;&lt;span style=&quot;color: #9876aa; font-style: italic;&quot;&gt;appCtx&lt;/span&gt;.close()&lt;span style=&quot;color: #cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;p&gt;And to start, we can simply call the SpringApplication.run(..)&lt;/p&gt;&lt;pre style=&quot;background-color: #2b2b2b; color: #a9b7c6; font-family: &amp;quot;JetBrains Mono&amp;quot;, monospace; font-size: 9.8pt;&quot;&gt;&lt;span style=&quot;color: #9876aa; font-style: italic;&quot;&gt;appCtx &lt;/span&gt;= SpringApplication.&lt;span style=&quot;font-style: italic;&quot;&gt;run&lt;/span&gt;(App.&lt;span style=&quot;color: #cc7832;&quot;&gt;class, &lt;/span&gt;&lt;span style=&quot;color: #b389c5;&quot;&gt;args&lt;/span&gt;)&lt;span style=&quot;color: #cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;p&gt;But the catch here is, appCtx.close() would exit the application and the SpringApplication.run(..) won&#39;t be able to run&lt;/p&gt;&lt;p&gt;So, a solution would be to use Daemon Thread to shutdown and start the application. Daemon thread is a type of thread that can run independently in the background(independent of the main thread).&amp;nbsp;&lt;/p&gt;&lt;pre style=&quot;background-color: #2b2b2b; color: #a9b7c6; font-family: &amp;quot;JetBrains Mono&amp;quot;, monospace; font-size: 9.8pt;&quot;&gt;Thread t = &lt;span style=&quot;color: #cc7832;&quot;&gt;new &lt;/span&gt;Thread(() -&amp;gt; {&lt;br /&gt;    &lt;span style=&quot;color: #9876aa; font-style: italic;&quot;&gt;appCtx&lt;/span&gt;.close()&lt;span style=&quot;color: #cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;    &lt;/span&gt;&lt;span style=&quot;color: #9876aa; font-style: italic;&quot;&gt;appCtx &lt;/span&gt;= SpringApplication.&lt;span style=&quot;font-style: italic;&quot;&gt;run&lt;/span&gt;(...)&lt;span style=&quot;color: #cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;})&lt;span style=&quot;color: #cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;&lt;br /&gt;&lt;/span&gt;t.setDaemon(&lt;span style=&quot;color: #cc7832;&quot;&gt;false&lt;/span&gt;)&lt;span style=&quot;color: #cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;t.start()&lt;span style=&quot;color: #cc7832;&quot;&gt;;&lt;/span&gt;&lt;/pre&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;h4 style=&quot;text-align: left;&quot;&gt;3.4) Passing the original program arguments&lt;br /&gt;&lt;/h4&gt;&lt;p&gt;We may want to use the original arguments that were passed to run method when we restart the application. &lt;br /&gt;&lt;/p&gt;&lt;pre style=&quot;background-color: #2b2b2b; color: #a9b7c6; font-family: &amp;quot;JetBrains Mono&amp;quot;, monospace; font-size: 9.8pt;&quot;&gt; SpringApplication.&lt;span style=&quot;font-style: italic;&quot;&gt;run&lt;/span&gt;(App.&lt;span style=&quot;color: #cc7832;&quot;&gt;class, &lt;/span&gt;args)&lt;span style=&quot;color: #cc7832;&quot;&gt;;&lt;/span&gt;&lt;/pre&gt;&lt;p&gt;We can do that by either storing String[] args in a static variable or use ApplicationArguments bean that Spring Boot creates to store the arguments.&lt;/p&gt;&lt;pre style=&quot;background-color: #2b2b2b; color: #a9b7c6; font-family: &amp;quot;JetBrains Mono&amp;quot;, monospace; font-size: 9.8pt;&quot;&gt;var args = &lt;span style=&quot;color: #9876aa; font-style: italic;&quot;&gt;appCtx&lt;/span&gt;.getBean(ApplicationArguments.&lt;span style=&quot;color: #cc7832;&quot;&gt;class&lt;/span&gt;)&lt;span style=&quot;color: #cc7832;&quot;&gt;;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;      //retrieve&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #9876aa; font-style: italic;&quot;&gt;appCtx &lt;/span&gt;= SpringApplication.&lt;span style=&quot;font-style: italic;&quot;&gt;run&lt;/span&gt;(App.&lt;span style=&quot;color: #cc7832;&quot;&gt;class, &lt;/span&gt;&lt;span style=&quot;color: #b389c5;&quot;&gt;args&lt;/span&gt;.getSourceArgs())&lt;span style=&quot;color: #cc7832;&quot;&gt;;  //pass&lt;/span&gt;&lt;/pre&gt;&lt;h4 style=&quot;text-align: left;&quot;&gt;&lt;br /&gt;&lt;/h4&gt;&lt;h4 style=&quot;text-align: left;&quot;&gt;3.5) Web endpoints to trigger the shutdown and restart&lt;/h4&gt;&lt;pre style=&quot;background-color: #2b2b2b; color: #a9b7c6; font-family: &amp;quot;JetBrains Mono&amp;quot;, monospace; font-size: 9.8pt;&quot;&gt;&lt;span style=&quot;color: #bbb529;&quot;&gt;@RestController&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;class &lt;/span&gt;Ctrl {&lt;br /&gt;&lt;br /&gt;    &lt;span style=&quot;color: #bbb529;&quot;&gt;@GetMapping&lt;/span&gt;(&lt;span style=&quot;color: #6a8759;&quot;&gt;&quot;/shutdown&quot;&lt;/span&gt;)&lt;br /&gt;    &lt;span style=&quot;color: #cc7832;&quot;&gt;void &lt;/span&gt;&lt;span style=&quot;color: #ffc66d;&quot;&gt;shutdown&lt;/span&gt;() {&lt;br /&gt;        App.&lt;span style=&quot;font-style: italic;&quot;&gt;shutdown&lt;/span&gt;()&lt;span style=&quot;color: #cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;    &lt;/span&gt;}&lt;br /&gt;&lt;br /&gt;    &lt;span style=&quot;color: #bbb529;&quot;&gt;@GetMapping&lt;/span&gt;(&lt;span style=&quot;color: #6a8759;&quot;&gt;&quot;/restart&quot;&lt;/span&gt;)&lt;br /&gt;    &lt;span style=&quot;color: #cc7832;&quot;&gt;void &lt;/span&gt;&lt;span style=&quot;color: #ffc66d;&quot;&gt;restart&lt;/span&gt;() {&lt;br /&gt;        App.&lt;span style=&quot;font-style: italic;&quot;&gt;restart&lt;/span&gt;()&lt;span style=&quot;color: #cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;    &lt;/span&gt;}&lt;br /&gt;}&lt;/pre&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;h3 style=&quot;text-align: left;&quot;&gt;4) Complete Example:&lt;/h3&gt;&lt;pre style=&quot;background-color: #2b2b2b; color: #a9b7c6; font-family: &amp;quot;JetBrains Mono&amp;quot;, monospace; font-size: 9.8pt;&quot;&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;package gt&lt;/span&gt;.restart&lt;span style=&quot;color: #cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;import &lt;/span&gt;org.springframework.boot.ApplicationArguments&lt;span style=&quot;color: #cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;import &lt;/span&gt;org.springframework.boot.SpringApplication&lt;span style=&quot;color: #cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;import &lt;/span&gt;org.springframework.boot.autoconfigure.&lt;span style=&quot;color: #bbb529;&quot;&gt;SpringBootApplication&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;import &lt;/span&gt;org.springframework.context.ConfigurableApplicationContext&lt;span style=&quot;color: #cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;import &lt;/span&gt;org.springframework.web.bind.annotation.&lt;span style=&quot;color: #bbb529;&quot;&gt;GetMapping&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;import &lt;/span&gt;org.springframework.web.bind.annotation.&lt;span style=&quot;color: #bbb529;&quot;&gt;RestController&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #bbb529;&quot;&gt;@SpringBootApplication&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;public class &lt;/span&gt;App {&lt;br /&gt;&lt;br /&gt;    &lt;span style=&quot;color: #cc7832;&quot;&gt;static &lt;/span&gt;ConfigurableApplicationContext &lt;span style=&quot;color: #9876aa; font-style: italic;&quot;&gt;appCtx&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;    public static void &lt;/span&gt;&lt;span style=&quot;color: #ffc66d;&quot;&gt;main&lt;/span&gt;(String[] args) {&lt;br /&gt;        &lt;span style=&quot;color: #9876aa; font-style: italic;&quot;&gt;appCtx &lt;/span&gt;= SpringApplication.&lt;span style=&quot;font-style: italic;&quot;&gt;run&lt;/span&gt;(App.&lt;span style=&quot;color: #cc7832;&quot;&gt;class, &lt;/span&gt;args)&lt;span style=&quot;color: #cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;    &lt;/span&gt;}&lt;br /&gt;&lt;br /&gt;    &lt;span style=&quot;color: #cc7832;&quot;&gt;static void &lt;/span&gt;&lt;span style=&quot;color: #ffc66d;&quot;&gt;shutdown&lt;/span&gt;() {&lt;br /&gt;        &lt;span style=&quot;color: #cc7832;&quot;&gt;if &lt;/span&gt;(&lt;span style=&quot;color: #9876aa; font-style: italic;&quot;&gt;appCtx&lt;/span&gt;.isActive()) {&lt;br /&gt;            &lt;span style=&quot;color: #9876aa; font-style: italic;&quot;&gt;appCtx&lt;/span&gt;.close()&lt;span style=&quot;color: #cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;        &lt;/span&gt;}&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    &lt;span style=&quot;color: #cc7832;&quot;&gt;static void &lt;/span&gt;&lt;span style=&quot;color: #ffc66d;&quot;&gt;restart&lt;/span&gt;() {&lt;br /&gt;        &lt;span style=&quot;color: #cc7832;&quot;&gt;var &lt;/span&gt;args = &lt;span style=&quot;color: #9876aa; font-style: italic;&quot;&gt;appCtx&lt;/span&gt;.getBean(ApplicationArguments.&lt;span style=&quot;color: #cc7832;&quot;&gt;class&lt;/span&gt;)&lt;span style=&quot;color: #cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;        &lt;/span&gt;Thread thread = &lt;span style=&quot;color: #cc7832;&quot;&gt;new &lt;/span&gt;Thread(() -&amp;gt; {&lt;br /&gt;            &lt;span style=&quot;color: #9876aa; font-style: italic;&quot;&gt;appCtx&lt;/span&gt;.close()&lt;span style=&quot;color: #cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;            &lt;/span&gt;&lt;span style=&quot;color: #9876aa; font-style: italic;&quot;&gt;appCtx &lt;/span&gt;= SpringApplication.&lt;span style=&quot;font-style: italic;&quot;&gt;run&lt;/span&gt;(App.&lt;span style=&quot;color: #cc7832;&quot;&gt;class, &lt;/span&gt;&lt;span style=&quot;color: #b389c5;&quot;&gt;args&lt;/span&gt;.getSourceArgs())&lt;span style=&quot;color: #cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;        &lt;/span&gt;})&lt;span style=&quot;color: #cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;        &lt;/span&gt;thread.setDaemon(&lt;span style=&quot;color: #cc7832;&quot;&gt;false&lt;/span&gt;)&lt;span style=&quot;color: #cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;        &lt;/span&gt;thread.start()&lt;span style=&quot;color: #cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;    &lt;/span&gt;}&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: #bbb529;&quot;&gt;@RestController&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;class &lt;/span&gt;Ctrl {&lt;br /&gt;&lt;br /&gt;    &lt;span style=&quot;color: #bbb529;&quot;&gt;@GetMapping&lt;/span&gt;(&lt;span style=&quot;color: #6a8759;&quot;&gt;&quot;/shutdown&quot;&lt;/span&gt;)&lt;br /&gt;    &lt;span style=&quot;color: #cc7832;&quot;&gt;void &lt;/span&gt;&lt;span style=&quot;color: #ffc66d;&quot;&gt;shutdown&lt;/span&gt;() {&lt;br /&gt;        App.&lt;span style=&quot;font-style: italic;&quot;&gt;shutdown&lt;/span&gt;()&lt;span style=&quot;color: #cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;    &lt;/span&gt;}&lt;br /&gt;&lt;br /&gt;    &lt;span style=&quot;color: #bbb529;&quot;&gt;@GetMapping&lt;/span&gt;(&lt;span style=&quot;color: #6a8759;&quot;&gt;&quot;/restart&quot;&lt;/span&gt;)&lt;br /&gt;    &lt;span style=&quot;color: #cc7832;&quot;&gt;void &lt;/span&gt;&lt;span style=&quot;color: #ffc66d;&quot;&gt;restart&lt;/span&gt;() {&lt;br /&gt;        App.&lt;span style=&quot;font-style: italic;&quot;&gt;restart&lt;/span&gt;()&lt;span style=&quot;color: #cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;    &lt;/span&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;h3 style=&quot;text-align: left;&quot;&gt;5) Test&lt;/h3&gt;&lt;p&gt;Call the endpoints&lt;/p&gt;&lt;pre style=&quot;background-color: #2b2b2b; color: #a9b7c6; font-family: &amp;quot;JetBrains Mono&amp;quot;, monospace; font-size: 9.8pt;&quot;&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;GET &lt;/span&gt;http://localhost:8080/restart&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #364135;&quot;&gt;GET http://localhost:8080/shutdown&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.gtiwari333.com/feeds/4208482189758545676/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://blog.gtiwari333.com/2021/04/spring-boot-shutdown-and-restart.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8219113377173546175/posts/default/4208482189758545676'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8219113377173546175/posts/default/4208482189758545676'/><link rel='alternate' type='text/html' href='http://blog.gtiwari333.com/2021/04/spring-boot-shutdown-and-restart.html' title='Spring Boot - shutdown and restart application programmatically'/><author><name>GT</name><uri>http://www.blogger.com/profile/16923656636145211711</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8219113377173546175.post-6779665967723483025</id><published>2021-03-01T17:57:00.001+00:00</published><updated>2021-04-18T18:10:00.938+01:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="spring-framework"/><title type='text'>Read Request parameter String from URL in Spring/HttpServlet</title><content type='html'>&lt;h2 style=&quot;text-align: left;&quot;&gt;Read entire query string(request parameter) in Spring Boot/HttpServlet&lt;/h2&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;In Spring Boot and other Java web frameworks, we capture the request parameters (aka query parameters) and map them to individual variable or a Map&amp;lt;String,String&amp;gt;.&amp;nbsp;&lt;/p&gt;&lt;p&gt;But, if you want to read the entire query parameter in its raw form ( eg: to read &lt;b&gt;&lt;i&gt;name=Ganesh&amp;amp;country=Nepal&amp;amp;ageLt=30&amp;amp;page=1&lt;/i&gt;&lt;/b&gt; from request: &lt;i&gt;http://localhost:8080/search?&lt;b&gt;name=Ganesh&amp;amp;country=Nepal&amp;amp;ageLt=30&amp;amp;page=1), &lt;/b&gt;&lt;/i&gt;you can utilize &lt;b&gt;HttpServletRequest.getQueryString()&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;Example:&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;pre style=&quot;background-color: #2b2b2b; color: #a9b7c6; font-family: &#39;JetBrains Mono&#39;,monospace; font-size: 9.8pt;&quot;&gt;&lt;span style=&quot;color: #bbb529;&quot;&gt;@GetMapping&lt;/span&gt;(&lt;span style=&quot;color: #6a8759;&quot;&gt;&quot;/test1&quot;&lt;/span&gt;)&lt;br /&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;void &lt;/span&gt;&lt;span style=&quot;color: #ffc66d;&quot;&gt;endpoint1&lt;/span&gt;(HttpServletRequest req) {&lt;br /&gt;    &lt;span style=&quot;color: #cc7832;&quot;&gt;var &lt;/span&gt;qs = req.getQueryString()  &lt;span style=&quot;color: grey;&quot;&gt;//returns the entire string&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: grey;&quot;&gt;    &lt;/span&gt;qs.split(&lt;span style=&quot;color: #6a8759;&quot;&gt;&quot;&amp;amp;&quot;&lt;/span&gt;) &lt;span style=&quot;color: grey;&quot;&gt;//split to get the individual parameters&lt;br /&gt;&lt;/span&gt;}&lt;/pre&gt;&lt;p&gt;Note: Spring Boot automatically resolves the HttpServletRequest object ( its the real holder of request object in Http Servlet environment)&lt;br /&gt;&lt;/p&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.gtiwari333.com/feeds/6779665967723483025/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://blog.gtiwari333.com/2021/03/read-request-parameter-string-from-url.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8219113377173546175/posts/default/6779665967723483025'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8219113377173546175/posts/default/6779665967723483025'/><link rel='alternate' type='text/html' href='http://blog.gtiwari333.com/2021/03/read-request-parameter-string-from-url.html' title='Read Request parameter String from URL in Spring/HttpServlet'/><author><name>GT</name><uri>http://www.blogger.com/profile/16923656636145211711</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8219113377173546175.post-6406085310309277535</id><published>2021-02-22T18:06:00.002+00:00</published><updated>2021-02-22T18:10:55.509+00:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Computer/Technology Tips"/><category scheme="http://www.blogger.com/atom/ns#" term="git"/><title type='text'>GIT delete merged branches</title><content type='html'>&lt;p&gt;&lt;b&gt;How to delete merged branches from local copy:&lt;/b&gt;&lt;/p&gt;&lt;p&gt;When you work on a project for a while, there is a good chance that you will have a list of old/already merged branches showing on your local git.&amp;nbsp;&lt;/p&gt;&lt;p&gt;When you run &lt;i&gt;$git branch &lt;/i&gt;it will show all the branches since you started working on the project including the ones that are not currently active.&lt;/p&gt;&lt;p&gt;&lt;/p&gt;

&lt;pre&gt;$git branch
    PROJX-1024-add-new-button
    PROJX-1026-add-another-button
    PROJX-1027-titleupdates
    build-fix
    develop
    release
    master 
&lt;/pre&gt;&lt;p&gt;Here&#39;s how you can find the merged branches: It will only list a branch if it exists in local but not in remote(deleted from remote after merging).&lt;br /&gt;&lt;/p&gt;
&lt;pre&gt;$git branch --merged
    PROJX-1024-add-new-button
    build-fix
    develop
    release
&lt;/pre&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;h4 style=&quot;text-align: left;&quot;&gt;Here&#39;s how you delete the merged branches except develop and release&lt;br /&gt;&lt;/h4&gt;
&lt;pre&gt;&lt;span style=&quot;color: #c57633;&quot;&gt;$git &lt;/span&gt;branch --merged | &lt;span style=&quot;color: #c57633;&quot;&gt;egrep &lt;/span&gt;-v &lt;span style=&quot;color: #6a8759;&quot;&gt;&quot;(^\*|develop|release)&quot; &lt;/span&gt;| &lt;span style=&quot;color: #c57633;&quot;&gt;xargs &lt;/span&gt;git branch -d

&lt;/pre&gt;
&lt;p&gt;&lt;br /&gt;You can add any number of branches to the skip list separated by pipe | &lt;/p&gt;&lt;pre&gt;&lt;span style=&quot;color: #c57633;&quot;&gt;$git &lt;/span&gt;branch --merged | &lt;span style=&quot;color: #c57633;&quot;&gt;egrep &lt;/span&gt;-v &lt;span style=&quot;color: #6a8759;&quot;&gt;&quot;(^\*|develop|release|another_branch|yet_another_branch)&quot; &lt;/span&gt;| &lt;span style=&quot;color: #c57633;&quot;&gt;xargs &lt;/span&gt;git branch -d

&lt;/pre&gt;&lt;p&gt;&lt;/p&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.gtiwari333.com/feeds/6406085310309277535/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://blog.gtiwari333.com/2021/02/git-delete-merged-branches.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8219113377173546175/posts/default/6406085310309277535'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8219113377173546175/posts/default/6406085310309277535'/><link rel='alternate' type='text/html' href='http://blog.gtiwari333.com/2021/02/git-delete-merged-branches.html' title='GIT delete merged branches'/><author><name>GT</name><uri>http://www.blogger.com/profile/16923656636145211711</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8219113377173546175.post-7526871470988867130</id><published>2020-09-23T02:03:00.003+01:00</published><updated>2020-10-16T00:16:51.062+01:00</updated><title type='text'>Java view,download,filter email using javax.mail</title><content type='html'>&lt;p&gt;Java SDK doesn&#39;t come with inbuilt mail API but Java-EE (now called Jakarta EE) provides several utility library like json, servlet, web-service, jms, validation, xml, regexp including email.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;In this example I&#39;m going to show how we can connect to email server (eg: gmail) and download/view seen/unseen emails.&lt;/p&gt;&lt;h4 style=&quot;text-align: left;&quot;&gt;Required Dependency :jakarta.mail&lt;/h4&gt;&lt;p&gt;Add this dependency with latest version in your pom.xml or manually download/add the jar file to your project&#39;s lib.&lt;/p&gt;&lt;pre style=&quot;background-color: #2b2b2b; color: #a9b7c6; font-family: &amp;quot;JetBrains Mono&amp;quot;, monospace; font-size: 9.8pt;&quot;&gt;&lt;span style=&quot;color: #e8bf6a;&quot;&gt;&amp;lt;dependency&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #e8bf6a;&quot;&gt;    &amp;lt;groupId&amp;gt;&lt;/span&gt;com.sun.mail&lt;span style=&quot;color: #e8bf6a;&quot;&gt;&amp;lt;/groupId&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #e8bf6a;&quot;&gt;    &amp;lt;artifactId&amp;gt;&lt;/span&gt;jakarta.mail&lt;span style=&quot;color: #e8bf6a;&quot;&gt;&amp;lt;/artifactId&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #e8bf6a;&quot;&gt;&amp;lt;/dependency&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;p&gt;&lt;/p&gt;&lt;h4 style=&quot;text-align: left;&quot;&gt;The API Usage:&lt;/h4&gt;&lt;p&gt;Ideally, the steps would be as following:&lt;/p&gt;&lt;p&gt;- Create Session with host, protocal type etc&lt;/p&gt;&lt;p&gt;- Get message store (Store) for the email protocol. The supported protocols are IMAP, POP, SMTP etc&lt;br /&gt;&lt;/p&gt;&lt;p&gt;- Connect to the host using username/password&lt;/p&gt;&lt;p&gt;- Open folder and search for messages&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;The API Usage with code example:&lt;/p&gt;&lt;p&gt;&lt;b&gt;- Create Session with host, protocol type etc&lt;/b&gt;&lt;/p&gt;&lt;pre style=&quot;background-color: #2b2b2b; color: #a9b7c6; font-family: &amp;quot;JetBrains Mono&amp;quot;, monospace;&quot;&gt;&lt;span style=&quot;font-size: xx-small;&quot;&gt;Properties properties = &lt;span style=&quot;color: #cc7832;&quot;&gt;new &lt;/span&gt;Properties()&lt;span style=&quot;color: #cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;properties.put(&lt;span style=&quot;color: #6a8759;&quot;&gt;&quot;mail.imap.host&quot;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;, &lt;/span&gt;host)&lt;span style=&quot;color: #cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;properties.put(&lt;span style=&quot;color: #6a8759;&quot;&gt;&quot;mail.store.protocol&quot;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;, protocal&lt;/span&gt;)&lt;span style=&quot;color: #cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;Session emailSession = Session.&lt;span style=&quot;font-style: italic;&quot;&gt;getDefaultInstance&lt;/span&gt;(properties)&lt;span style=&quot;color: #cc7832;&quot;&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;p&gt;&lt;b&gt;&amp;nbsp;- Get message store (Store) for the email protocol. The supported protocols are IMAP, POP, SMTP etc&lt;/b&gt;&lt;/p&gt;&lt;pre style=&quot;background-color: #2b2b2b; color: #a9b7c6; font-family: &amp;quot;JetBrains Mono&amp;quot;, monospace; font-size: 12.8pt;&quot;&gt;&lt;span style=&quot;font-size: xx-small;&quot;&gt;Store store = emailSession.getStore(protocal)&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;&lt;span style=&quot;font-size: xx-small;&quot;&gt;;&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;p&gt;&lt;b&gt;- Connect to the host using username/password&lt;/b&gt;&lt;/p&gt;&lt;pre style=&quot;background-color: #2b2b2b; color: #a9b7c6; font-family: &amp;quot;JetBrains Mono&amp;quot;, monospace; font-size: 12.8pt;&quot;&gt;&lt;span style=&quot;font-size: xx-small;&quot;&gt;store.connect(host&lt;span style=&quot;color: #cc7832;&quot;&gt;, &lt;/span&gt;user&lt;span style=&quot;color: #cc7832;&quot;&gt;, &lt;/span&gt;password)&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;&lt;span style=&quot;font-size: xx-small;&quot;&gt;;&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;p&gt;&lt;b&gt;- Open folder and search for messages&lt;/b&gt;&lt;/p&gt;&lt;pre style=&quot;background-color: #2b2b2b; color: #a9b7c6; font-family: &amp;quot;JetBrains Mono&amp;quot;, monospace;&quot;&gt;&lt;span style=&quot;font-size: xx-small;&quot;&gt;Folder emailFolder = store.getFolder(&lt;span style=&quot;color: #6a8759;&quot;&gt;&quot;INBOX&quot;&lt;/span&gt;)&lt;span style=&quot;color: #cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;emailFolder.open(Folder.&lt;span style=&quot;color: #9876aa; font-style: italic;&quot;&gt;READ_ONLY&lt;/span&gt;)&lt;span style=&quot;color: #cc7832;&quot;&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;p&gt;&lt;b&gt;Search using filters&lt;/b&gt;&lt;br /&gt;&lt;/p&gt;&lt;pre style=&quot;background-color: #2b2b2b; color: #a9b7c6; font-family: &amp;quot;JetBrains Mono&amp;quot;, monospace;&quot;&gt;&lt;span style=&quot;font-size: xx-small;&quot;&gt;Flags seen = &lt;span style=&quot;color: #cc7832;&quot;&gt;new &lt;/span&gt;Flags(Flags.Flag.&lt;span style=&quot;color: #9876aa; font-style: italic;&quot;&gt;SEEN&lt;/span&gt;)&lt;span style=&quot;color: #cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;FlagTerm unseenFlagTerm = &lt;span style=&quot;color: #cc7832;&quot;&gt;new &lt;/span&gt;FlagTerm(seen&lt;span style=&quot;color: #cc7832;&quot;&gt;, false&lt;/span&gt;)&lt;span style=&quot;color: #cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;Message[] messages = emailFolder.search(unseenFlagTerm)&lt;span style=&quot;color: #cc7832;&quot;&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;p&gt;&lt;/p&gt;&lt;h4 style=&quot;text-align: left;&quot;&gt;Complete Example:&lt;/h4&gt;&lt;pre style=&quot;background-color: #2b2b2b; color: #a9b7c6; font-family: &amp;quot;JetBrains Mono&amp;quot;, monospace;&quot;&gt;&lt;span style=&quot;font-size: xx-small;&quot;&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;import &lt;/span&gt;javax.mail.*&lt;span style=&quot;color: #cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;import &lt;/span&gt;javax.mail.search.FlagTerm&lt;span style=&quot;color: #cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;import &lt;/span&gt;java.util.Properties&lt;span style=&quot;color: #cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;public class &lt;/span&gt;MailllllIMAP {&lt;br /&gt;&lt;br /&gt;    &lt;span style=&quot;color: #cc7832;&quot;&gt;public static void &lt;/span&gt;&lt;span style=&quot;color: #ffc66d;&quot;&gt;check&lt;/span&gt;(String host&lt;span style=&quot;color: #cc7832;&quot;&gt;, &lt;/span&gt;String protocal&lt;span style=&quot;color: #cc7832;&quot;&gt;, &lt;/span&gt;String user&lt;span style=&quot;color: #cc7832;&quot;&gt;, &lt;/span&gt;String password) {&lt;br /&gt;        &lt;span style=&quot;color: #cc7832;&quot;&gt;try &lt;/span&gt;{&lt;br /&gt;            Properties properties = &lt;span style=&quot;color: #cc7832;&quot;&gt;new &lt;/span&gt;Properties()&lt;span style=&quot;color: #cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;            &lt;/span&gt;properties.put(&lt;span style=&quot;color: #6a8759;&quot;&gt;&quot;mail.imap.host&quot;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;, &lt;/span&gt;host)&lt;span style=&quot;color: #cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;            &lt;/span&gt;properties.put(&lt;span style=&quot;color: #6a8759;&quot;&gt;&quot;mail.store.protocol&quot;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;, &lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-size: xx-small;&quot;&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;protocal&lt;/span&gt;)&lt;span style=&quot;color: #cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;            &lt;/span&gt;Session emailSession = Session.&lt;span style=&quot;font-style: italic;&quot;&gt;getDefaultInstance&lt;/span&gt;(properties)&lt;span style=&quot;color: #cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;            &lt;/span&gt;Store store = emailSession.getStore(storeType)&lt;span style=&quot;color: #cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;            &lt;/span&gt;store.connect(host&lt;span style=&quot;color: #cc7832;&quot;&gt;, &lt;/span&gt;user&lt;span style=&quot;color: #cc7832;&quot;&gt;, &lt;/span&gt;password)&lt;span style=&quot;color: #cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;            &lt;/span&gt;Folder emailFolder = store.getFolder(&lt;span style=&quot;color: #6a8759;&quot;&gt;&quot;INBOX&quot;&lt;/span&gt;)&lt;span style=&quot;color: #cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;            &lt;/span&gt;emailFolder.open(Folder.&lt;span style=&quot;color: #9876aa; font-style: italic;&quot;&gt;READ_ONLY&lt;/span&gt;)&lt;span style=&quot;color: #cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;            &lt;/span&gt;&lt;span style=&quot;color: grey;&quot;&gt;//unseen email filter&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: grey;&quot;&gt;            &lt;/span&gt;Flags seen = &lt;span style=&quot;color: #cc7832;&quot;&gt;new &lt;/span&gt;Flags(Flags.Flag.&lt;span style=&quot;color: #9876aa; font-style: italic;&quot;&gt;SEEN&lt;/span&gt;)&lt;span style=&quot;color: #cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;            &lt;/span&gt;FlagTerm unseenFlagTerm = &lt;span style=&quot;color: #cc7832;&quot;&gt;new &lt;/span&gt;FlagTerm(seen&lt;span style=&quot;color: #cc7832;&quot;&gt;, false&lt;/span&gt;)&lt;span style=&quot;color: #cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;            &lt;/span&gt;Message[] messages = emailFolder.search(unseenFlagTerm)&lt;span style=&quot;color: #cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;            &lt;/span&gt;System.&lt;span style=&quot;color: #9876aa; font-style: italic;&quot;&gt;out&lt;/span&gt;.println(&lt;span style=&quot;color: #6a8759;&quot;&gt;&quot;Total messages: &quot; &lt;/span&gt;+ messages.&lt;span style=&quot;color: #9876aa;&quot;&gt;length&lt;/span&gt;)&lt;span style=&quot;color: #cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;            for &lt;/span&gt;(Message m : messages) {&lt;br /&gt;                System.&lt;span style=&quot;color: #9876aa; font-style: italic;&quot;&gt;out&lt;/span&gt;.println((&lt;span style=&quot;color: #6a8759;&quot;&gt;&quot;From: &quot; &lt;/span&gt;+ m.getFrom()[&lt;span style=&quot;color: #6897bb;&quot;&gt;0&lt;/span&gt;]))&lt;span style=&quot;color: #cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;                &lt;/span&gt;System.&lt;span style=&quot;color: #9876aa; font-style: italic;&quot;&gt;out&lt;/span&gt;.println((&lt;span style=&quot;color: #6a8759;&quot;&gt;&quot;Subject: &quot; &lt;/span&gt;+ m.getSubject()))&lt;span style=&quot;color: #cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;                &lt;/span&gt;System.&lt;span style=&quot;color: #9876aa; font-style: italic;&quot;&gt;out&lt;/span&gt;.println((&lt;span style=&quot;color: #6a8759;&quot;&gt;&quot;Subject: &quot; &lt;/span&gt;+ m.getContent()))&lt;span style=&quot;color: #cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;                &lt;/span&gt;&lt;span style=&quot;color: grey;&quot;&gt;//other fields&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: grey;&quot;&gt;            &lt;/span&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;            &lt;span style=&quot;color: grey;&quot;&gt;//close or do more stuff&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: grey;&quot;&gt;            &lt;/span&gt;emailFolder.close(&lt;span style=&quot;color: #cc7832;&quot;&gt;false&lt;/span&gt;)&lt;span style=&quot;color: #cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;            &lt;/span&gt;store.close()&lt;span style=&quot;color: #cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;        &lt;/span&gt;} &lt;span style=&quot;color: #cc7832;&quot;&gt;catch &lt;/span&gt;(Exception e) {&lt;br /&gt;            e.printStackTrace()&lt;span style=&quot;color: #cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;        &lt;/span&gt;}&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    &lt;span style=&quot;color: #cc7832;&quot;&gt;public static void &lt;/span&gt;&lt;span style=&quot;color: #ffc66d;&quot;&gt;main&lt;/span&gt;(String[] args) {&lt;br /&gt;&lt;br /&gt;        String host = &lt;span style=&quot;color: #6a8759;&quot;&gt;&quot;pop.gmail.com&quot;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;        &lt;/span&gt;String protocal = &lt;span style=&quot;color: #6a8759;&quot;&gt;&quot;imaps&quot;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;        &lt;/span&gt;String username = &lt;span style=&quot;color: #6a8759;&quot;&gt;&quot;XXXX@gmail.com&quot;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;        &lt;/span&gt;String password = &lt;span style=&quot;color: #6a8759;&quot;&gt;&quot;XXXXXXX&quot;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;        &lt;/span&gt;&lt;span style=&quot;font-style: italic;&quot;&gt;check&lt;/span&gt;(host&lt;span style=&quot;color: #cc7832;&quot;&gt;, protocal&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;, &lt;/span&gt;username&lt;span style=&quot;color: #cc7832;&quot;&gt;, &lt;/span&gt;password)&lt;span style=&quot;color: #cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;    &lt;/span&gt;}&lt;br /&gt;&lt;br /&gt;}&lt;/span&gt;&lt;/pre&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;h4 style=&quot;text-align: left;&quot;&gt;&lt;b&gt;What if you get an error like this?&lt;/b&gt;&lt;/h4&gt;&lt;p&gt;&lt;code&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/span&gt;AuthenticationFailedException: [AUTH] Username and password not accepted.&lt;/code&gt;&lt;/p&gt;&lt;p&gt;You get this error when trying to gmail. You will need to turn ON the &quot;Allow less secure apps&quot; option on &lt;a href=&quot;https://www.google.com/settings/security/lesssecureapps&quot; rel=&quot;nofollow noreferrer&quot;&gt;https://www.google.com/settings/security/lesssecureapps&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.gtiwari333.com/feeds/7526871470988867130/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://blog.gtiwari333.com/2020/09/java-view-download-filter-email-using.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8219113377173546175/posts/default/7526871470988867130'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8219113377173546175/posts/default/7526871470988867130'/><link rel='alternate' type='text/html' href='http://blog.gtiwari333.com/2020/09/java-view-download-filter-email-using.html' title='Java view,download,filter email using javax.mail'/><author><name>GT</name><uri>http://www.blogger.com/profile/16923656636145211711</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8219113377173546175.post-4642582225546807767</id><published>2020-09-23T01:17:00.011+01:00</published><updated>2020-10-16T00:20:10.655+01:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="java"/><title type='text'>Java HttpClient tutorial with File Upload example</title><content type='html'>&lt;p&gt;Java 11 comes with a nice HttpClient API/Implementation so that we no longer need to rely on external libraries like Apache HttpClient execute http requests.&lt;/p&gt;&lt;p&gt;It has the following simple classes(namely HttpClient, HttpRequest, HttpResponse, BodyPublisher, BodyHandler) and they all follow builder pattern to create objects.&lt;/p&gt;&lt;p&gt;&lt;b&gt;Creating HttpClient:&lt;/b&gt;&lt;/p&gt;&lt;pre style=&quot;background-color: #2b2b2b; color: #a9b7c6; font-family: &amp;quot;JetBrains Mono&amp;quot;, monospace; font-size: 11.3pt;&quot;&gt;HttpClient client = HttpClient.&lt;span style=&quot;font-style: italic;&quot;&gt;newBuilder&lt;/span&gt;().build()&lt;span style=&quot;color: #cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;Creating request:&lt;/b&gt;&lt;/p&gt;&lt;pre style=&quot;background-color: #2b2b2b; color: #a9b7c6; font-family: &amp;quot;JetBrains Mono&amp;quot;, monospace; font-size: 11.3pt;&quot;&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;HttpRequest request = HttpRequest.&lt;span style=&quot;font-style: italic;&quot;&gt;newBuilder&lt;/span&gt;()&lt;br /&gt;        .header(&lt;span style=&quot;color: #6a8759;&quot;&gt;&quot;key1&quot;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: #6a8759;&quot;&gt;&quot;value1&quot;&lt;/span&gt;)&lt;br /&gt;        .header(&lt;span style=&quot;color: #6a8759;&quot;&gt;&quot;key2&quot;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: #6a8759;&quot;&gt;&quot;value2&quot;&lt;/span&gt;)&lt;br /&gt;        .uri(URI.&lt;span style=&quot;font-style: italic;&quot;&gt;create&lt;/span&gt;(&lt;span style=&quot;color: #6a8759;&quot;&gt;&quot;http://localhost:8080/hello&quot;&lt;/span&gt;))&lt;br /&gt;        .POST(HttpRequest.BodyPublishers.&lt;span style=&quot;font-style: italic;&quot;&gt;ofString&lt;/span&gt;(&lt;span style=&quot;color: #6a8759;&quot;&gt;&quot;Request Body&quot;&lt;/span&gt;))&lt;br /&gt;        .build()&lt;span style=&quot;color: #cc7832;&quot;&gt;;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;&lt;/span&gt;&lt;/pre&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;Sending request:&lt;/b&gt;&lt;/p&gt;&lt;pre style=&quot;background-color: #2b2b2b; color: #a9b7c6; font-family: &amp;quot;JetBrains Mono&amp;quot;, monospace; font-size: 11.3pt;&quot;&gt;client.send(request&lt;span style=&quot;color: #cc7832;&quot;&gt;, &lt;/span&gt;HttpResponse.BodyHandlers.APPROPRIATE_HANDLER)&lt;span style=&quot;color: #cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;p&gt;Here, BodyPublisher and BodyHandler can be used to create request body and process returned response respectively. They both support string, byte, file, input stream etc &lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;Upload file using &lt;i&gt;BodyPublishers.ofFile&lt;/i&gt;&lt;br /&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;Normally file upload using a web page are implemented using multi-part(file data with additional properties). But in this example we are going to upload file&#39;s byte array in request body and file name in request param.&lt;/p&gt;&lt;pre style=&quot;background-color: #2b2b2b; color: #a9b7c6; font-family: &amp;quot;JetBrains Mono&amp;quot;, monospace;&quot;&gt;&lt;span style=&quot;font-size: xx-small;&quot;&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;import &lt;/span&gt;java.io.IOException&lt;span style=&quot;color: #cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;import &lt;/span&gt;java.net.URI&lt;span style=&quot;color: #cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;import &lt;/span&gt;java.net.http.HttpClient&lt;span style=&quot;color: #cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;import &lt;/span&gt;java.net.http.HttpRequest&lt;span style=&quot;color: #cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;import &lt;/span&gt;java.net.http.HttpResponse&lt;span style=&quot;color: #cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;import &lt;/span&gt;java.nio.file.Path&lt;span style=&quot;color: #cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;public class &lt;/span&gt;HttpTest {&lt;br /&gt;  &lt;span style=&quot;color: #cc7832;&quot;&gt;public static void &lt;/span&gt;&lt;span style=&quot;color: #ffc66d;&quot;&gt;main&lt;/span&gt;(String[] args) &lt;span style=&quot;color: #cc7832;&quot;&gt;throws &lt;/span&gt;Exception {&lt;br /&gt;    &lt;span style=&quot;font-style: italic;&quot;&gt;uploadFile&lt;/span&gt;(Path.&lt;span style=&quot;font-style: italic;&quot;&gt;of&lt;/span&gt;(&lt;span style=&quot;color: #6a8759;&quot;&gt;&quot;testFile.txt&quot;&lt;/span&gt;))&lt;span style=&quot;color: #cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;  &lt;/span&gt;}&lt;br /&gt;&lt;br /&gt;  &lt;span style=&quot;color: #cc7832;&quot;&gt;public static void &lt;/span&gt;&lt;span style=&quot;color: #ffc66d;&quot;&gt;uploadFile&lt;/span&gt;(Path file) &lt;span style=&quot;color: #cc7832;&quot;&gt;throws &lt;/span&gt;IOException&lt;span style=&quot;color: #cc7832;&quot;&gt;, &lt;/span&gt;InterruptedException {&lt;br /&gt;    HttpClient client = HttpClient.&lt;span style=&quot;font-style: italic;&quot;&gt;newBuilder&lt;/span&gt;().build()&lt;span style=&quot;color: #cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;    &lt;/span&gt;HttpRequest request = HttpRequest.&lt;span style=&quot;font-style: italic;&quot;&gt;newBuilder&lt;/span&gt;()&lt;br /&gt;      .uri(URI.&lt;span style=&quot;font-style: italic;&quot;&gt;create&lt;/span&gt;(&lt;span style=&quot;color: #6a8759;&quot;&gt;&quot;http://localhost:8080/uploadFile?uploader=HttpTestApp&amp;amp;fileName=&quot; &lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #6a8759;&quot;&gt;                  &lt;/span&gt;+ file.getFileName()))&lt;br /&gt;      .POST(HttpRequest.BodyPublishers.&lt;span style=&quot;font-style: italic;&quot;&gt;ofFile&lt;/span&gt;(file))&lt;br /&gt;      .build()&lt;span style=&quot;color: #cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;    &lt;/span&gt;client.send(request&lt;span style=&quot;color: #cc7832;&quot;&gt;, &lt;/span&gt;HttpResponse.BodyHandlers.&lt;span style=&quot;font-style: italic;&quot;&gt;ofString&lt;/span&gt;())&lt;span style=&quot;color: #cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;  &lt;/span&gt;}&lt;br /&gt;}&lt;/span&gt;&lt;/pre&gt;&lt;p&gt;To make the example complete, let&#39;s assume we have a following simple Spring Boot app that receives the file byte array as request body:&lt;br /&gt;&lt;/p&gt;&lt;pre style=&quot;background-color: #2b2b2b; color: #a9b7c6; font-family: &amp;quot;JetBrains Mono&amp;quot;, monospace;&quot;&gt;&lt;span style=&quot;font-size: xx-small;&quot;&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;import &lt;/span&gt;org.springframework.boot.SpringApplication&lt;span style=&quot;color: #cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;import &lt;/span&gt;org.springframework.boot.autoconfigure.&lt;span style=&quot;color: #bbb529;&quot;&gt;SpringBootApplication&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;import &lt;/span&gt;org.springframework.stereotype.&lt;span style=&quot;color: #bbb529;&quot;&gt;Controller&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;import &lt;/span&gt;org.springframework.web.bind.annotation.*&lt;span style=&quot;color: #cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;import &lt;/span&gt;java.io.*&lt;span style=&quot;color: #cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #bbb529;&quot;&gt;@SpringBootApplication&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;public class &lt;/span&gt;FileUploadApp {&lt;br /&gt;    &lt;span style=&quot;color: #cc7832;&quot;&gt;public static void &lt;/span&gt;&lt;span style=&quot;color: #ffc66d;&quot;&gt;main&lt;/span&gt;(String[] args) {&lt;br /&gt;        SpringApplication.&lt;span style=&quot;font-style: italic;&quot;&gt;run&lt;/span&gt;(FileUploadApp.&lt;span style=&quot;color: #cc7832;&quot;&gt;class, &lt;/span&gt;args)&lt;span style=&quot;color: #cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;    &lt;/span&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: #bbb529;&quot;&gt;@Controller&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;class &lt;/span&gt;FileUplCtrl {&lt;br /&gt;&lt;br /&gt;  &lt;span style=&quot;color: #bbb529;&quot;&gt;@PostMapping&lt;/span&gt;(path = &lt;span style=&quot;color: #6a8759;&quot;&gt;&quot;/uploadFile&quot;&lt;/span&gt;)&lt;br /&gt;  &lt;span style=&quot;color: #cc7832;&quot;&gt;public void &lt;/span&gt;&lt;span style=&quot;color: #ffc66d;&quot;&gt;addPhoto&lt;/span&gt;(&lt;span style=&quot;color: #bbb529;&quot;&gt;@RequestBody &lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;byte&lt;/span&gt;[] barr&lt;span style=&quot;color: #cc7832;&quot;&gt;,&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;              &lt;/span&gt;&lt;span style=&quot;color: #bbb529;&quot;&gt;@RequestParam&lt;/span&gt;(name = &lt;span style=&quot;color: #6a8759;&quot;&gt;&quot;uploader&quot;&lt;/span&gt;) String uploader&lt;span style=&quot;color: #cc7832;&quot;&gt;,&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;              &lt;/span&gt;&lt;span style=&quot;color: #bbb529;&quot;&gt;@RequestParam&lt;/span&gt;(name = &lt;span style=&quot;color: #6a8759;&quot;&gt;&quot;fileName&quot;&lt;/span&gt;) String fileName) &lt;span style=&quot;color: #cc7832;&quot;&gt;throws &lt;/span&gt;Exception {&lt;br /&gt;&lt;br /&gt;   System.&lt;span style=&quot;color: #9876aa; font-style: italic;&quot;&gt;out&lt;/span&gt;.println(&lt;span style=&quot;color: #6a8759;&quot;&gt;&quot;Received file &quot; &lt;/span&gt;+ fileName + &lt;span style=&quot;color: #6a8759;&quot;&gt;&quot; , uploaded by &quot; &lt;/span&gt;+ uploader + &lt;span style=&quot;color: #6a8759;&quot;&gt;&quot; Size: &quot; &lt;/span&gt;+ barr.&lt;span style=&quot;color: #9876aa;&quot;&gt;length&lt;/span&gt;)&lt;span style=&quot;color: #cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;    &lt;/span&gt;&lt;span style=&quot;color: grey;&quot;&gt;//write to disk&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: grey;&quot;&gt;    &lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;try &lt;/span&gt;(OutputStream os = &lt;span style=&quot;color: #cc7832;&quot;&gt;new &lt;/span&gt;FileOutputStream(&lt;span style=&quot;color: #cc7832;&quot;&gt;new &lt;/span&gt;File(&lt;span style=&quot;color: #6a8759;&quot;&gt;&quot;UPL&quot; &lt;/span&gt;+ fileName))) {&lt;br /&gt;         os.write(barr)&lt;span style=&quot;color: #cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;    &lt;/span&gt;}&lt;br /&gt;&lt;br /&gt;  }&lt;br /&gt;}&lt;/span&gt;&lt;/pre&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Required Dependency on Spring Boot app:&lt;/p&gt;&lt;pre style=&quot;background-color: #2b2b2b; color: #a9b7c6; font-family: &amp;quot;JetBrains Mono&amp;quot;, monospace;&quot;&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;&lt;span style=&quot;color: #e8bf6a;&quot;&gt;&amp;lt;dependency&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #e8bf6a;&quot;&gt;    &amp;lt;groupId&amp;gt;&lt;/span&gt;org.springframework.boot&lt;span style=&quot;color: #e8bf6a;&quot;&gt;&amp;lt;/groupId&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #e8bf6a;&quot;&gt;    &amp;lt;artifactId&amp;gt;&lt;/span&gt;spring-boot-starter-web&lt;span style=&quot;color: #e8bf6a;&quot;&gt;&amp;lt;/artifactId&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #e8bf6a;&quot;&gt;&amp;lt;/dependency&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Enjoy coding!&lt;br /&gt;&lt;/p&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.gtiwari333.com/feeds/4642582225546807767/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://blog.gtiwari333.com/2020/09/java-httpclient-tutorial-with-file.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8219113377173546175/posts/default/4642582225546807767'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8219113377173546175/posts/default/4642582225546807767'/><link rel='alternate' type='text/html' href='http://blog.gtiwari333.com/2020/09/java-httpclient-tutorial-with-file.html' title='Java HttpClient tutorial with File Upload example'/><author><name>GT</name><uri>http://www.blogger.com/profile/16923656636145211711</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8219113377173546175.post-6042198458971593715</id><published>2020-09-14T02:11:00.008+01:00</published><updated>2020-10-16T00:32:05.746+01:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="spring-mvc-framework"/><title type='text'>Thymeleaf re-usable pagination component- Spring MVC/Bootstrap</title><content type='html'>&lt;p&gt;In this blog, we will discuss how we can create a reusable pagination component using Thymeleaf and Spring MVC/Data. &lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;Goal is to create a pagination UI similar to this:&lt;br /&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;&amp;nbsp;&lt;/b&gt;&lt;img alt=&quot;&quot; src=&quot;data:image/png;base64,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&quot; /&gt; &lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;h4 style=&quot;text-align: left;&quot;&gt;Controller&amp;nbsp;&lt;/h4&gt;&lt;div style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;font-weight: normal;&quot;&gt;Spring resolves the size and page parameter from URL : &lt;/span&gt;&lt;b&gt;/users?size=20&amp;amp;page=1&lt;/b&gt; &lt;span style=&quot;font-weight: normal;&quot;&gt;to Pageable object at the Controller methods. We are returning Page&amp;lt;&amp;gt; instead of simple list. Page contains all the information that we need to create the pagination UI as above.&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;pre style=&quot;background-color: #2b2b2b; color: #a9b7c6; font-family: &amp;quot;JetBrains Mono&amp;quot;, monospace; font-size: 9.8pt;&quot;&gt;&lt;span style=&quot;color: #bbb529;&quot;&gt;@GetMapping&lt;/span&gt;(&lt;span style=&quot;color: #6a8759;&quot;&gt;&quot;/articles&quot;&lt;/span&gt;)&lt;br /&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;public &lt;/span&gt;String &lt;span style=&quot;color: #ffc66d;&quot;&gt;userHome&lt;/span&gt;(Model model&lt;span style=&quot;color: #cc7832;&quot;&gt;, &lt;/span&gt;Pageable pageable) {&lt;br /&gt;    Page&amp;lt;Article&amp;gt; page= &lt;span style=&quot;color: #9876aa;&quot;&gt;articleService&lt;/span&gt;.findAllByStatus(Status.PUBLISHED&lt;span style=&quot;color: #cc7832;&quot;&gt;, &lt;/span&gt;pageable)&lt;span style=&quot;color: #cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;    &lt;/span&gt;model.addAttribute(&lt;span style=&quot;color: #6a8759;&quot;&gt;&quot;articles&quot;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;, &lt;/span&gt;page)&lt;span style=&quot;color: #cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;    return &lt;/span&gt;&lt;span style=&quot;color: #6a8759;&quot;&gt;&quot;home-page&quot;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;}&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: #bbb529;&quot;&gt;@GetMapping&lt;/span&gt;(&lt;span style=&quot;color: #6a8759;&quot;&gt;&quot;/users&quot;&lt;/span&gt;)&lt;br /&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;public &lt;/span&gt;String &lt;span style=&quot;color: #ffc66d;&quot;&gt;userHome&lt;/span&gt;(Model model&lt;span style=&quot;color: #cc7832;&quot;&gt;, &lt;/span&gt;Pageable pageable) {&lt;br /&gt;    Page&amp;lt;User&amp;gt; page= userRepo.findAllByStatus(Status.ACTIVE&lt;span style=&quot;color: #cc7832;&quot;&gt;, &lt;/span&gt;pageable)&lt;span style=&quot;color: #cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;    &lt;/span&gt;model.addAttribute(&lt;span style=&quot;color: #6a8759;&quot;&gt;&quot;users&quot;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;, &lt;/span&gt;page)&lt;span style=&quot;color: #cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;    return &lt;/span&gt;&lt;span style=&quot;color: #6a8759;&quot;&gt;&quot;user-list&quot;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;}&lt;/pre&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;h4 style=&quot;text-align: left;&quot;&gt;Pagination at home-page.html&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/h4&gt;&lt;pre style=&quot;background-color: #2b2b2b; color: #a9b7c6; font-family: &amp;quot;JetBrains Mono&amp;quot;, monospace; font-size: 9.8pt;&quot;&gt;&lt;span style=&quot;color: #e8bf6a;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #9876aa;&quot;&gt;th&lt;/span&gt;&lt;span style=&quot;color: #e8bf6a;&quot;&gt;:block &lt;/span&gt;&lt;span style=&quot;color: #9876aa;&quot;&gt;th&lt;/span&gt;&lt;span style=&quot;color: #bababa;&quot;&gt;:each&lt;/span&gt;&lt;span style=&quot;color: #a5c261;&quot;&gt;=&quot;article : ${articles}&quot;&lt;/span&gt;&lt;span style=&quot;color: #e8bf6a;&quot;&gt;&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #e8bf6a;&quot;&gt;   &lt;/span&gt;&lt;span style=&quot;color: grey;&quot;&gt;&amp;lt;!-- display article in a table row or card/box --&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #e8bf6a;&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color: #9876aa;&quot;&gt;th&lt;/span&gt;&lt;span style=&quot;color: #e8bf6a;&quot;&gt;:block&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #e8bf6a;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: grey;&quot;&gt;&amp;lt;!--pager at bottom --&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #e8bf6a;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #9876aa;&quot;&gt;th&lt;/span&gt;&lt;span style=&quot;color: #e8bf6a;&quot;&gt;:block &lt;/span&gt;&lt;span style=&quot;color: #9876aa;&quot;&gt;th&lt;/span&gt;&lt;span style=&quot;color: #bababa;&quot;&gt;:replace&lt;/span&gt;&lt;span style=&quot;color: #a5c261;&quot;&gt;=&quot;_fragments/_utils :: pagination(${articles})&quot;&lt;/span&gt;&lt;span style=&quot;color: #e8bf6a;&quot;&gt;&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #e8bf6a;&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color: #9876aa;&quot;&gt;th&lt;/span&gt;&lt;span style=&quot;color: #e8bf6a;&quot;&gt;:block&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;h4 style=&quot;text-align: left;&quot;&gt;Pagination at user-list.html&lt;/h4&gt;&lt;pre style=&quot;background-color: #2b2b2b; color: #a9b7c6; font-family: &amp;quot;JetBrains Mono&amp;quot;, monospace; font-size: 9.8pt;&quot;&gt;&lt;span style=&quot;color: #e8bf6a;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #9876aa;&quot;&gt;th&lt;/span&gt;&lt;span style=&quot;color: #e8bf6a;&quot;&gt;:block &lt;/span&gt;&lt;span style=&quot;color: #9876aa;&quot;&gt;th&lt;/span&gt;&lt;span style=&quot;color: #bababa;&quot;&gt;:each&lt;/span&gt;&lt;span style=&quot;color: #a5c261;&quot;&gt;=&quot;user : ${users}&quot;&lt;/span&gt;&lt;span style=&quot;color: #e8bf6a;&quot;&gt;&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #e8bf6a;&quot;&gt;   &lt;/span&gt;&lt;span style=&quot;color: grey;&quot;&gt;&amp;lt;!-- display user in a table row or card/box --&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #e8bf6a;&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color: #9876aa;&quot;&gt;th&lt;/span&gt;&lt;span style=&quot;color: #e8bf6a;&quot;&gt;:block&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: grey;&quot;&gt;&amp;lt;!--pager at bottom --&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #e8bf6a;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #9876aa;&quot;&gt;th&lt;/span&gt;&lt;span style=&quot;color: #e8bf6a;&quot;&gt;:block &lt;/span&gt;&lt;span style=&quot;color: #9876aa;&quot;&gt;th&lt;/span&gt;&lt;span style=&quot;color: #bababa;&quot;&gt;:replace&lt;/span&gt;&lt;span style=&quot;color: #a5c261;&quot;&gt;=&quot;_fragments/_utils :: pagination(${users})&quot;&lt;/span&gt;&lt;span style=&quot;color: #e8bf6a;&quot;&gt;&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #e8bf6a;&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color: #9876aa;&quot;&gt;th&lt;/span&gt;&lt;span style=&quot;color: #e8bf6a;&quot;&gt;:block&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;h4 style=&quot;text-align: left;&quot;&gt;Reusable Fragment Definition at _fragments/_utils.html &lt;br /&gt;&lt;/h4&gt;&lt;p&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;Note that the pages are 0 based meaning page=0 equals the first page 
of data. You can make it to 1 based using the steps described here: 
https://ganeshtiwaridotcomdotnp.blogspot.com/2020/09/spring-pageable-start-index-with-one.html. You might also need to update the indices below to to handle that.&lt;/span&gt;&lt;br /&gt;&lt;/p&gt;&lt;pre style=&quot;background-color: #2b2b2b; color: #a9b7c6; font-family: &amp;quot;JetBrains Mono&amp;quot;, monospace; font-size: 9.8pt;&quot;&gt;&lt;span style=&quot;color: #e8bf6a;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #9876aa;&quot;&gt;th&lt;/span&gt;&lt;span style=&quot;color: #e8bf6a;&quot;&gt;:block &lt;/span&gt;&lt;span style=&quot;color: #9876aa;&quot;&gt;th&lt;/span&gt;&lt;span style=&quot;color: #bababa;&quot;&gt;:fragment&lt;/span&gt;&lt;span style=&quot;color: #a5c261;&quot;&gt;=&quot;pagination(pagedObject)&quot;&lt;/span&gt;&lt;span style=&quot;color: #e8bf6a;&quot;&gt;&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #e8bf6a;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #e8bf6a;&quot;&gt;    &lt;/span&gt;&lt;span style=&quot;color: grey;&quot;&gt;&amp;lt;!-- works with org.springframework.data.domain.Page&amp;lt;pagedObject&amp;gt;, --&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: grey;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: grey;&quot;&gt;    &lt;/span&gt;&lt;span style=&quot;color: #e8bf6a;&quot;&gt;&amp;lt;div &lt;/span&gt;&lt;span style=&quot;color: #9876aa;&quot;&gt;th&lt;/span&gt;&lt;span style=&quot;color: #bababa;&quot;&gt;:if&lt;/span&gt;&lt;span style=&quot;color: #a5c261;&quot;&gt;=&quot;${pagedObject.getTotalPages() != 1}&quot; &lt;/span&gt;&lt;span style=&quot;color: #bababa;&quot;&gt;class&lt;/span&gt;&lt;span style=&quot;color: #a5c261;&quot;&gt;=&quot;form-group col-md-11 pagination-centered&quot;&lt;/span&gt;&lt;span style=&quot;color: #e8bf6a;&quot;&gt;&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #e8bf6a;&quot;&gt;        &amp;lt;ul &lt;/span&gt;&lt;span style=&quot;color: #bababa;&quot;&gt;class&lt;/span&gt;&lt;span style=&quot;color: #a5c261;&quot;&gt;=&quot;pagination&quot;&lt;/span&gt;&lt;span style=&quot;color: #e8bf6a;&quot;&gt;&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #e8bf6a;&quot;&gt;            &lt;/span&gt;&lt;span style=&quot;color: grey;&quot;&gt;&amp;lt;!-- page number start with 0, totalPages returns actual number of pages --&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: grey;&quot;&gt;            &lt;/span&gt;&lt;span style=&quot;color: #e8bf6a;&quot;&gt;&amp;lt;li &lt;/span&gt;&lt;span style=&quot;color: #9876aa;&quot;&gt;th&lt;/span&gt;&lt;span style=&quot;color: #bababa;&quot;&gt;:classappend&lt;/span&gt;&lt;span style=&quot;color: #a5c261;&quot;&gt;=&quot;${pagedObject.getNumber() == 0} ? disabled&quot; &lt;/span&gt;&lt;span style=&quot;color: #bababa;&quot;&gt;class&lt;/span&gt;&lt;span style=&quot;color: #a5c261;&quot;&gt;=&quot;page-item&quot;&lt;/span&gt;&lt;span style=&quot;color: #e8bf6a;&quot;&gt;&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #e8bf6a;&quot;&gt;                &amp;lt;a &lt;/span&gt;&lt;span style=&quot;color: #bababa;&quot;&gt;class&lt;/span&gt;&lt;span style=&quot;color: #a5c261;&quot;&gt;=&quot;page-link&quot; &lt;/span&gt;&lt;span style=&quot;color: #9876aa;&quot;&gt;th&lt;/span&gt;&lt;span style=&quot;color: #bababa;&quot;&gt;:href&lt;/span&gt;&lt;span style=&quot;color: #a5c261;&quot;&gt;=&quot;@{&#39;&#39;(size=${pagedObject.getSize()}, page=0)}&quot;&lt;/span&gt;&lt;span style=&quot;color: #e8bf6a;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #6d9cbe;&quot;&gt;&amp;amp;laquo;&lt;/span&gt;&lt;span style=&quot;color: #e8bf6a;&quot;&gt;&amp;lt;/a&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #e8bf6a;&quot;&gt;            &amp;lt;/li&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #e8bf6a;&quot;&gt;            &amp;lt;li &lt;/span&gt;&lt;span style=&quot;color: #9876aa;&quot;&gt;th&lt;/span&gt;&lt;span style=&quot;color: #bababa;&quot;&gt;:classappend&lt;/span&gt;&lt;span style=&quot;color: #a5c261;&quot;&gt;=&quot;${pagedObject.getNumber() == 0} ? disabled&quot; &lt;/span&gt;&lt;span style=&quot;color: #bababa;&quot;&gt;class&lt;/span&gt;&lt;span style=&quot;color: #a5c261;&quot;&gt;=&quot;page-item&quot;&lt;/span&gt;&lt;span style=&quot;color: #e8bf6a;&quot;&gt;&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #e8bf6a;&quot;&gt;                &amp;lt;a &lt;/span&gt;&lt;span style=&quot;color: #bababa;&quot;&gt;class&lt;/span&gt;&lt;span style=&quot;color: #a5c261;&quot;&gt;=&quot;page-link&quot;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #a5c261;&quot;&gt;                   &lt;/span&gt;&lt;span style=&quot;color: #9876aa;&quot;&gt;th&lt;/span&gt;&lt;span style=&quot;color: #bababa;&quot;&gt;:href&lt;/span&gt;&lt;span style=&quot;color: #a5c261;&quot;&gt;=&quot;@{&#39;&#39;(size=${pagedObject.getSize()}, page=${pagedObject.getNumber() -1})}&quot;&lt;/span&gt;&lt;span style=&quot;color: #e8bf6a;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #6d9cbe;&quot;&gt;&amp;amp;larr;&lt;/span&gt;&lt;span style=&quot;color: #e8bf6a;&quot;&gt;&amp;lt;/a&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #e8bf6a;&quot;&gt;            &amp;lt;/li&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #e8bf6a;&quot;&gt;            &amp;lt;li &lt;/span&gt;&lt;span style=&quot;color: #9876aa;&quot;&gt;th&lt;/span&gt;&lt;span style=&quot;color: #bababa;&quot;&gt;:classappend&lt;/span&gt;&lt;span style=&quot;color: #a5c261;&quot;&gt;=&quot;${pagedObject.getNumber() == (page  )} ? &#39;active pointer-disabled&#39;&quot;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #a5c261;&quot;&gt;                &lt;/span&gt;&lt;span style=&quot;color: #9876aa;&quot;&gt;th&lt;/span&gt;&lt;span style=&quot;color: #bababa;&quot;&gt;:each&lt;/span&gt;&lt;span style=&quot;color: #a5c261;&quot;&gt;=&quot;page : ${#numbers.sequence(0, pagedObject.getTotalPages() -1)}&quot; &lt;/span&gt;&lt;span style=&quot;color: #bababa;&quot;&gt;class&lt;/span&gt;&lt;span style=&quot;color: #a5c261;&quot;&gt;=&quot;page-item&quot;&lt;/span&gt;&lt;span style=&quot;color: #e8bf6a;&quot;&gt;&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #e8bf6a;&quot;&gt;                &amp;lt;a &lt;/span&gt;&lt;span style=&quot;color: #bababa;&quot;&gt;class&lt;/span&gt;&lt;span style=&quot;color: #a5c261;&quot;&gt;=&quot;page-link&quot; &lt;/span&gt;&lt;span style=&quot;color: #9876aa;&quot;&gt;th&lt;/span&gt;&lt;span style=&quot;color: #bababa;&quot;&gt;:href&lt;/span&gt;&lt;span style=&quot;color: #a5c261;&quot;&gt;=&quot;@{&#39;&#39;(size=${pagedObject.getSize()}, page=${page})}&quot;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #a5c261;&quot;&gt;                   &lt;/span&gt;&lt;span style=&quot;color: #9876aa;&quot;&gt;th&lt;/span&gt;&lt;span style=&quot;color: #bababa;&quot;&gt;:text&lt;/span&gt;&lt;span style=&quot;color: #a5c261;&quot;&gt;=&quot;${page + 1}&quot;&lt;/span&gt;&lt;span style=&quot;color: #e8bf6a;&quot;&gt;&amp;gt;&amp;lt;/a&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #e8bf6a;&quot;&gt;            &amp;lt;/li&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #e8bf6a;&quot;&gt;            &amp;lt;li &lt;/span&gt;&lt;span style=&quot;color: #9876aa;&quot;&gt;th&lt;/span&gt;&lt;span style=&quot;color: #bababa;&quot;&gt;:classappend&lt;/span&gt;&lt;span style=&quot;color: #a5c261;&quot;&gt;=&quot;${pagedObject.getNumber() + 1 == pagedObject.getTotalPages()} ? disabled&quot;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #a5c261;&quot;&gt;                &lt;/span&gt;&lt;span style=&quot;color: #bababa;&quot;&gt;class&lt;/span&gt;&lt;span style=&quot;color: #a5c261;&quot;&gt;=&quot;page-item&quot;&lt;/span&gt;&lt;span style=&quot;color: #e8bf6a;&quot;&gt;&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #e8bf6a;&quot;&gt;                &amp;lt;a &lt;/span&gt;&lt;span style=&quot;color: #bababa;&quot;&gt;class&lt;/span&gt;&lt;span style=&quot;color: #a5c261;&quot;&gt;=&quot;page-link&quot;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #a5c261;&quot;&gt;                   &lt;/span&gt;&lt;span style=&quot;color: #9876aa;&quot;&gt;th&lt;/span&gt;&lt;span style=&quot;color: #bababa;&quot;&gt;:href&lt;/span&gt;&lt;span style=&quot;color: #a5c261;&quot;&gt;=&quot;@{&#39;&#39;(size=${pagedObject.getSize()}, page=${pagedObject.getNumber() + 1})}&quot;&lt;/span&gt;&lt;span style=&quot;color: #e8bf6a;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #6d9cbe;&quot;&gt;&amp;amp;rarr;&lt;/span&gt;&lt;span style=&quot;color: #e8bf6a;&quot;&gt;&amp;lt;/a&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #e8bf6a;&quot;&gt;            &amp;lt;/li&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #e8bf6a;&quot;&gt;            &amp;lt;li &lt;/span&gt;&lt;span style=&quot;color: #9876aa;&quot;&gt;th&lt;/span&gt;&lt;span style=&quot;color: #bababa;&quot;&gt;:classappend&lt;/span&gt;&lt;span style=&quot;color: #a5c261;&quot;&gt;=&quot;${pagedObject.getNumber() + 1 == pagedObject.getTotalPages()} ? disabled&quot;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #a5c261;&quot;&gt;                &lt;/span&gt;&lt;span style=&quot;color: #bababa;&quot;&gt;class&lt;/span&gt;&lt;span style=&quot;color: #a5c261;&quot;&gt;=&quot;page-item&quot;&lt;/span&gt;&lt;span style=&quot;color: #e8bf6a;&quot;&gt;&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #e8bf6a;&quot;&gt;                &amp;lt;a &lt;/span&gt;&lt;span style=&quot;color: #bababa;&quot;&gt;class&lt;/span&gt;&lt;span style=&quot;color: #a5c261;&quot;&gt;=&quot;page-link&quot;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #a5c261;&quot;&gt;                   &lt;/span&gt;&lt;span style=&quot;color: #9876aa;&quot;&gt;th&lt;/span&gt;&lt;span style=&quot;color: #bababa;&quot;&gt;:href&lt;/span&gt;&lt;span style=&quot;color: #a5c261;&quot;&gt;=&quot;@{&#39;&#39;(size=${pagedObject.getSize()}, page=${pagedObject.getTotalPages()})}&quot;&lt;/span&gt;&lt;span style=&quot;color: #e8bf6a;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #6d9cbe;&quot;&gt;&amp;amp;raquo;&lt;/span&gt;&lt;span style=&quot;color: #e8bf6a;&quot;&gt;&amp;lt;/a&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #e8bf6a;&quot;&gt;            &amp;lt;/li&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #e8bf6a;&quot;&gt;        &amp;lt;/ul&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #e8bf6a;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #e8bf6a;&quot;&gt;        &amp;lt;p &lt;/span&gt;&lt;span style=&quot;color: #bababa;&quot;&gt;class&lt;/span&gt;&lt;span style=&quot;color: #a5c261;&quot;&gt;=&quot;text-muted small&quot;&lt;/span&gt;&lt;span style=&quot;color: #e8bf6a;&quot;&gt;&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #e8bf6a;&quot;&gt;            &lt;/span&gt;Showing page &lt;span style=&quot;color: #e8bf6a;&quot;&gt;&amp;lt;span &lt;/span&gt;&lt;span style=&quot;color: #9876aa;&quot;&gt;th&lt;/span&gt;&lt;span style=&quot;color: #bababa;&quot;&gt;:text&lt;/span&gt;&lt;span style=&quot;color: #a5c261;&quot;&gt;=&quot;${pagedObject.getNumber() +1}&quot;&lt;/span&gt;&lt;span style=&quot;color: #e8bf6a;&quot;&gt;&amp;gt;&amp;lt;/span&amp;gt; &lt;/span&gt;of &lt;span style=&quot;color: #e8bf6a;&quot;&gt;&amp;lt;span&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #e8bf6a;&quot;&gt;            &lt;/span&gt;&lt;span style=&quot;color: #9876aa;&quot;&gt;th&lt;/span&gt;&lt;span style=&quot;color: #bababa;&quot;&gt;:text&lt;/span&gt;&lt;span style=&quot;color: #a5c261;&quot;&gt;=&quot;${pagedObject.getTotalPages()}&quot;&lt;/span&gt;&lt;span style=&quot;color: #e8bf6a;&quot;&gt;&amp;gt;&amp;lt;/span&amp;gt;&lt;/span&gt;.&lt;br /&gt;            Total: &lt;span style=&quot;color: #e8bf6a;&quot;&gt;&amp;lt;span &lt;/span&gt;&lt;span style=&quot;color: #9876aa;&quot;&gt;th&lt;/span&gt;&lt;span style=&quot;color: #bababa;&quot;&gt;:text&lt;/span&gt;&lt;span style=&quot;color: #a5c261;&quot;&gt;=&quot;${pagedObject.getTotalElements()}&quot;&lt;/span&gt;&lt;span style=&quot;color: #e8bf6a;&quot;&gt;&amp;gt;&amp;lt;/span&amp;gt;&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;        &lt;span style=&quot;color: #e8bf6a;&quot;&gt;&amp;lt;/p&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #e8bf6a;&quot;&gt;    &amp;lt;/div&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #e8bf6a;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #e8bf6a;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #e8bf6a;&quot;&gt;    &amp;lt;div &lt;/span&gt;&lt;span style=&quot;color: #9876aa;&quot;&gt;th&lt;/span&gt;&lt;span style=&quot;color: #bababa;&quot;&gt;:if&lt;/span&gt;&lt;span style=&quot;color: #a5c261;&quot;&gt;=&quot;${pagedObject.getTotalElements() ==0}&quot;&lt;/span&gt;&lt;span style=&quot;color: #e8bf6a;&quot;&gt;&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #e8bf6a;&quot;&gt;        &amp;lt;div &lt;/span&gt;&lt;span style=&quot;color: #bababa;&quot;&gt;class&lt;/span&gt;&lt;span style=&quot;color: #a5c261;&quot;&gt;=&quot;alert alert-warning&quot; &lt;/span&gt;&lt;span style=&quot;color: #bababa;&quot;&gt;role&lt;/span&gt;&lt;span style=&quot;color: #a5c261;&quot;&gt;=&quot;alert&quot;&lt;/span&gt;&lt;span style=&quot;color: #e8bf6a;&quot;&gt;&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #e8bf6a;&quot;&gt;            &amp;lt;span&amp;gt;&lt;/span&gt;No items available.&lt;span style=&quot;color: #e8bf6a;&quot;&gt;&amp;lt;/span&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #e8bf6a;&quot;&gt;        &amp;lt;/div&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #e8bf6a;&quot;&gt;    &amp;lt;/div&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #e8bf6a;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #e8bf6a;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #e8bf6a;&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color: #9876aa;&quot;&gt;th&lt;/span&gt;&lt;span style=&quot;color: #e8bf6a;&quot;&gt;:block&amp;gt;&lt;/span&gt;&lt;/pre&gt;


&lt;br /&gt;
Reference: https://github.com/gtiwari333/spring-boot-web-application-seed/blob/master/main-app/src/main/resources/templates/_fragments/_utils.html&lt;br /&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.gtiwari333.com/feeds/6042198458971593715/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://blog.gtiwari333.com/2020/09/thymeleaf-re-usable-pagination-spring.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8219113377173546175/posts/default/6042198458971593715'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8219113377173546175/posts/default/6042198458971593715'/><link rel='alternate' type='text/html' href='http://blog.gtiwari333.com/2020/09/thymeleaf-re-usable-pagination-spring.html' title='Thymeleaf re-usable pagination component- Spring MVC/Bootstrap'/><author><name>GT</name><uri>http://www.blogger.com/profile/16923656636145211711</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8219113377173546175.post-7397982595227664390</id><published>2020-09-14T01:51:00.004+01:00</published><updated>2020-09-14T01:51:31.049+01:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="java"/><title type='text'>Thymeleaf pass parameter to fragment </title><content type='html'>&lt;h3 style=&quot;text-align: left;&quot;&gt;Making reusable fragment/UI Components in Thymeleaf&lt;/h3&gt;&lt;p&gt;Thymeleaf supports creation of &#39;function like&#39; mechanism and pass parameters to make the UI components reusable.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;In this example we are going to create a reusable alert component using thymeleaf:&lt;/p&gt;&lt;p&gt;The fragment definition is similar to how a function/method is defined:&lt;/p&gt;&lt;p&gt;File: _fragments/_utils.html &lt;br /&gt;&lt;/p&gt;&lt;pre style=&quot;background-color: #2b2b2b; color: #a9b7c6; font-family: &#39;JetBrains Mono&#39;,monospace; font-size: 9.8pt;&quot;&gt;&lt;span style=&quot;color: #e8bf6a;&quot;&gt;&amp;lt;div &lt;/span&gt;&lt;span style=&quot;color: #9876aa;&quot;&gt;th&lt;/span&gt;&lt;span style=&quot;color: #bababa;&quot;&gt;:fragment&lt;/span&gt;&lt;span style=&quot;color: #a5c261;&quot;&gt;=&quot;alertBox(message,type)&quot;&lt;/span&gt;&lt;span style=&quot;color: #e8bf6a;&quot;&gt;&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #e8bf6a;&quot;&gt;    &lt;/span&gt;//do stuff with message and type&lt;br /&gt;&lt;span style=&quot;color: #e8bf6a;&quot;&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;p&gt;Let&#39;s call with some parameters in another file:&lt;/p&gt;&lt;pre style=&quot;background-color: #2b2b2b; color: #a9b7c6; font-family: &#39;JetBrains Mono&#39;,monospace; font-size: 9.8pt;&quot;&gt;&lt;span style=&quot;color: #e8bf6a;&quot;&gt;&amp;lt;div &lt;/span&gt;&lt;span style=&quot;color: #9876aa;&quot;&gt;th&lt;/span&gt;&lt;span style=&quot;color: #bababa;&quot;&gt;:replace&lt;/span&gt;&lt;span style=&quot;color: #a5c261;&quot;&gt;=&quot;_fragments/_utils::alertBox (&#39;A message&#39;,&#39;success&#39;)&quot;&lt;/span&gt;&lt;span style=&quot;color: #e8bf6a;&quot;&gt;&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #e8bf6a;&quot;&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;p&gt;The parameter order is not important if you do like this:&lt;/p&gt;&lt;pre style=&quot;background-color: #2b2b2b; color: #a9b7c6; font-family: &#39;JetBrains Mono&#39;,monospace; font-size: 9.8pt;&quot;&gt;&lt;span style=&quot;color: #e8bf6a;&quot;&gt;&amp;lt;div &lt;/span&gt;&lt;span style=&quot;color: #9876aa;&quot;&gt;th&lt;/span&gt;&lt;span style=&quot;color: #bababa;&quot;&gt;:replace&lt;/span&gt;&lt;span style=&quot;color: #a5c261;&quot;&gt;=&quot;_fragments/_utils::alertBox (type = &#39;success&#39;, message=&#39;A message&#39; )&quot;&lt;/span&gt;&lt;span style=&quot;color: #e8bf6a;&quot;&gt;&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #e8bf6a;&quot;&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;p&gt;A complete example:&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;pre style=&quot;background-color: #2b2b2b; color: #a9b7c6; font-family: &#39;JetBrains Mono&#39;,monospace; font-size: 9.8pt;&quot;&gt;&lt;span style=&quot;color: #e8bf6a;&quot;&gt;&amp;lt;div &lt;/span&gt;&lt;span style=&quot;color: #9876aa;&quot;&gt;th&lt;/span&gt;&lt;span style=&quot;color: #bababa;&quot;&gt;:fragment&lt;/span&gt;&lt;span style=&quot;color: #a5c261;&quot;&gt;=&quot;alertBox (message,type)&quot;&lt;/span&gt;&lt;span style=&quot;color: #e8bf6a;&quot;&gt;&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #e8bf6a;&quot;&gt;    &amp;lt;div&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #e8bf6a;&quot;&gt;        &lt;/span&gt;&lt;span style=&quot;color: #9876aa;&quot;&gt;th&lt;/span&gt;&lt;span style=&quot;color: #bababa;&quot;&gt;:classappend&lt;/span&gt;&lt;span style=&quot;color: #a5c261;&quot;&gt;=&quot;|&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #a5c261;&quot;&gt;            ${type == &#39;success&#39; ? &#39;alert-success&#39;: &#39;&#39;}&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #a5c261;&quot;&gt;            ${type == &#39;info&#39; ? &#39;alert-info&#39;: &#39;&#39;}&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #a5c261;&quot;&gt;            ${type == &#39;danger&#39; ? &#39;alert-danger&#39;: &#39;&#39;} |&quot;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #a5c261;&quot;&gt;        &lt;/span&gt;&lt;span style=&quot;color: #bababa;&quot;&gt;class&lt;/span&gt;&lt;span style=&quot;color: #a5c261;&quot;&gt;=&quot;alert alert-dismissible&quot;&lt;/span&gt;&lt;span style=&quot;color: #e8bf6a;&quot;&gt;&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #e8bf6a;&quot;&gt;        &amp;lt;a &lt;/span&gt;&lt;span style=&quot;color: #bababa;&quot;&gt;href&lt;/span&gt;&lt;span style=&quot;color: #a5c261;&quot;&gt;=&quot;#&quot; &lt;/span&gt;&lt;span style=&quot;color: #bababa;&quot;&gt;class&lt;/span&gt;&lt;span style=&quot;color: #a5c261;&quot;&gt;=&quot;close&quot; &lt;/span&gt;&lt;span style=&quot;color: #bababa;&quot;&gt;data-dismiss&lt;/span&gt;&lt;span style=&quot;color: #a5c261;&quot;&gt;=&quot;alert&quot; &lt;/span&gt;&lt;span style=&quot;color: #bababa;&quot;&gt;aria-label&lt;/span&gt;&lt;span style=&quot;color: #a5c261;&quot;&gt;=&quot;close&quot;&lt;/span&gt;&lt;span style=&quot;color: #e8bf6a;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #6d9cbe;&quot;&gt;&amp;amp;times;&lt;/span&gt;&lt;span style=&quot;color: #e8bf6a;&quot;&gt;&amp;lt;/a&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #e8bf6a;&quot;&gt;        &amp;lt;span &lt;/span&gt;&lt;span style=&quot;color: #9876aa;&quot;&gt;th&lt;/span&gt;&lt;span style=&quot;color: #bababa;&quot;&gt;:text&lt;/span&gt;&lt;span style=&quot;color: #a5c261;&quot;&gt;=&quot;${message}&quot;&lt;/span&gt;&lt;span style=&quot;color: #e8bf6a;&quot;&gt;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #e8bf6a;&quot;&gt;    &amp;lt;/div&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #e8bf6a;&quot;&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Calling it:&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;pre style=&quot;background-color: #2b2b2b; color: #a9b7c6; font-family: &#39;JetBrains Mono&#39;,monospace; font-size: 9.8pt;&quot;&gt;&lt;span style=&quot;color: #e8bf6a;&quot;&gt;&amp;lt;div &lt;/span&gt;&lt;span style=&quot;color: #9876aa;&quot;&gt;th&lt;/span&gt;&lt;span style=&quot;color: #bababa;&quot;&gt;:replace&lt;/span&gt;&lt;span style=&quot;color: #a5c261;&quot;&gt;=&quot;_fragments/_utils :: alertBox (&#39;Hello this is a success!&#39;,&#39;success&#39;)&quot;&lt;/span&gt;&lt;span style=&quot;color: #e8bf6a;&quot;&gt;&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #e8bf6a;&quot;&gt;&amp;lt;/div&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #e8bf6a;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #e8bf6a;&quot;&gt;&amp;lt;div &lt;/span&gt;&lt;span style=&quot;color: #9876aa;&quot;&gt;th&lt;/span&gt;&lt;span style=&quot;color: #bababa;&quot;&gt;:replace&lt;/span&gt;&lt;span style=&quot;color: #a5c261;&quot;&gt;=&quot;_fragments/_utils :: alertBox (&#39;Danger! danger! .......&#39;,&#39;danger&#39;)&quot;&lt;/span&gt;&lt;span style=&quot;color: #e8bf6a;&quot;&gt;&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #e8bf6a;&quot;&gt;&amp;lt;/div&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #e8bf6a;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #e8bf6a;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #e8bf6a;&quot;&gt;&amp;lt;div &lt;/span&gt;&lt;span style=&quot;color: #9876aa;&quot;&gt;th&lt;/span&gt;&lt;span style=&quot;color: #bababa;&quot;&gt;:replace&lt;/span&gt;&lt;span style=&quot;color: #a5c261;&quot;&gt;=&quot;_fragments/_utils :: alertBox ( type = &#39;success&#39;, message=&#39;Success message&#39; )&quot;&lt;/span&gt;&lt;span style=&quot;color: #e8bf6a;&quot;&gt;&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #e8bf6a;&quot;&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Output:&lt;/p&gt;&lt;p&gt;&lt;img alt=&quot;&quot; src=&quot;data:image/png;base64,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&quot; /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.gtiwari333.com/feeds/7397982595227664390/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://blog.gtiwari333.com/2020/09/thymeleaf-pass-parameter-to-fragment.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8219113377173546175/posts/default/7397982595227664390'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8219113377173546175/posts/default/7397982595227664390'/><link rel='alternate' type='text/html' href='http://blog.gtiwari333.com/2020/09/thymeleaf-pass-parameter-to-fragment.html' title='Thymeleaf pass parameter to fragment '/><author><name>GT</name><uri>http://www.blogger.com/profile/16923656636145211711</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8219113377173546175.post-4958190681569349027</id><published>2020-09-13T20:05:00.004+01:00</published><updated>2020-09-14T02:03:21.547+01:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="spring-mvc-framework"/><title type='text'>Spring pageable - start index with one</title><content type='html'>&lt;p&gt;By default Spring uses 0 indexed page meaning a page number of 0 in the request equals the first page. &lt;/p&gt;&lt;p&gt;You can customize this to start from 1 in following by creating a bean of PageableHandlerMethodArgumentResolverCustomizer and setting the setOneIndexedParameters to true.&lt;/p&gt;&lt;p&gt;You can read&amp;nbsp; more about the method argument resolver and other customizations to pagable in my earlier blog post:&amp;nbsp; &lt;a href=&quot;https://ganeshtiwaridotcomdotnp.blogspot.com/2020/09/spring-data-pagination-set-max-page.html&quot;&gt;https://ganeshtiwaridotcomdotnp.blogspot.com/2020/09/spring-data-pagination-set-max-page.html&lt;/a&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Configures whether to expose and assume 1-based page number indexes in the request parameters. When its true, a page number of 1 in the request will be considered the first page.&lt;/p&gt;&lt;pre style=&quot;background-color: #2b2b2b; color: #a9b7c6; font-family: &amp;quot;jetbrains mono&amp;quot;, monospace; font-size: 9.8pt;&quot;&gt;&lt;span style=&quot;color: #bbb529;&quot;&gt;@Bean&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #cc7832;&quot;&gt;public &lt;/span&gt;PageableHandlerMethodArgumentResolverCustomizer &lt;span style=&quot;color: #ffc66d;&quot;&gt;paginationCustomizer&lt;/span&gt;() {&lt;br /&gt;  &lt;span style=&quot;color: #cc7832;&quot;&gt;return &lt;/span&gt;pageableResolver -&amp;gt; {&lt;br /&gt;     pageableResolver.&lt;span style=&quot;color: #ffc66d;&quot;&gt;setOneIndexedParameters&lt;/span&gt;(true)&lt;span style=&quot;color: #cc7832;&quot;&gt;; &lt;/span&gt;&lt;span style=&quot;color: grey;&quot;&gt;//default is false&lt;/span&gt;&lt;span style=&quot;color: grey;&quot;&gt;, starts with 0&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: grey;&quot;&gt;  &lt;/span&gt;}&lt;span style=&quot;color: #cc7832;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;}&lt;/pre&gt;

&lt;p&gt;Now you can have your pagination url to start with page=1 eg: &lt;b&gt;/users?size=20&amp;amp;page=1. &lt;/b&gt;&lt;/p&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.gtiwari333.com/feeds/4958190681569349027/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://blog.gtiwari333.com/2020/09/spring-pageable-start-index-with-one.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8219113377173546175/posts/default/4958190681569349027'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8219113377173546175/posts/default/4958190681569349027'/><link rel='alternate' type='text/html' href='http://blog.gtiwari333.com/2020/09/spring-pageable-start-index-with-one.html' title='Spring pageable - start index with one'/><author><name>GT</name><uri>http://www.blogger.com/profile/16923656636145211711</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry></feed>