Blog

ColdBox 7.2.0 Released

Luis Majano November 20, 2023

Spread the word

Luis Majano

November 20, 2023

Spread the word


Share your thoughts

The release of ColdBox 7.2 introduces several significant enhancements for CFML developers and the ColdBox EcoSystem. A new SchemaInfo Helper offers convenient methods for handling database schema-related tasks, such as checking table and column existence, retrieving database information, and managing text and date-time column types. The Async allApply() now supports error handling with an optional errorHandler argument, allowing developers to log or react to exceptions during asynchronous operations.

Scheduled Task Groups provide a new way to categorize tasks, aiding in organization and management. Additionally, the release introduces the everySecond() period shortcut for tasks, an optional ColdBox class for handling task results, and updates to the DateTimeHelper with various new methods for improved date and time handling. WireBox now features an AOP Auto Mixer for automatic aspect detection, while CacheBox and LogBox receive Struct Literal Config updates for simplified configuration. These enhancements collectively contribute to a more robust and developer-friendly ColdBox platform.

You can read the in-depth release notes here: https://coldbox.ortusbooks.com/readme/release-history/whats-new-with-7.2.0

Update

The best way to update is using CommandBox:

box update coldbox

That's it! You are up to date now!

Major Highlights

ColdBox 7.2 introduces several new features that expand the capabilities of the framework and facilitate better development practices:

SchemaInfo Helper

A new helper has been born that assists you with dealing with Database Schema-related methods that are very common and core to ColdBox and supporting modules. This will grow as needed and be decoupled to its own module later.

  • hasTable()
  • hasColumn()
  • getDatabaseInfo()
  • getTextColumnType()
  • getDateTimeColumnType()
  • getQueryParamDateTimeType()

Async allApply() error handlers

The allApply() is great when dealing with async operations on arrays or collections of objects. However, if something blows up, it would blow up with no way for you to log in or know what happened. However, now you can pass an errorHandler argument which is a UDF/closure that will be attached to the onException() method of the future object. This way, you can react, log, or recover.

results = asyncManager.newFuture().allApply(
	items : data,
	fn : ( record ) => {
		var thisItem = new tests.tmp.User();
		thisItem.injectState = variables.injectState;

		// Inject Both States
		thisItem.injectState( protoTypeState );
		thisItem.injectState( record );

		return thisItem;
	},
	errorHandler : ( e ) => systemOutput( "error: #e.message#" )
)

Scheduled Task Groups

All scheduled tasks now have a group property so you can group your tasks. This is now available when creating tasks or setting them manually.

task( "email-notifications" )
  .setGroup( "admin" )
  .call( () => getInstance( "UserService" ).sendNotifications() )
  .everyDayAt( "13:00" )

You can then get the group using the getGroup() method or it will be added to all task metadata and stats.

New everySecond() period

A new period method shortcut: everySecond(). Very useful so you can fill up your logs with data.

task( "heartbeat" )
    .call( () => systemOutput( "data" ) )
    .everySecond()

Task Results Are Optionals

All task results, if any, are now stored in a ColdBox Optional. Which is a class that can deal with nulls gracefully and it's very fluent.

Task Get Last Result

New method to get the last result, if any, from a task via the getLastResult() method.

var result = task.getLastResult().orElse( "nada" )

DateTimeHelper Updates

Lot's of great new methods and goodies so you can deal with date and times and timezones Oh My!

  • now( [timezone] )
  • getSystemTimezoneAsString()
  • getLastBusinessDayOfTheMonth()
  • getFirstBusinessDayOfTheMonth()
  • dateTimeAdd()
  • timeUnitToSeconds()
  • validateTime()
  • getIsoTime()
  • toInstant()
  • toLocalDateTime()
  • parse()
  • toLocalDate()
  • getTimezone()
  • getSystemTimezone()
  • toJavaDate()
  • duration()
  • period()

WireBox Updates

AOP Auto Mixer

If in your binder you declare aspects or AOP bindings. Then WireBox will automatically detect it and load the AOP Mixer listener for you. You no longer have to declare it manually.

CacheBox Updates

New Struct Literal Config

You can now configure CacheBox by just passing a struct of CacheBox DSL config data.

new cachebox.system.cache.CacheFactory( {
	// LogBox Configuration file
	logBoxConfig      : "coldbox.system.cache.config.LogBox",
	// Scope registration, automatically register the cachebox factory instance on any CF scope
	// By default it registers itself on server scope
	scopeRegistration : {
		enabled : true,
		scope   : "application", // the cf scope you want
		key     : "cacheBox"
	},
	// The defaultCache has an implicit name of "default" which is a reserved cache name
	// It also has a default provider of cachebox which cannot be changed.
	// All timeouts are in minutes
	// Please note that each object store could have more configuration properties
	defaultCache : {
		objectDefaultTimeout           : 120,
		objectDefaultLastAccessTimeout : 30,
		useLastAccessTimeouts          : true,
		reapFrequency                  : 2,
		freeMemoryPercentageThreshold  : 0,
		evictionPolicy                 : "LRU",
		evictCount                     : 1,
		maxObjects                     : 300,
		objectStore                    : "ConcurrentSoftReferenceStore",
		// This switches the internal provider from normal cacheBox to coldbox enabled cachebox
		coldboxEnabled                 : false
	}
} );

LogBox Updates

New Struct Literal Config

You can now configure LogBox by just passing a struct of LogBox DSL config data.

var logBox = new logbox.system.logging.LogBox(
   {
	appenders : { myConsoleLiteral : { class : "ConsoleAppender" } },
	root      : { levelmax : "FATAL", appenders : "*" },
	info      : [ "hello.model", "yes.wow.wow" ],
	warn      : [ "hello.model", "yes.wow.wow" ],
	error     : [ "hello.model", "yes.wow.wow" ]
   }
);

Category Appender Excludes

When you declare categories in LogBox you usually choose the appenders to send messages to, but you could never exclude certain ones. Now you can use the exclude property:

root : { levelmax : "INFO", appenders : "*", exclude: "slackAppender" },
categories = {
    "coldbox.system" = { levelmax="WARN", appenders="*", exclude: "slackAppender" },
    "coldbox.system.web.services.HandlerService" = { levelMax="FATAL", appenders="*", exclude: "slackAppender" },
    "slackLogger" = { levelmax="WARN", appenders="slackAppender", exclude: "slackAppender" }
}

New Event Listeners

You now have two new event listeners that all LogBox appenders can listen to:

  • preProcessQueue( queue, context ) : Fires before a log queue is processed element by element.
  • postProcessQueue( queue, context ) : After the log queue has been processed and after the listener has slept.

processQueueElement receives the queue

The processQueueElement( data, context, queue ) now receives the entire queue as well as the queue third argument.

New Archive Layouts

If you use the RollingFileAppender the default layout format of the archive package was static and you could not change it. The default is:

#filename#-#yyy-mm-dd#-#hh-mm#-#archiveNumber#

Now you have the power. You can set a property for the appender called archiveLayout which maps to a closure/UDF that will build out the layout of the file name.


appenders : {
  files : {
      class : "RollingFileAppender",
      properties : {
          archiveLayout : variables.getDefaultArchiveLayout
      }
  }
}

function getDefaultArchiveLayout( required filename, required archiveCount ){
    return arguments.fileName &
    "-" &
    dateFormat( now(), "yyyy-mm-dd" ) &
    "-" &
    timeFormat( now(), "HH-mm" ) &
    "-#arguments.archiveCount + 1#";
}

Release Notes

Here you can find all the release notes: https://coldbox.ortusbooks.com/readme/release-history/whats-new-with-7.2.0

Conclusion

ColdBox 7.2 marks a noteworthy advancement for CFML developers, presenting robust new features, crucial bug fixes, and improvements that simplify development processes and enhance productivity. Whether you're an experienced ColdBox user or a newcomer, version 7.2 delivers a more dependable and efficient foundation for constructing web applications.

Don't forget to fork and start: https://github.com/coldbox/coldbox-platform

To explore the latest ColdBox release, visit their official website and peruse the updated documentation. Happy coding!

Add Your Comment

Recent Entries

Your ColdFusion Upgrade Passed. Did Your Business Workflows?

Your ColdFusion Upgrade Passed. Did Your Business Workflows?

The server restarted. The administrator shows the expected version. Your homepage loads, and a few familiar screens look fine.

Would you tell the business the upgrade is complete?

Consider an illustrative scenario: a customer submits an order after an upgrade. The application saves it and displays a confirmation page. But the confirmation email never arrives, and the scheduled process that sends the order to fulfillment has not completed.

From the browser, the transaction...

Maria Jose Herrera
Maria Jose Herrera
October 22, 2026
Updating Adobe ColdFusion isn't always just installing the latest patch

Updating Adobe ColdFusion isn't always just installing the latest patch

Keeping Adobe ColdFusion updated is an important part of maintaining a secure and reliable application environment.

But applying a ColdFusion update is not always as simple as installing the latest patch and restarting the server.

Updates can include security fixes, library upgrades, JVM-related changes, changes to the ColdFusion Administrator, updated packages, bug fixes, and changes in runtime behavior. Most updates will not cause problems for most applications. But when you'r...

Cristobal Escobar
Cristobal Escobar
October 21, 2026
BoxLang AI 3.6: Your Agent Now Has Eyes, Ears, and a Voice

BoxLang AI 3.6: Your Agent Now Has Eyes, Ears, and a Voice

Ortus Solutions today announces BoxLang AI 3.6, the release that connects the AI framework to the rest of the BoxLang productivity platform. Your agents can now drive a real browser via bx-playwright, speak and master audio via bx-audio, stream text-to-speech token by token, talk to any MCP server over stdio — and do all of it with the same fluent BoxLang syntax they always have.

Luis Majano
Luis Majano
October 20, 2026