Environment
Situation
Resolution
About this Event Handlers Example
This event handler is to generate an XML document using data from a table procedure, which is then sent to a JMS (SonicMQ) message queue.
The following sample shows output from all procedures in the CCSDemo model. The same event handler could work with all procedures; however, parameters vary according to the procedure.
<?xml version="1.0" encoding="UTF-8"?> <Transactions> <GetAccount Table="Accounts"> <FilterParameters> <AcctNumber>167439459</AcctNumber> </FilterParameters> <InputParameters/> </GetAccount> <AccountSearch Table="Accounts"> <FilterParameters> <MiddleInitial>c</MiddleInitial> <State>ri</State> <LastName>smith</LastName> </FilterParameters> <InputParameters/> </AccountSearch> <GetTransactions Table="Transactions"> <FilterParameters> <AcctNumber>167439459</AcctNumber> </FilterParameters> <InputParameters/> </GetTransactions> </Transactions> |
It is undesirable for an exception to interfere with procedure execution (unless this is the intended behavior), so log any XML-related exceptions and continue processing.
Parameters for connecting to the JMS queue can be hard coded or read from the Verastream properties files script.properties (server) or dt_script.properties (Design Tool).
Event Handler Code
This Verastream Event Handler example has 3 steps:
- Generate an XML document from procedure filter and data parameters.
- Convert the XML document to a string or a file.
- Connect to a (SonicMQ) JMS queue and submit the XML string .
The first two steps are functions called from the main handler method. generateXMLdocument() generates an XML document from input parameters, filter and data parameters, appending each key/value parameter pair as an element node to either a FilterParameter or InputParameter parent node. outputDoc2String() serializes the XML document to a string, transactionXML.
public ProcedureRecordSet executeProcedure(ExecuteProcedureEvent event) throws ApptrieveException { try { generateXMLdocument(event); outputDoc2String(transactionXML);
} catch (Exception e) { //throw new ApptrieveException(e.getMessage()); } } |
The remaining steps continue within executeProcedure(), prior to executing the actual table procedure. Parameters for connecting to the JMS queue are read from script.properties (server only) or dt_script.properties (Design Tool only):
broker = event.getHandlerProperty("broker"); queueName = event.getHandlerProperty("queue"); uname = event.getHandlerProperty("user"); password = event.getHandlerProperty("password"); |
Next, a transaction queue is opened, the XML string is sent to the appropriate queue, and the queue is closed.
try { queueTransactionData(broker, uname, password); sendMessage(queueName, transactionXML); closeQueueConnection(); } catch (Exception e) { //System.out.println("Caught exception: " + e.getMessage()); } |
Finally, the table procedure is executed, returning the recordset.
return event.defaultProcedure(); |
Downloading the Example
The zipped Java file and ReadMe, can be downloaded from the Download Library at logTransactionToQueue.zip.
Installing the Event Handler
To install the event handler, follow these steps.
- Copy logTransactionToXML.java to the \models\<your model>\scripts\src directory.
- In Design Tool, click Events > Rebuild.
- Assuming the build is successful, click Model > Tables, select any procedure, and then click Advanced Properties.
- Under Event handler, select logTransactionToXML, and then click Properties and note the description.
- Save the changes.
To set the classpath, follow these steps, where <JMS> is the directory that contains the SonicMQ jar files:
vhi.script.classpath=<JMS>\\sonic_Client.jar;<JMS>\\broker.jar;<JMS>\\
gnu-regexp-1.0.6.jar; <JMS>\\javax.jms.jar;<JMS>\\jaxp.jar;<JMS>\\
xercesImpl.jar;<JMS>\\xmlParserAPIs.jar;
For use by Design Tool, dt_script.properties in <VHI>\etc needs to be edited in a similar manner.
Parameters for connecting to the JMS queue can either be hard-coded or (as here) read from the Verastream properties file: script.properties (server) or dt_script.properties (Design Tool). To use properties, copy the following to the appropriate .properties file.
queue=SampleQ1 user= broker=<SonicMQ server>:2506 password= |
To test the event handler, be sure that the necessary SonicMQ broker is running. The default queues in SonicMQ are SampleQ1, SampleQ2, SampleQ3 and SampleQ4; be sure that the expected queue is availabe. In Design Tool, choose "Procedure test..." from the "Debug" menu. Select table and procedure desired. Enter Procedure filters or data parameters, click "Execute". Some messages are written to the Debug Console. A new message has been added to the desired queue. XML data is readable in the body of the message using a browser.