ProcessSVCEmails and ProcessSingleSVCEmail

From GreenVulcano Wiki
Revision as of 14:30, 21 February 2012 by Anonymous (talk)
Jump to: navigation, search

Description

This example shows how GreenVulcano® ESB receipts and processes emails. The workflow consists in two services: ProcessSVCEmails which receives the messages and for each one calls service ProcessSingleSVCEmail that processes it.

ProcessSVCEmails service executes the following operations:

  • Checks if there are new service messages
  • For each one invokes a processing service

ProcessSingleSVCEmails service executes the following operations:

  • Receives data from an email
  • Reads the subject and verifies if it is well formatted
  • If subject is well formatted invokes the respective service for the request. If don't, sends a preconfigured email.

The request service can be:

  • A PDF report
  • An Excel report
  • A BIRT report

containing data about persons and credit cards.

VulCon Configuration

The preferred mode for creating a Service (at least its skeleton) is through the Service Wizard. Before using it you must first configure the VCL adapters and plugins needed. To do that, go to the VulCon® Adapter view.

GVAdapters Configuration

When emails will be read by the ProcessSingleSVCEmail, the GVBuffer of output will contain a XML with the available data. To read these data you will need a CollectionDataProvider.

To insert a new CollectionDataProvider execute the following steps:

  • From the VulCon Core view, expand the element GVDataProviderManager
  • Right click the element DataProviders -> Insert After (Insert before)-> CollectionDataProvider
  • Click the element just created and set the following parameters as:
name="CREDIT::SVCEmailListDataProvider"
source-selector="object"
Field:
direction="INOUT"
key="buffer"
Expression:
type="xpath"
Expression: /MailMessages/Message

When a service requires the generation of a BIRT report, it is necessary to configure the GVDataHandlerConfiguration and GVBIRTReportConfiguration Adapters.

GVDataHandlerConfiguration

Inside of element GVDataHandlerConfiguration, presents in the VulCon® Core view, insert a new DBOBuilder and set its attributes as:

  • jdbc-connection-name="ds.gv_test"
  • name="ListPersons"

Insert, into ListPersons a new item DBOSelect with the property:

  • name="ListPersons"

and containing an element statement with:

  • id="1"
  • type="select"
select ' ', 'NULL' from dual union all
select p.NAME, p.NAME from PERSON p
order by 1

GVBIRTReportConfiguration

Inside of elements GVBIRTReportConfiguration / ReportGroups, create a new ReportGroup (by right clicking element ReportGroups -> Insert After -> ReportGroup). Name it TestGRP.

Inside of TestGRP, insert a new Report. Set its attributes as:

  • config: "CreditCards.rptdesign"
  • name: "Credit Cards"

Inside of Report Credit Cards insert an element Parameters containing the item Parameter setted as follow:

  • control-type: "SELECT"
  • label: "Nome"
  • name: "NAME"

Inside of NAME put an element DHSource with the attributes:

  • service: "ListPersons"
  • sort: "true"
  • use-string-map: "true"

Now you might define a new Group, System and Channel, if you do not want to use those already present, and then start the Wizard.

GVCore Configurations

When the request concerns the generation of a PDF Report, you also need a FOP transformation.

GreenVulcano® ESB gives the function XSLFOPTransformation for configure it.

In this example, we use the file SearchPerson2FO.xsl and save it into $GV_HOME/gvdte/datasource/xsl/DataHandler/CREDIT folder.

From the VulCon core view, insert a new XSLFOPTransformation:

  • Expand the element GVDataTransformation
  • Right click the element Transformation -> Insert After -> XSLFOPTransformation
  • Click the new XSLFOPTransformation element and set its attributes as follow:
DataSourceSet="Default"
XSLMapName="DataHandler/CREDIT/SearchPerson2FO.xsl"
name="UserDataAsPDF"

Defining System, Channel and Operations

To define a System, go to VulCon core view and, into Systems element, insert the System CREDIT if it is not already present. From there create the Channel CHANNEL_CREDIT_MAIL in which the following operations will be configured:

Attribute/Subelement Value
pop-call name="ReceiveSVCEmail"
delete-messages="true"
expunge="true"
jndi-name="gvesb.mailServer"
smtp-call name="SendEmailSVCResponse"
jndi-name="gvesb.mailServer"
mail-message:
content-type="text-plain"
high-priority="false"
sender-display-name="GV ESB"
subject="RE: ${property['SUBJECT']}"
message-body:
gvBuffer-dump="false"
message-text:
Persons data
attachments:
gvBuffer:
name="PersonsData_${@it.greenvulcano.util.txt.DateUtils@nowToString('yyyyMMddHHmmss')}.
${property['FILE_EXT']}"
smtp-call name="SendEmailNoSVC"
jndi-name="gvesb.mailServer"
mail-message:
content-type="text-plain"
high-priority="true"
sender-display-name="GV ESB"
subject="RE: ${property['SUBJECT']}"
message-body:
gvBuffer-dump="false"
message-text:
Invalid service request. Available Services:
SVC=LIST_EXCEL[!NAME=.....]
SVC=LIST_PDF[!NAME=.....]
SVC=LIST_BIRT[!TYPE=EXCEL or PDF(default)][!NAME=.....]
excel-call name="listPerson"
GVExcelReport:
format="default"
group="CREDIT"
jdbc-connection="ds.gv_test"
name="listPerson"
Sheet:
id="1"
name="Person List"
title="Person List - timestamp{{dd/MM/yyyy HH:mm:ss}}"
statement:
type="select"
select p.NAME as 'Name&', p.BIRTHDATE as 'Birth Date', c.NAME as 'City'
from PERSON p, CITY c
where p.ID_CITY = c.ID
decode{{@{{NAME}}::NULL::::and p.NAME='@{{NAME}}'}}
order by c.NAME, p.NAME
Sheet:
id="2"
name="Credit Card List"
title="Credit Card List - timestamp{{dd/MM/yyyy HH:mm:ss}}"
statement:
type="select"
select p.NAME as 'Name', cc.CNUMBER as 'Card Number', cc.CREDIT as 'Credit',
decode(cc.ENABLED, 'Y', 'Yes', 'No') as 'Active' 
from PERSON p, CREDIT_CARD cc
where p.ID = cc.ID_OWNER
decode{{@{{NAME}}::NULL::::and p.NAME='@{{NAME}}'}}
order by p.NAME
birt-report-call groupName="TestGRP"
name="CreditCards"
reportName="Credit Cards"
reportType="excel"
dh-call name="UserDataAsPDF"
DBOBuilder:
jdbc-connection-name="ds.gv_test"
name="UserDataAsPDF"
DHVariables:
DHVariable name="decimal-separator" value="."
DHVariable name="grouping-separator" value=","
DHVariable name="format" value="#0.00"
DHVariable name="NAME" value="NULL"
DBOSelect:
name="UserDataAsPDF"
transformation="UserDataAsPDF"
statement:
id="1"
keys="1,2,3"
type="select"
select p.NAME, p.BIRTHDATE, c.NAME, cc.CNUMBER, cc.CREDIT, cc.ENABLED
from PERSON p, CITY c, CREDIT_CARD cc
where p.ID_CITY = c.ID
and p.ID = cc.ID_OWNER
decode{{@{{NAME}}::NULL::::and p.NAME like '%@{{NAME}}'}}
order by c.NAME, p.NAME

Flow implementation