I don't think there is a limit on the number of Business Services a production may contain, 30 is definitely not a big number of BS, I've seen production with more than 100 BS and it works just fine.

Concerning the conversion of system Tasks into (scheduled, I guess) BS, well, it depends 😊

Depending on your use case there can be advantages or disadvantages, the main differences that come to my mind are:

  • Scheduled BS starts only if/when a production is started
  • When using mirror, scheduled BS runs only in Primary member
  • Scheduled BS run (start) only in the production namespace

Hi @Ariel Glikman, my bad, in the latest 2024-2025 "Healthcare Mirroring" documentation page I didn't see this:

To automatically configure and schedule this task, as well as mirror the HSSYS database, use the HSSYS Mirroring Utility.

Alternatively, manually schedule the task on each mirror member:

In fact until 2023.1 the (just released?! 😉) HSSYS Mirroring Utility  was only mentioned in the Upgrade documentation.

I think you need to "HTML escape" your output.

If your json is (relatively) small (<~3.5MB) then change:

Write formatter.Format(json)

With:

Set sc=FormatToString(json,.fsonFormatted)
If $$$ISERR(sc) {
    Write $zconvert(sc,"O","HTML")
} Else {
    Write $zconvert(fsonFormatted,"O","HTML")
}

If your json is potentially big (>~3.5MB), the you have to use FormatToStream() instead of FormatToString() and $zconvert in chunks, see $zconvert documentation.

I strongly discourage the use of embedded sql, it has many disadvantages.

Sorry Theo but I don't agree at all.

The differences (disadvantageous or not) between Embedded SQL and Dynamic Queries have evaporated since few years now, please have a look to this article from @Benjamin De Boe :

New in 2020.1: the Universal Query Cache

In general, I advice to use the query type (Embedded vs. Dynamic) that best fit in given code pattern, for example Embedded SQL is very convenient for query that returns 1 row.

Or maybe you have other issues with Embedded SQL?

I think you are mixing hosts (production component) and jobs.

A host can be enabled or disabled, when a host is enabled there are a number (PoolSize) of jobs and each job has a status.

You can view/list the status/details of production jobs in the Management portal Interoperability -> Monitor -> Jobs.

You already know how to get if an host is enabled/disabled, to get the status of all jobs you can use the query Enumerate in the Ens.Job class, to test it:

Set rs=##class(Ens.Job).EnumerateFunc()

Do rs.%Display()