Hi Richard! sorry for the delay, I didn't see your message.

Well, for my experience with the websocket the Read timeout is not a problem when is defined as an empty value, if there is a connection error or the websocket is open your objectscript code will usually receive an inmediate response. In this case Read is working just as a "ping". In my example the client is not writting anything.

About the licenses I will paste an answer from other post of the community:
"This does not hold a license, basically the CSP gateway holds the data in it's pool, and at any time, a process can open the WebSocket via OpenServer and Read/Write the socket. Inside read is a call to ReadAsync if SharedConnection = 1."

https://community.intersystems.com/post/asynchronous-websockets-quick-t…

Exactly Alexey, the purpose of the article is just for training. For many of our customers the mirror concept is totally unknown and I like to have a detailed article to use as initial approach.

The idea of use Docker is because you can configure two instances really fast without headaches.

You can check the ISCAgent service status from the Windows Services screen:

Confirm that if it's started automatically (sorry for the language of the image).

You can check it from System Monitor Log of each Mirror member. You can see an example of the log:

05/22/23-07:22:26 [SYSTEM MONITOR] System Monitor started in %SYS
05/22/23-07:26:07 [SYSTEM MONITOR] Mirror status changed. Member type = Failover, Status = Backup
05/22/23-07:33:01 [SYSTEM MONITOR] System Monitor started in %SYS
05/22/23-07:33:01 [SYSTEM MONITOR] Mirror state: Member type = Failover, Status = Synchronizing
05/22/23-07:33:31 [SYSTEM MONITOR] Mirror status changed. Member type = Failover, Status = Backup
05/22/23-07:35:55 [SYSTEM MONITOR] System Monitor started in %SYS
05/22/23-07:35:56 [SYSTEM MONITOR] Mirror state: Member type = Failover, Status = Transition
05/22/23-07:36:26 [SYSTEM MONITOR] Mirror status changed. Member type = Failover, Status = Waiting
05/22/23-07:36:26 1 alerts posted in messages.log
05/22/23-07:40:26 [SYSTEM MONITOR] Mirror status changed. Member type = Failover, Status = Backup
05/22/23-07:58:15 [SYSTEM MONITOR] System Monitor started in %SYS
05/22/23-07:58:15 [SYSTEM MONITOR] Mirror state: Member type = Failover, Status = Waiting
05/22/23-08:06:43 [SYSTEM MONITOR] Mirror status changed. Member type = Failover, Status = Backup
05/22/23-08:10:37 [SYSTEM MONITOR] System Monitor started in %SYS
05/22/23-08:10:37 [SYSTEM MONITOR] Mirror state: Member type = Failover, Status = Waiting
05/22/23-08:34:40 1 alerts posted in messages.log
05/22/23-08:35:10 [SYSTEM MONITOR] Mirror status changed. Member type = Failover, Status = Backup
05/22/23-10:50:25 [SYSTEM MONITOR] System Monitor started in %SYS
05/22/23-10:50:25 [SYSTEM MONITOR] Mirror state: Member type = Failover, Status = Waiting
05/22/23-11:00:15 [SYSTEM MONITOR] Mirror status changed. Member type = Failover, Status = Backup
05/26/23-11:03:06 [SYSTEM MONITOR] System Monitor started in %SYS
05/26/23-11:03:07 [SYSTEM MONITOR] Mirror state: Member type = Failover, Status = Transition
05/26/23-11:03:37 [SYSTEM MONITOR] Mirror status changed. Member type = Failover, Status = Backup
05/26/23-11:05:08 [SYSTEM MONITOR] Mirror status changed. Member type = Failover, Status = Primary
05/26/23-11:05:10 1 alerts posted in messages.log

Have you tried to update your 2022.1 version with the last one? You just need to run the installer of the last version to launch the update. 

Well, at the end, the decision process is like the Osiris judgement, you have to put pros and cons in a balance: performance, scalability, easy use, flexibility, etc.

From my experience working with Java,  hibernate is not the decisive criteria by itself. I think that the problem is that the architect usually does not know well enough the potential of IRIS and decide to take the easy way.

Last update about Hibernate from Global Summit 2023! Hibernate 6.1 will be supported by IRIS and it will be integrated in Hibernate, no need to be included into your Java project as an independent library. 

I would try to export all the classes of the production and import it into a new namespace. After that try to open a DTL and check if it works. If there is no error the problem would be a corruption in the original namespace.

If your business service extends from Ens.BusinessService you can use this instruction to get the name of the Business Service:

set businessServiceName = ..%ConfigNameGet()

If you want something low-code you can create a Data Transformation with a HL7 message as source and as destination a class created ad-hoc with the structure that you need. Take a look to this example:

The destination in a class called RestTest.FirstRestObject with this definition:

Class RestTest.FirstRestObject Extends (%Persistent, %JSON.Adaptor, Ens.Util.MessageBodyMethods, Ens.Request)
{

/// DescriptionProperty Name As%String;/// DescriptionProperty LastName As%String;Property Childs As list Of NestedRestObject;
}

This object has an SQL representation wich you could use later for your analysis:

forx=1:1:rs.%ResultColumnCount{
     //Get the value of each columnset colValue = rs.%GetData(x)
         //Get the name of each columnset colName = cols.GetAt(x).colName
         set colType = rs.GetColumnType(x)

Have you tried this code?

You can send the List by reference to the Python method, populate it inside the method and use the populated list from the objectscript who call it.

Something like this:

set listOfStrings = ##class("%Library.ListOfDataTypes").%New()
do..TestPython(listOfStrings)
$$$TRACE("What a beautiful trace! There are "_listOfStrings.Count()_" element(s)")
...
...
ClassMethod TestPython(ByRef listOfStrings As%List) [ Language = python ]
{

	import iris
	
	
	listOfStrings.Insert("One")
	listOfStrings.Insert("Two")
	listOfStrings.Insert("Three")
	
	return1
}

Are you using an aggregate function in your query? You can see in the documentation that %SQLCODE = 0 is returned for queries with aggregates as SUM or AVG because it's returning a row even with a null value of the aggregation function.