I meant a custom utility function, not a custom process. It would be a class derived from Ens.Rule.FunctionSet.
An Ensemble rule expression must be constructed using + - * / Max Min etc. That does not include the ability to use a generic ObjectScript expression.
You can add your own custom function, and inside it, you can use any ObjectScript expression that does what you want. If you define a parameter in a class, you could make it a COSEXPRESSION; this parameter might be used by your custom function to obtain the value at run time and return it to your rule.
An alternative is to set a property in your BPL context object and simply use it in the rule.
Have you browsed the sample rules provided in ENSDEMO? There are some interesting examples of what you can do.
You could invoke curl using $zf(-100), where you'd make the call redirecting the response to a file. After the call completes, you can read the contents of the file into a string or stream.
You can use the built-in classes %Net.SMTP and %Net.MailMessage.
Basically you need to instantiate an object of these classes, set properties for them, and invoke the Send() method of %Net.SMTP. Let us know if that is not what you are asking, or if you need more information.
I think that the reasoning for having two similar functions $next and $order is that $next returns -1 when no next subscript is found, preserving compatibility with the original applications, whereas $order returns "" when no next subscript is found, besides additional functionality of course.
Hi. Without seeing the source code for your production, I would guess that there is an item in your Production for which the associated class does not exist. When the Production starts, Ens.Director obtains information from for the classes involved, in order to create the jobs and message queues, among other things.
If you can't spot the problematic item from the log, I suggest that you disable all items and begin re-enabling one at a time, and seeing which item is the source for the error.
Getting the value of a global node should not be a problem, but you need to figure out the proper quoting for the string values. You might as well create a class method in a location that makes sense, and reference the global from there, in case the syntax becomes easier to manage.
The O.S. process associated with the terminal was still running, in READ state, unaware that the terminal had disconnected. Once we found it and terminated it (we used the System Management Portal for that), the transaction was properly rolled back.
Whilst your application would work with the Caché private web server, please be aware that it is not recommended for production, only for development and testing as well as serving the internal portal. It does not have all the features as a full apache web server; for instance, it does not support https.
Hello. Here is a suggestion of what you could do. Please note I did not actually try it, so this still needs extra work, but hopefully will help you move forward.
In your helper class, add code to your OnBankMsg() method to index messages:
ClassMethod OnBankMsg(pHeader As Ens.Enterprise.MsgBank.MessageHeader, pFullHeaderID As %String, pBody As %RegisteredObject = "", pFullBodyID As %String, pService As Ens.Enterprise.MsgBank.TCPService) As %Status { If (pHeader.ClientBodyClassName="mypackage.mymessageclass") { Set pStream = ##class(%Stream.GlobalCharacter).%OpenId(pHeader.MessageBodyId) Do ##class(mypackage.mysearchtableclass).IndexDoc(pStream) } Quit $$$OK }
}
Where your search table class mypackage.mysearchtableclass would look like:
Class mypackage.mysearchtableclass Extends Ens.CustomSearchTable {
Property myproperty As ...
ClassMethod OnIndexDoc(pDocObj As %Persistent, pSearchTable As mypackage.mysearchtableclass) As %Status {
// Set the properties Set pSearchTable.myproperty = ... // extract the information you want to index Quit $$$OK }
It can be caused if there is an error. That would cause the job to terminate, if not intercepted. In case you haven't done so, you could try adding error interception and logging, so you can check the error logging when a dead job appears, to see if that was the cause.
go to post
Great overview of ADT messages!
go to post
I agree! We all have to do our part!
go to post
A multidimensional property is an array. You should use the "Merge" command to set it, instead of the "Set" command, like in Eduard's example.
go to post
I meant a custom utility function, not a custom process. It would be a class derived from Ens.Rule.FunctionSet.
An Ensemble rule expression must be constructed using + - * / Max Min etc. That does not include the ability to use a generic ObjectScript expression.
You can add your own custom function, and inside it, you can use any ObjectScript expression that does what you want. If you define a parameter in a class, you could make it a COSEXPRESSION; this parameter might be used by your custom function to obtain the value at run time and return it to your rule.
An alternative is to set a property in your BPL context object and simply use it in the rule.
Have you browsed the sample rules provided in ENSDEMO? There are some interesting examples of what you can do.
Heloisa
go to post
You can define a custom utility function to get the setting you want, and use it in your rule.
Link to the documentation of how to create a custom utility function:https://docs.intersystems.com/latest/csp/docbook/DocBook.UI.Page.cls?KEY...
Hope it helps,
Heloisa
go to post
You could invoke curl using $zf(-100), where you'd make the call redirecting the response to a file. After the call completes, you can read the contents of the file into a string or stream.
go to post
You can use the built-in classes %Net.SMTP and %Net.MailMessage.
Basically you need to instantiate an object of these classes, set properties for them, and invoke the Send() method of %Net.SMTP. Let us know if that is not what you are asking, or if you need more information.
go to post
I think that the reasoning for having two similar functions $next and $order is that $next returns -1 when no next subscript is found, preserving compatibility with the original applications, whereas $order returns "" when no next subscript is found, besides additional functionality of course.
go to post
Was the Production imported from another instance?
go to post
Hi. Without seeing the source code for your production, I would guess that there is an item in your Production for which the associated class does not exist. When the Production starts, Ens.Director obtains information from for the classes involved, in order to create the jobs and message queues, among other things.
If you can't spot the problematic item from the log, I suggest that you disable all items and begin re-enabling one at a time, and seeing which item is the source for the error.
Hope it helps,
Heloisa
go to post
Getting the value of a global node should not be a problem, but you need to figure out the proper quoting for the string values. You might as well create a class method in a location that makes sense, and reference the global from there, in case the syntax becomes easier to manage.
go to post
The O.S. process associated with the terminal was still running, in READ state, unaware that the terminal had disconnected. Once we found it and terminated it (we used the System Management Portal for that), the transaction was properly rolled back.
go to post
I have been using CPIPE and I feel it provides more flexibility than $zf. There is documentation at: https://cedocs.intersystems.com/ens201813/csp/docbook/DocBook.UI.Page.cls?KEY=GIOD_interproccomm
go to post
That is a great question. I haven't tried it, but I wonder if you could send it via email instead -- as described in https://www.efax.com/efax-help-center/sending-faxes/send-faxes-by-email
Heloisa
go to post
You might consider using OnBeforeProductionStart() instead of OnAfterProductionStart() when you want to change settings.
go to post
Hello.
Ens.Config.Production objects are created when you compile your Production.
Your Production must be in a class that extends Ens.Production and you must have imported it into your target namespace and compiled it there.
As others mentioned, if you export and deploy it, these steps should happen.
Hope this helps,
Heloisa
go to post
Hello.
Whilst your application would work with the Caché private web server, please be aware that it is not recommended for production, only for development and testing as well as serving the internal portal. It does not have all the features as a full apache web server; for instance, it does not support https.
Heloisa
go to post
Hello. Here is a suggestion of what you could do. Please note I did not actually try it, so this still needs extra work, but hopefully will help you move forward.
In your helper class, add code to your OnBankMsg() method to index messages:
{
If (pHeader.ClientBodyClassName="mypackage.mymessageclass") {
Set pStream = ##class(%Stream.GlobalCharacter).%OpenId(pHeader.MessageBodyId)
Do ##class(mypackage.mysearchtableclass).IndexDoc(pStream)
}
Quit $$$OK
}
}
Where your search table class mypackage.mysearchtableclass would look like:
{
Property myproperty As ...
ClassMethod OnIndexDoc(pDocObj As %Persistent, pSearchTable As mypackage.mysearchtableclass) As %Status
{
// Set the properties
Set pSearchTable.myproperty = ... // extract the information you want to index
Quit $$$OK
}
}
This is only a sketch, hope it helps,
Heloisa
go to post
It can be caused if there is an error. That would cause the job to terminate, if not intercepted. In case you haven't done so, you could try adding error interception and logging, so you can check the error logging when a dead job appears, to see if that was the cause.
Hope it helps,
Heloisa
go to post
Welcome! Glad to have you here, Robert!
Regards
Heloisa