Martin Staudigel · Dec 15, 2025 go to post

Hello community,

we opened up a WRC call meanwhile and I'll share the gained information in case anyone stumbles into this post.

The information "Web IP Address" is received from the machine (client) which sends messages to the messagebank. It is configured in the client's %SYS Namespace in a global ^SYS in the subscripts ("WebServer","Name") and ("WebServer","Port").

The information NodeId is derived from another client setting stored in every namespace in a global ^Ens.MsgBank("NodeId"). If a message has been sent to the messagebank, a new node with a new NodeId is created, when the given nodeId has not sent any messages before.

In our setup we were able to change the ^SYS("Webserver") to the correct settings and the automatically created nodes were merged with the manually created nodes by the given NodeId and Web IP Address. This enabled us to select messages from the messagebank's message viewer an resend them to the original target without any further action. This also works for messages, which have been sent in the past containing a wrong Web IP Address.

If you want to change a client seemlessly, then make sure to check these globals, especially the NodeId, before any messages will be sent. Hopefully this explanation helps other desperate messagebank users to understand what's going on in the background and not to fall into the same traps we did.

Kind regards,

Martin

Martin Staudigel · Sep 30, 2025 go to post

Hello everybody,

as nobody seems to share the demand for an Orbis HL7 schema definition (or at least nobody seems to have one), I started to create one by myself. If anybody is interested in the schema feel free to write a PM, I'm happy to share my results.

Regards,

Martin

Martin Staudigel · Jan 3, 2025 go to post

Hello everybody,

after some hours of searching it appeared, that I was mislead by the "404 Not Found" error. In the end is was nothing more than an authentication problem, which should have been answered by "403 Forbidden".

Regards and a happy new year,

Martin

Martin Staudigel · Dec 23, 2024 go to post

What solved my problem was to copy the referenced XSD file from schemaLocation="../../tel/error/TelematikError.xsd" to the local folder where the wsdl file was located and then change the reference to schemaLocation="TelematikError.xsd".

After doing this the import of the wsdl file ran through and created all datatype classes, request, resoponse and operation class.

Thanks for your help and time,

regards, Martin

Martin Staudigel · Oct 6, 2023 go to post

Thank you very much for your feedback. After some back and forth and failed attempts, I have now decided on a different approach. The reasons for this are on the one hand that an export of all 133500 records would take something like 12h and in case of an error all preliminary work is gone.
Furthermore, even with 1000 records the transfer to a FHIR bundle again ran into a STORE error. All in all it is more reasonable to split the export into smaller packages. I got a handle on the problem by now initiating export at 500 objects and persistently storing the IDs of the handled records so they can be ignored on the next run.
The process is called on a timed basis every 5 minutes and works in chunks until all resources are exported. This runs since 1h now, and looks good so far.

Regards, Martin

Martin Staudigel · Aug 28, 2023 go to post

Thanks to Andreas Schütz and Stephan Mohr - we found out that a blocked firewall port caused the open command to freeze. Timeout settings didn't have any effect, that should not be the case.

Regards,

Martin

Martin Staudigel · Mar 15, 2023 go to post

This is how I translated and simplified your example:

Method OnRequest(pRequest As Ens.Request, Output pResponse As Ens.Response) As %Status
{
	#dim tSc = $$$OK
	#dim tConvertedStream as Ens.StreamContainer
	#dim tStream as %Library.GlobalBinaryStream
	if ( pRequest.%IsA("EnsLib.HTTP.GenericMessage") ){
		set tConvertedStream = ##class(Ens.StreamContainer).%New()
		set tConvertedStream.Stream = ##class(%GlobalCharacterStream).%New()
		set tSc = tConvertedStream.Stream.CopyFrom(pRequest.Stream)
		set tConvertedStream.OriginalFilename = $Piece(pRequest.HTTPHeaders.GetAt("RawParams"),"=",2)
		
		set tStream = ##class(%Library.GlobalBinaryStream).%New()
		set tSc = tStream.Write("<html><head><title>Server Response</title></head><body><h1>This is your response</h1></body></html>")
		set tSc = tStream.%Save()
		
		set pResponse = ##class(EnsLib.HTTP.GenericMessage).%New(tStream,,pRequest.HTTPHeaders)
		do pResponse.HTTPHeaders.SetAt("HTTP/1.1 200 OK","StatusLine")
		do pResponse.%Save()
	}
	
	return tSc
}

It works like expected:

that is exactly what I needed to continue.

Thank you very much for your help,

regards,

Martin

Martin Staudigel · Dec 6, 2021 go to post

It seems like the former enterprise client systems configuration had to be modified. 2018.2.1 worked well with the server name. In 2021.1 I had to provide the fqdn at the Web IP Address setting to make the production monitor showing up like expected. I don't know if this was the actual reason, but at least it works now.

Thanks and regards,

Martin

Martin Staudigel · Jan 29, 2020 go to post

To conclude this topic I would like to present my solution for a runtime configurable SMB access. 
First step was to write a helper class in Java, which provides static methods for all needed functionality. This class encapsulates the dependencies to the Java libraries jcifs-ng-2.1.1.jar, bcprov-jdk15on-1.58.jar and slf4j-1.7.24.jar.

Some of the implemented Methods are:

public static boolean copyFileFromSmbShareToLocal( String smbHost, String smbShare, String smbUser, String smbPass, String smbAuthDomain, String smbFileName, String localDirectory, String localFileName, boolean append, boolean deleteRemote) throws java.io.IOException, InterruptedException { ... }

public static boolean resourceExists(String smbHost, String smbShare, String smbUser, String smbPass, String smbAuthDomain, String smbFileName, boolean checkWriteability) throws jcifs.CIFSException { ... }

 public static String listResources (String smbHost, String smbShare, String smbUser, String smbPass, String smbAuthDomain, String smbFileName, String smbFileFilter) throws jcifs.CIFSException, java.net.MalformedURLException, java.net.UnknownHostException  { ... }

public static String getAttributes(String smbHost, String smbShare, String smbUser, String smbPass, String smbAuthDomain, String smbFileName) throws jcifs.CIFSException, java.net.MalformedURLException, java.net.UnknownHostException { ... }

Next I created a jar file from this class, which could be processed with the Add-In "Java Gateway Wizard" included in Studio and transferred to corresponsing cache wrapper classes.  

This made it possible to create an operation dependending on a Java gateway, by use of the created classes. By using specially created message types, the configuration of the dynamic parameters could be communicated. The operation can be set to any Windows shares by e.g. reading the configuration from a database table and sending the required information to the operation. It is also possible to read files from different sources and copy them to the destinations without having to determine beforehand on which computers the corresponding shares are set up.

If you are interested in further details on how to solve the problem, please send us a PN. Then I will gladly give further information or provide more detailed code components.

Regards,

Martin Staudigel