Thanks for finding this. We'll fix it. We have two sets of Python doc: the automatically generated reference (from source code comments) ,  which you were using and the User's Guide and Reference , which has the correct information.

Obviously we generated the reference with an earlier version of the software and didn't update it after the change. We will fix that.

I would recommend using the User's Guide and Reference rather than the automatically generated one.

If you find any problems in the User's Guide and Reference, you can click on the Help us improve this page tab on the right and we'll fix it. We haven't yet added it to the automatically-generated reference. You can also send us a comment  at

The WRC is InterSystems Worldwide Resource Center, our support group. No need to contact them over this, but they are a great resource for many issues.

If you do need to do this in a router. Here is the overall process.

  1.  Define a business rule. Make it a General Message Routing Rule and have the assist class be EnsLib.MsgRouter.RuleAssist.
  2. Add a rule to the rule set and double-click Constraint. Specify the rule class
    Persistent > ENS > StreamContainer
    That's the message class used by the pass-through file service/operation. You can also specify the business service as the source.
  3. Double-click  condition, and in the expression editor specify Document.Type or Document.OriginalFilename, add an operation, and a  value.
  4. Send it to the correct operation.
  5. Define a router business process and specify the rule you just created.
  6. Connect the pass-through file service to the router.

But you may not need the router at all.

I'm not sure that the Ensemble Record Mapper makes this much easier than just reading the stream. Unless you don't treat the end of line as terminator, each line will be a separate record. It is possible that you could use the Complex Record Mapper to create one record from the file using the first column as the leading text, but that requires defining one record map for each line in the file. I'm not sure how to handle the Hospital name and blank lines. I don't think that batch record map would help because there's different kinds of information on each line.

But I think most of the work is not going to be parsing the input file but in making sure that the HL7 message has all the right segments and fields.

Is it possible to append the files outside of Ensemble and then use batch record map? The current version of Ensemble handles batch record maps much more efficiently than it can handle individual record maps. If you are on an older version, let me know and  I'll find out if the efficiency improvements are in it.

I think that increasing pool  size will give you some improvement, but batch record map can avoid a lot of overhead handling each individual record.

Part of the efficiency improvement depends on what you're doing with the record. If you're just loading data, it's very efficient. If you're performing a transformation on the incoming data then that could still take a significant amount of time.

This class wasn't intended as a general-purpose service but was done for a simple way to get a SOAP message past a firewall. It is sending an HL7 message and not any XML representation  It is expecting a message in the form generated by  EnsLib.HL7.Util.SOAPClient.Send. I'm trying to get more information on it, but you could try 

  HL7 File Service --> EnsLib.HL7.Operation  --> EnsLibb.HL7.Service.SOAPService --> HL7 File Operation

Assuming the message comes through this, you can put a TCP trace to see the exact format of the SOAP message. 

I am the Ensemble technical  writer. While we don't have Ensemble evaluations freely available,  someone in sales can arrange for a temporary license. Send me your contact information to and I'll find the appropriate sales person to contact.

Name, email, phone, address, and company/school/organization (if you have one).

Thanks and sorry for the non-response from support.

Actually, the best practice for Ensemble is now to  subclass %CSP.REST directly and call the Ens.Director.CreateBusinessService() method to instantiate the class as a business service.  The next revision of the Ensemble documentation will have the following note:

Although Ensemble defines a class EnsLib.REST.Service, that is a subclass of %CSP.REST, we recommend that you not use this class because it provides an incomplete implementation of %CSP.REST. The only feature that EnsLib.REST.Service provides that is not available from %CSP.REST is the ability to use a special port, but we recommend against using a special port because it does not provide the robustness and security you get by using a commercial web server and the CSP port. 

If you  just want to pass through a REST call to a REST business operation, you can use EnsLib.REST.GenericService.

The ENSDEMO Demo.ZenService.Zen.WeatherReportForm.cls demonstrates how to use CreateBusinessService  with Zen not REST, but the use of CreateBusinessService is the same.