Page cover
githubEdit

1.0.0-RC.3

April 3, 2025

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.

Performance

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.

BXORM

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 bxorm.ortusbooks.com

install-bx-module bx-orm

Virtual Threads

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:

"executors": {
	// Use this for IO bound tasks, does not support scheduling
	// This is also the default executor for parallel operations
	// This is also the default when requestion an executor service via executorGet()
	"io-tasks": {
		"type": "virtual"
	},
	// Use this for CPU bound tasks, supports scheduling
	"cpu-tasks": {
		"type": "scheduled",
		"threads": 10
	},
	// Used for all scheduled tasks in the runtime
	"scheduled-tasks": {
		"type": "scheduled",
		"threads": 10
	}
},

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

circle-check

This now allows us to create Java-based virtual threads using BoxLang constructs threadNew()BIF or the threadcomponent:

The default for parallel executions in map(), filter(), each()have also been updated to leverage virtual threads by default. You can use the virtual = falseso they can execute in the cpu-tasksexecutor if needed. Enjoy the power of virtual threads.

Schedulers

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 find the scheduler API Docs here: https://s3.amazonaws.com/apidocs.ortussolutions.com/boxlang/1.0.0-rc.3/ortus/boxlang/runtime/async/tasks/BaseScheduler.htmlarrow-up-right

CLI Scheduler

You can now run schedulers from the CLI in any operating system using our new boxlang schedulecommand. 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.

Runtime Schedulers & Configuration

You can also now declare schedulers in your boxlang.jsonthat 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 schedulersis an array of absolute paths to your scheduler bx classes to load.

Application.bx Schedulers

You can also define schedulers for your particular applications using the Application.bxfile and the this.schedulerssetting.

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.

Scheduler BIFs

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

Release Notes

Improvements

BL-1262arrow-up-right Command to schedule Schedulers: boxlang schedule {path.bx}

BL-1265arrow-up-right Allows for an array of BoxLang schedulers to be loaded on the startup of the runtime

BL-1269arrow-up-right this.schedulers for Application.bx loading of schedulers

BL-1268arrow-up-right Scheduler BIFS for managing schedulers programmatically

BL-1264arrow-up-right configuration for `schedulers` in the `boxlang.json`

BL-1212arrow-up-right Add parser methods to report on and clear ANTLR cache

BL-1207arrow-up-right this.moduleDependencies for Modules so they can activate module dependencies

BL-1170arrow-up-right New convention boxlang_modules wherever you start a BoxLang app it loads those modules first

BL-1171arrow-up-right Added Liberica JDK as a supported version of our language

BL-1172arrow-up-right Add HttpVersion key to http component

BL-1176arrow-up-right add missing "hex" validation to isValid()

BL-1181arrow-up-right executorGet() with no params must return the default executor

BL-1182arrow-up-right Allow throw; with no expression

BL-1183arrow-up-right change listener improvements

BL-1193arrow-up-right Support @module-name suffix for class loading

BL-1195arrow-up-right missing bifs: BoxUnregisterInterceptor(), BoxUnregisterRequestInterceptor()

BL-1196arrow-up-right Added isVirtual, isDaemon, threadGroup, id to the thread metadata

BL-1197arrow-up-right Threading Improvements: isThreadAlive(), isThreadInterrupted(), threadInterrupt() bifs

BL-1206arrow-up-right modules directories being created unecesarrily if not found

BL-1208arrow-up-right enable transparent anchors in java regex

BL-1209arrow-up-right Ensure implicit onRequest() method allows output, even if output=false at the application level

BL-1239arrow-up-right Add Virtual Attribute to Thread Component

BL-1240arrow-up-right Solidify all the executors that ship with the runtime: io-tasks, cpu-tasks, and scheduled-tasks

BL-1251arrow-up-right Put debug mode cache clearing behind a config flag: clearClassFilesOnStartup

BL-1258arrow-up-right Make Java interop varargs optional

BL-1259arrow-up-right only populate form.fieldNames on POST method

BL-1260arrow-up-right Add `modules` key to server.boxlang struct

BL-1263arrow-up-right Add `BoxCache` annotation to allow aliasing cache providers

Bugs

BL-1023arrow-up-right When First Request to Application is a CFC, the application scope is undefined

BL-1083arrow-up-right cliRead adds a line break

BL-1107arrow-up-right Dump of XML Object Does not Include Node Names

BL-1145arrow-up-right When calling a remote Bx method, specifying returnformat in the pseudo-constructor does not work

BL-1154arrow-up-right ASM BoxPiler is setting up properties after pseudoconstructor runs instead of before

BL-1162arrow-up-right BoxLang BIF Proxy losing context of execution

BL-1163arrow-up-right Key instance not being coerced to string

BL-1164arrow-up-right Super Scope is Lost When UDF in child class from closure in parent class

BL-1165arrow-up-right Static method calling static method loses static context

BL-1166arrow-up-right application.applicationName is a Key instance, not a string

BL-1168arrow-up-right GetContextRoot Returning Slash-Prefixed Root

BL-1169arrow-up-right Strings which contain invalid octals are not casting correctly in the NumberCaster

BL-1174arrow-up-right access remote not recognised

BL-1175arrow-up-right Unable to compile/call box class with java override

BL-1177arrow-up-right `expandPath` not expanding mappings when used in the Application pseudo constructor

BL-1178arrow-up-right Compat: reMatchNoCase should find matches but generates error

BL-1179arrow-up-right expandPath() matches partial folders when mapping path doesn't have trailing slash

BL-1185arrow-up-right getMetata getClass().getSimpleName()|.getName() on IBoxRunnable returns Struct class names

BL-1187arrow-up-right NPE when passing null to first constructor arg of a box class

BL-1188arrow-up-right Space missing when cfquery in function

BL-1189arrow-up-right bx:zip doesn't implement result

BL-1191arrow-up-right Add support for `this.caches` in Application.bx|cfc

BL-1192arrow-up-right Can't create box class with literal @ symbol in name

BL-1198arrow-up-right CGI Scope should check variable name before attempting http_header_name convention

BL-1200arrow-up-right DynamicObject does not support dereference and invocation of non-static BoxLang class methods

BL-1201arrow-up-right Invoke BIF No Longer Functioning on Java Objects in Compat mode

BL-1202arrow-up-right java list dump template breaks in compat mode when expand is not passed

BL-1203arrow-up-right Java Interop - Typed Primitive Arrays passed as Java Args are always `Object[]`

BL-1204arrow-up-right Compiler error - Non-literal value in BoxExpr type with hash expression

BL-1205arrow-up-right ClassMetaDataVisitor cannot find super class in same directory

BL-1210arrow-up-right cfhttp port attribute is not supported

BL-1211arrow-up-right servlet runtime using wrong getPageContext() BIF

BL-1213arrow-up-right Error accessing Map<String,Object> when the key doesn't exist

BL-1215arrow-up-right directoryList has odd behavior when using 'dot' paths

BL-1220arrow-up-right Java Interop - StringBuilder usage is incorrectly passed through to String `replace` BIF

BL-1221arrow-up-right Error in cfdump when dumping a xml variable

BL-1222arrow-up-right Array Index Assignment for appending XML Children Not Working

BL-1223arrow-up-right class java.lang.Integer cannot be cast to class java.lang.String

BL-1224arrow-up-right Error serializing to JSON

BL-1225arrow-up-right getPageContext Lucee compatibility

BL-1226arrow-up-right DateConvert BIF Not Locale Aware

BL-1227arrow-up-right cftransaction - Failed to set savepoint

BL-1228arrow-up-right Can't cast [] to a DateTime

BL-1229arrow-up-right Illegal class name

BL-1230arrow-up-right ListToArray on a Null value Throws Exception

BL-1231arrow-up-right ReplaceNoCase with Integer Replacement throws Exception

BL-1232arrow-up-right Compat - can't cast Short month with time to date

BL-1233arrow-up-right Java Interop - Explicit java.time.Duration is cast to BigDecimal upon use

BL-1234arrow-up-right current template not set in static initializer block

BL-1236arrow-up-right apparent connection leak detected

BL-1237arrow-up-right Issue with Java interop and var args

BL-1238arrow-up-right Array element type mismatch when using primitive arrays of non-well-known classes

BL-1241arrow-up-right Modify dump when dumping a class instance

BL-1242arrow-up-right Default cache was not being defaulted

BL-1243arrow-up-right Default cache should only allow properties to be overriden, not type

BL-1244arrow-up-right system cache clear now can clear query caching

BL-1245arrow-up-right Cache Component Not Accepting Timespan Timeout and IdleTime Args Correctly

BL-1246arrow-up-right Replace BIF fails when replacement argument is numeric

BL-1247arrow-up-right cfcatch key detail is missing

BL-1248arrow-up-right Can't cast [Tue Nov 22 11:01:51 CET 2022] to a DateTime

BL-1249arrow-up-right class java.lang.Integer cannot be cast to class java.lang.String

BL-1250arrow-up-right Invoke Throws Error When Null Value is Assigned on Generated Setter

BL-1252arrow-up-right Consider renaming jsonDeserialize member function

BL-1255arrow-up-right JDBC - SQL Server Error When Using Date Time in Query Param

BL-1256arrow-up-right Incorrect parsing of string times when used in time format when Zone is different from system

BL-1257arrow-up-right Unsupported isolation level: READ_COMMITTED

BL-1261arrow-up-right Miniserver getPageContext().getResponse().reset() not clearing status code and headers

Last updated

Was this helpful?