1.0.0-RC.3
April 3, 2025
Last updated
Was this helpful?
April 3, 2025
Last updated
Was this helpful?
We are so excited to release RC.3 for BoxLang. We have squashed almost 100 tickets for this release. Making it the most performant and solid release to date. We do not have any more release candidates scheduled, so this might be the last before our final release on May 1st. So please, please test your applications and report any issues.
Below, you can find some of the significant accomplishments of this release and the full release notes.
We have tested the runtime against all our major libraries, ColdBox, TestBox, and ContentBox, and included our major ColdBox modules. BoxLang now officially runs all of our test suites faster than Adobe 2021, 2023, and 2025, with a give-or-take with the Lucee CFML engine.
We have now released our bx-orm
module, which gives you full integration with JPA/Hibernate into your BoxLang applications. The documentation site is coming soon at
We have finalized our core executors in BoxLang and fully integrated Java Virtual threads so you can use them in your applications. The core executors in BoxLang now are:
As you can see, we have 3 executors pre-defined for the runtime:
io-tasks
- A virtual thread executor for high I/O intensive tasks
cpu-tasks
- A scheduled executor with 10 base threads for your CPU-intensive tasks
scheduled-tasks
- A dedicated executor with 10 base threads for scheduling
This now allows us to create Java-based virtual threads using BoxLang constructs threadNew()
BIF or the thread
component:
The default for parallel executions in map(), filter(), each()
have also been updated to leverage virtual threads by default. You can use the virtual = false
so they can execute in the cpu-tasks
executor if needed. Enjoy the power of virtual threads.
We now can do schedulers in pure BoxLang. This allows us to integrate it into every corner of the runtime. All the docs for scheduling are coming. Here is a sneak peek of a pure BoxLang scheduler:
You can now run schedulers from the CLI in any operating system using our new boxlang schedule
command. Just tell it which scheduler to spin up and forget about CRON.
This will spawn our scheduled tasks, run your scheduler, and wait until you manually block it; if not, it runs forever.
You can also now declare schedulers in your boxlang.json
that once the runtime starts, it will startup your schedulers.
You can now also choose the default executor and cache to use for server fixations. The schedulers
is an array of absolute paths to your scheduler bx classes to load.
You can also define schedulers for your particular applications using the Application.bx
file and the this.schedulers
setting.
As you can see, the value is an array of instantiation paths. At application startup, the schedulers will be created, registered, and started for you.
You also now have a collection of new BIFs to interact with your schedulers and even submit schedulers programmatically.
SchedulerStart( path, [force=false] )
- Create, register and start a new scheduler class.
SchedulerShutdown( name, [force=false], [timeout=0] )
- Shutdown a scheduler
SchedulerRestart( name, [force=false], [timeout=0] )
- Restart a scheduler
SchedulerStats( [name] )
- Get a strut of stats of one or all registered schedulers
SchedulerList()
- Get an array of names of all schedulers
SchedulerGet( name )
- Get a scheduler instance by name
SchedulerGetAll()
- Get all the registered schedulers
You can learn more about virtual threads here:
You can find the scheduler API Docs here:
Command to schedule Schedulers: boxlang schedule {path.bx}
Allows for an array of BoxLang schedulers to be loaded on the startup of the runtime
this.schedulers
for Application.bx loading of schedulers
Scheduler BIFS for managing schedulers programmatically
configuration for `schedulers
` in the `boxlang.json
`
Add parser methods to report on and clear ANTLR cache
this.moduleDependencies
for Modules so they can activate module dependencies
New convention boxlang_modules
wherever you start a BoxLang app it loads those modules first
Added Liberica JDK as a supported version of our language
Add HttpVersion key to http component
add missing "hex" validation to isValid()
executorGet() with no params must return the default executor
Allow throw; with no expression
change listener improvements
Support @module-name suffix for class loading
missing bifs: BoxUnregisterInterceptor(), BoxUnregisterRequestInterceptor()
Added isVirtual, isDaemon, threadGroup, id to the thread metadata
Threading Improvements: isThreadAlive(), isThreadInterrupted(), threadInterrupt() bifs
modules directories being created unecesarrily if not found
enable transparent anchors in java regex
Ensure implicit onRequest() method allows output, even if output=false at the application level
Add Virtual Attribute to Thread Component
Solidify all the executors that ship with the runtime: io-tasks, cpu-tasks, and scheduled-tasks
Put debug mode cache clearing behind a config flag: clearClassFilesOnStartup
Make Java interop varargs optional
only populate form.fieldNames on POST method
Add `modules` key to server.boxlang struct
Add `BoxCache` annotation to allow aliasing cache providers
When First Request to Application is a CFC, the application scope is undefined
cliRead adds a line break
Dump of XML Object Does not Include Node Names
When calling a remote Bx method, specifying returnformat in the pseudo-constructor does not work
ASM BoxPiler is setting up properties after pseudoconstructor runs instead of before
BoxLang BIF Proxy losing context of execution
Key instance not being coerced to string
Super Scope is Lost When UDF in child class from closure in parent class
Static method calling static method loses static context
application.applicationName is a Key instance, not a string
GetContextRoot Returning Slash-Prefixed Root
Strings which contain invalid octals are not casting correctly in the NumberCaster
access remote not recognised
Unable to compile/call box class with java override
`expandPath` not expanding mappings when used in the Application pseudo constructor
Compat: reMatchNoCase should find matches but generates error
expandPath() matches partial folders when mapping path doesn't have trailing slash
getMetata getClass().getSimpleName()|.getName() on IBoxRunnable returns Struct class names
NPE when passing null to first constructor arg of a box class
Space missing when cfquery in function
bx:zip doesn't implement result
Add support for `this.caches` in Application.bx|cfc
Can't create box class with literal @ symbol in name
CGI Scope should check variable name before attempting http_header_name convention
DynamicObject does not support dereference and invocation of non-static BoxLang class methods
Invoke BIF No Longer Functioning on Java Objects in Compat mode
java list dump template breaks in compat mode when expand is not passed
Java Interop - Typed Primitive Arrays passed as Java Args are always `Object[]`
Compiler error - Non-literal value in BoxExpr type with hash expression
ClassMetaDataVisitor cannot find super class in same directory
cfhttp port attribute is not supported
servlet runtime using wrong getPageContext() BIF
Error accessing Map<String,Object> when the key doesn't exist
directoryList has odd behavior when using 'dot' paths
Java Interop - StringBuilder usage is incorrectly passed through to String `replace` BIF
Error in cfdump when dumping a xml variable
Array Index Assignment for appending XML Children Not Working
class java.lang.Integer cannot be cast to class java.lang.String
Error serializing to JSON
getPageContext Lucee compatibility
DateConvert BIF Not Locale Aware
cftransaction - Failed to set savepoint
Can't cast [] to a DateTime
Illegal class name
ListToArray on a Null value Throws Exception
ReplaceNoCase with Integer Replacement throws Exception
Compat - can't cast Short month with time to date
Java Interop - Explicit java.time.Duration is cast to BigDecimal upon use
current template not set in static initializer block
apparent connection leak detected
Issue with Java interop and var args
Array element type mismatch when using primitive arrays of non-well-known classes
Modify dump when dumping a class instance
Default cache was not being defaulted
Default cache should only allow properties to be overriden, not type
system cache clear now can clear query caching
Cache Component Not Accepting Timespan Timeout and IdleTime Args Correctly
Replace BIF fails when replacement argument is numeric
cfcatch key detail is missing
Can't cast [Tue Nov 22 11:01:51 CET 2022] to a DateTime
class java.lang.Integer cannot be cast to class java.lang.String
Invoke Throws Error When Null Value is Assigned on Generated Setter
Consider renaming jsonDeserialize member function
JDBC - SQL Server Error When Using Date Time in Query Param
Incorrect parsing of string times when used in time format when Zone is different from system
Unsupported isolation level: READ_COMMITTED
Miniserver getPageContext().getResponse().reset() not clearing status code and headers