Jimmy

If you use the Comments section you eliminate the need to create your own custom routing engine.

Your ProcessMessage approach still should work.

Given your custom RoutingEngine includes the following statements:

Property ProcessMessage As %Boolean;

Parameter SETTINGS = "ProcessMessage:Catagory";

And if you issue a:

select Settings from Ens_Config.Item where Production = ‘YourProduction’

 and Name = ‘YourProcessName’

Do you see “ProcessMessage” in Settings List?

The Settings are stored in Ens_Config.Item and can be retrieved  with

ClassMethod GetAdapterSettingValue() or ClassMethod GetHostSettingValue()

set SourceConfigName = "YourCustomRouter”  ;Must be enabled when non-unique

Set tSetting = "ProcessMessage"

Set tHostSettingValue=##class(Ens.Director).GetHostSettingValue(##class(Ens.Director).GetActiveProductionName()_"||"_SourceConfigName,tSetting,.tSC)

write !,"System.Status.GetErrorCodes "_$System.Status.GetErrorCodes(.tSC)_" : "_$System.Status.GetOneStatusText(.tSC)

write !,tSetting_" = ("_tHostSettingValue_") tSC=("_tSC_")"

I have the same issue and wish someone had a good answer.

What I did to get around it was to use a DTL to take the XML and put into a stream container then route to a Business Operation with a class name of EnsLib.File.PassthroughOperation.

Waren, it is possible to pass messages to a business service via a scheduled task.

Create a Class that extends %SYS.Task.Definition. This will be the class executed by Task Manager.
Include Ensemble
/// Task to trigger the business service 
Class Sample.Util.Task.PatientService Extends (%SYS.Task.Definition, %Persistent) [ Inheritance = right ]
{
Parameter TaskName = "Sample.Util.Task.PatientService";
Method OnTask() As %Status
{
    SET qStatement = ##class(%SQL.Statement).%New()
    SET qStatus = qStatement.%Prepare("Select Distinct by (PatientId)  PatientId,PatientNameLast,PatientNameMiddle,PatientNameFirst,PatientAddress1,PatientAddress2,PatientCity,PatientState,PatientZipCode,PatientSexCode,PatientDateOfBirth,PatientRace,PatientPhone,PatientSSN,PatientMaritalStatus,PatientAdmissionDate,PatientDept from PREVOST_AthenaHealth.Patient Order by PatientId")
    IF qStatus'=1
    {
        WRITE !,"%Prepare failed",$System.Status.DisplayError(qStatus)
        Quit $$$ERROR($System.Status.GetErrorCodes(qStatus),$System.Status.GetErrorText(qStatus))
    }
    Set rset = qStatement.%Execute()
    set k0=0
    WHILE rset.%Next()
    {
        Set target=##class(EnsLib.HL7.Message).%New()
        .
        .
        .
        Set tSC=##class(Ens.Director).CreateBusinessService("Sample.AthenaHealth.PatientService",.tService)
        Set tSC=tService.ProcessInput(target) ; call ProcessInput(target) to send the transaction to the BS
    }
    Quit $$$OK
}

}


Create a class for your Business Service.
/// 
Class Sample.AthenaHealth.PatientService Extends Ens.BusinessService [ ProcedureBlock ]
{
/// Name of a Business Partner Profile associated with this item
Property BusinessPartner As %String(MAXLEN = 128);
/// Configuration item(s) to which to send messages
Property TargetConfigNames As %String(MAXLEN = 2000);
Parameter SETTINGS = "BusinessPartner:Info:partnerSelector,TargetConfigNames:Basic:selector?multiSelect=0&context={Ens.ContextSearch/ProductionItems?targets=1&productionName=@productionId}";
Method OnProcessInput(tResult As EnsLib.HL7.Message, Output pOutput As %RegisteredObject) As %Status
{
    ;Only route to 1st TargetConfigName
    Set SC = ..SendRequestAsync($piece(..TargetConfigNames,","),tResult)
    Quit $$$OK
}

}

Create a Business Service using your newly defined class in your Production.
<Item Name=“Sample.AthenaHealth.PatientService" Category="PREVOST" ClassName=“Sample.AthenaHealth.PatientService" PoolSize="1" Enabled="true" Foreground="false" Comment="" LogTraceEvents="false" Schedule="">
    <Setting Target="Host" Name="TargetConfigNames">HL7MsgRouter</Setting>
    <Setting Target="Host" Name="BusinessPartner">A60</Setting>
  </Item>

This will return the 5'th field of the last OBX segment using the GetValueAt method as Marc stated. set value = pRequest.GetValueAt("OBX("_pRequest.GetValueAt("OBX(*)")_"):5")

I insert a code block in a DTL when the source OBX(1):5 contains multiple lines delimited by "\.br\" and the target message requires one line per OBX. Using standard DTL I can <assign value='$LFS(source.{OBX:5},"\.br\") property='tList'. And in a code block "While $Listnext" through the list populating the target OBX(n)