Histórico da Página
...
Esse componente permite utilizar dois tipos de execução da consulta aos dados do serviço externo: a execução Automatizada e a execução Imediata, que são detalhadas a seguir.
** imagem**
Execução automatizada
A execução automatizada determina que a execução do script será feita de forma assíncrona e sem a necessidade de uma interação manual de uma pessoa. Nesse tipo de execução, é possível definir o número de tentativas de execução e uma mensagem de sucesso que será exibida quando a execução for concluída sem inconsistências.
Quando a solicitação chega em uma atividade de serviço com execução automatizada, ela fica parada nesse ponto até que o scritp seja executado com sucesso ou até que ele seja executado o número de vezes definido como tentativas de execução.
Se o script for executado com sucesso, a atividade de serviço é considerada concluída e a solicitação segue o seu fluxo de saída padrão. Porém, se o número de tentativas for atingido sem que haja uma execução do script com sucesso, a solicitação é movimentada para o evento intermediário de captura de erro que, por sua vez, movimentará a solicitação para o fluxo correspondente à etapa de tratamento do erro.
Em atividades de serviço com a forma de execução automatizada, é obrigatório o uso do evento intermediário de captura de erro anexado a ela, bem como um fluxo de saída deste evento, para permitir que o processo seja desviado quando o script de integração não for executado com sucesso em nenhuma das tentativas feitas.
O script da próxima execução – depois de uma execução com inconsistência – pode receber a quantidade de tentativas de execução e a mensagem da última execução como parâmetros, podendo ser utilizados dentro do script. Dessa forma, o script ficaria conforme o exemplo abaixo:
| Painel | ||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| ||||||||||||||||||
Desta forma, quando a última etapa de aprovação for concluída, a solicitação seguirá para uma atividade de serviço que, utilizando as APIs da plataforma, criará a pasta no recurso Documentos com base nas informações fornecidas e nas permissões de acesso definidas no formulário, garantindo que a pasta será única para cada contrato. Um exemplo de código que poderia ser utilizado como script na atividade de serviço é:
| ||||||||||||||||||
| Bloco de código | ||||||||||||||||||
| ||||||||||||||||||
function servicetask9
|
Tanto a mensagem de sucesso quanto as mensagens de inconsistências são salvas no histórico da solicitação como complementos, podendo ser vistas por quem tiver acesso à solicitação.
| Estado | ||||||
|---|---|---|---|---|---|---|
|
...
O fluxo de contingência é criado anexando um evento intermediário de captura de erro à atividade de serviço (o evento deve ser colocado em cima da atividade). Esse fluxo de saída será utilizando quando todas as tentativas de integração falharem.
...
| borderColor | #ebecf0 |
|---|
...
Execução imediata
A execução imediata determina que a execução do script será feita de forma síncrona, logo depois do evento afterStateEntry do processo em questão, ou seja, será executado no momento em que a solicitação chegar na atividade de serviço.
Quando o script for executado com sucesso, a solicitação é enviada imediatamente da atividade de serviço para a próxima etapa, dando continuidade ao fluxo de saída padrão. Porém, se ocorrer alguma inconsistência, esta forma de execução apenas retornará a inconsistência encontrada, mantendo a solicitação parada até que uma pessoa interaja na solicitação para averiguar e corrigir as inconsistências que ocorreram.
Esse é um exemplo de código para iniciar a integração com o serviço configurado no componente:
| Bloco de código | ||
|---|---|---|
| ||
try {
var Service = ServiceManager.getService('rm');
var serviceHelper = Service.getBean();
var serviceLocator = serviceHelper.instantiate('classe.locator');
} catch(erro) {
log.error(erro);
} |
| Estado | ||||||
|---|---|---|---|---|---|---|
|
...
| Informações | ||
|---|---|---|
| ||
Atualmente, o tipo de execução imediata não é muito recomendado por ter seu desempenho reduzidos. |
| Painel | ||
|---|---|---|
| ||
| Estado | | |
| subtle | true | |
| title | Exemplo de uso |
| Nota | ||
|---|---|---|
| ||
Esse é um exemplo que fica disponível no repositório SAMPLES e, por isso, ele pode ser atualizado lá a qualquer momento. Para ver sua versão mais recente e sempre atualizada, acesso-o a partir do repositório clicando aqui. |
| Bloco de código | ||
|---|---|---|
| ||
function servicetask9(attempt, message) { //Variáveis globais com os dados do formulário var FOLDER_NAME = hAPI.getCardValue("txtFolderName"); var PARENT_FOLDER_CODE = hAPI.getCardValue("txtFolderCode"); var GROUP_CODE = hAPI.getCardValue("txtGroupCode"); var INHERIT_SECURITY = hAPI.getCardValue("cbxInheritSecurity") == "true"; //Tipo de documento pasta var DOCUMENT_TYPE_FOLDER = "1"; //Usuário logado var USER_LOGGED = getValue("WKUser"); //Número da solicitação para comentário uso na descrição da pasta criada var REQUEST_NUMBER = getValue("WKNumProces"); // Descrição da pasta criada var ADDITIONAL_COMMENTS = "This folder was created automatically from fluig BPM - request "; //Atribuições de segurança var USER_ATTRIBUTION_TYPE = 1; var GROUP_ATTRIBUTION_TYPE = 2; var ALL_USER_ATTRIBUTION_TYPE = 3; //Níveis de segurança var READING = 0; var RECORDING = 1; var MODIFICATION = 2; var ALL = 3; try { //Instancia um novo documento e define as propriedades básicas var dto = docAPI.newDocumentDto(); dto.setDocumentDescription(FOLDER_NAME); dto.setAdditionalComments(ADDITIONAL_COMMENTS + REQUEST_NUMBER var PARENT_FOLDER_CODE = hAPI.getCardValue("txtFolderCode"); var GROUP_CODE = hAPI.getCardValue("txtGroupCode"); var INHERIT_SECURITY = hAPI.getCardValue("cbxInheritSecurity") == "true"; //Tipo de documento pasta var DOCUMENT_TYPE_FOLDER = "1"; //Usuário logado var USER_LOGGED = getValue("WKUser"); //Número da solicitação para comentário uso na descrição da pasta criada var REQUEST_NUMBER = getValue("WKNumProces"); // Descrição da pasta criada var ADDITIONAL_COMMENTS = "This folder was created automatically from fluig BPM - request "; //Atribuições de segurança var USER_ATTRIBUTION_TYPE = 1; var GROUP_ATTRIBUTION_TYPE = 2; var ALL_USER_ATTRIBUTION_TYPE = 3; //Níveis de segurança var READING = 0; var RECORDING = 1; var MODIFICATION = 2; var ALL = 3; try { //Instancia um novo documento e define as propriedades básicas var dto = docAPI.newDocumentDto(); dto.setDocumentDescription(FOLDER_NAME); dto.setAdditionalComments(ADDITIONAL_COMMENTS + REQUEST_NUMBER); dto.setDocumentType(DOCUMENT_TYPE_FOLDER); dto.setParentDocumentId(parseInt(PARENT_FOLDER_CODE)); dto.setInheritSecurity(INHERIT_SECURITY); /* Como é possível definir várias permissões, é necessário criar um array com todas as permissões que serão aplicadas. Cada item do array é uma permissão ou restrição */ var dtosSecurity = new Array(); //Definindo permissão total para grupo var dtoGroupSecurity = docAPI.newDocumentSecurityConfigDto(); dtoGroupSecurity.setAttributionType(GROUP_ATTRIBUTION_TYPE); dtoGroupSecurity.setAttributionValue(GROUP_CODE); dtoGroupSecurity.setPermission(true); dtoGroupSecurity.setShowContent(true); dtoGroupSecurity.setSecurityLevel(ALL); //Definindo permissão total para usuário var dtoUserSecurity = docAPI.newDocumentSecurityConfigDto(); dtoUserSecurity.setAttributionType(USER_ATTRIBUTION_TYPE); dtoUserSecurity.setAttributionValue(USER_LOGGED); dtoUserSecurity.setPermission(true); dtoUserSecurity.setShowContent(true); dtoUserSecurity.setSecurityLevel(ALL); //Definindo permissão de modificação para todos os usuários var dtoAllUsersSecurity = docAPI.newDocumentSecurityConfigDto(); dtoAllUsersSecurity.setAttributionType(ALL_USER_ATTRIBUTION_TYPE); dtoAllUsersSecurity.setAttributionValue(""); //Para todos os usuários deve-se passar vazio dtoAllUsersSecurity.setPermission(true); dtoAllUsersSecurity.setShowContent(true); dtoAllUsersSecurity.setSecurityLevel(MODIFICATION); //Definindo restrição para usuário var dtoGroupRestrictionSecurity = docAPI.newDocumentSecurityConfigDto(); dtodtoGroupRestrictionSecurity.setDocumentTypesetAttributionType(DOCUMENTGROUP_ATTRIBUTION_TYPE_FOLDER); dtodtoGroupRestrictionSecurity.setParentDocumentIdsetAttributionValue(parseInt(PARENTGROUP_FOLDER_CODE)); dtodtoGroupRestrictionSecurity.setInheritSecuritysetPermission(INHERIT_SECURITYfalse); dtoGroupRestrictionSecurity.setShowContent(true); /*dtoGroupRestrictionSecurity.setSecurityLevel(MODIFICATION); Como é possível definir várias permissões, é necessário//Definindo criarrestrição umpara arraytodos com todas as permissõesos usuários var quedtoAllUsersRestrictionSecurity serão= aplicadasdocAPI.newDocumentSecurityConfigDto(); Cada item do array é uma permissão ou restrição dtoAllUsersRestrictionSecurity.setAttributionType(ALL_USER_ATTRIBUTION_TYPE); */dtoAllUsersRestrictionSecurity.setAttributionValue(""); var dtosSecurity = new Array(dtoAllUsersRestrictionSecurity.setPermission(true); dtoAllUsersRestrictionSecurity.setShowContent(true); //Definindo permissão total para grupo dtoAllUsersRestrictionSecurity.setSecurityLevel(RECORDING); var dtoGroupSecurity = docAPI.newDocumentSecurityConfigDto(); //Adicionando permissões no dtoGroupSecurity.setAttributionType(GROUP_ATTRIBUTION_TYPE);array de segurança dtoGroupSecuritydtosSecurity.setAttributionValuepush(GROUP_CODEdtoGroupSecurity); dtoGroupSecurity.setPermission(true); dtoGroupSecuritydtosSecurity.setShowContentpush(truedtoUserSecurity); dtoGroupSecuritydtosSecurity.setSecurityLevelpush(ALLdtoAllUsersSecurity); //DefinindoAdicionando restrições permissãono totalarray parade usuáriosegurança var dtoUserSecurity = docAPI.newDocumentSecurityConfigDto(dtosSecurity.push(dtoGroupRestrictionSecurity); dtoUserSecuritydtosSecurity.setAttributionType(USER_ATTRIBUTION_TYPEpush(dtoAllUsersRestrictionSecurity); dtoUserSecurity.setAttributionValue(USER_LOGGED); var FOLDER = dtoUserSecuritydocAPI.setPermission(truecreateFolder(dto, dtosSecurity, null); dtoUserSecuritylog.setShowContent(true); dtoUserSecurity.setSecurityLevel(ALLinfo("Folder successfully createad: ID :" + FOLDER.getDocumentId()); } //Definindo permissão de modificação para todos os usuários var dtoAllUsersSecurity = docAPI.newDocumentSecurityConfigDto(catch (e) { log.error("Could not create folder: \n" + e); dtoAllUsersSecurity.setAttributionType(ALL_USER_ATTRIBUTION_TYPE); dtoAllUsersSecurity.setAttributionValue(""); //Para todos os usuários deve-se passar vazio dtoAllUsersSecurity.setPermission(true); dtoAllUsersSecurity.setShowContent(true); dtoAllUsersSecurity.setSecurityLevel(MODIFICATION); //Definindo restrição para usuário var dtoGroupRestrictionSecurity = docAPI.newDocumentSecurityConfigDto(); dtoGroupRestrictionSecurity.setAttributionType(GROUP_ATTRIBUTION_TYPE); dtoGroupRestrictionSecurity.setAttributionValue(GROUP_CODE); dtoGroupRestrictionSecurity.setPermission(false); dtoGroupRestrictionSecurity.setShowContent(true); dtoGroupRestrictionSecurity.setSecurityLevel(MODIFICATION); //Definindo restrição para todos os usuários var dtoAllUsersRestrictionSecurity = docAPI.newDocumentSecurityConfigDto(); dtoAllUsersRestrictionSecurity.setAttributionType(ALL_USER_ATTRIBUTION_TYPE); dtoAllUsersRestrictionSecurity.setAttributionValue(""); dtoAllUsersRestrictionSecurity.setPermission(true); dtoAllUsersRestrictionSecurity.setShowContent(true); dtoAllUsersRestrictionSecurity.setSecurityLevel(RECORDING); //Adicionando permissões no array de segurança dtosSecurity.push(dtoGroupSecurity); dtosSecurity.push(dtoUserSecurity); dtosSecurity.push(dtoAllUsersSecurity); //Adicionando restrições no array de segurança dtosSecurity.push(dtoGroupRestrictionSecurity); dtosSecurity.push(dtoAllUsersRestrictionSecurity); var FOLDER = docAPI.createFolder(dto, dtosSecurity, null); log.info("Folder successfully createad: ID :" + FOLDER.getDocumentId()); } catch (e) { log.error("Could not create folder: \n" + e); } }} } |
Execução automatizada
...
A execução automatizada determina que a execução do script será feita de forma assíncrona e sem a necessidade de uma interação manual de uma pessoa. Nesse tipo de execução, é possível definir o número de tentativas de execução e uma mensagem de sucesso que será exibida quando a execução for concluída sem inconsistências.
Quando a solicitação chega em uma atividade de serviço com execução automatizada, ela fica parada nesse ponto até que o scritp seja executado com sucesso ou até que ele seja executado o número de vezes definido como tentativas de execução.
Se o script for executado com sucesso, a atividade de serviço é considerada concluída e a solicitação segue o seu fluxo de saída padrão. Porém, se o número de tentativas for atingido sem que haja uma execução do script com sucesso, a solicitação é movimentada para o evento intermediário de captura de erro que, por sua vez, movimentará a solicitação para o fluxo correspondente à etapa de tratamento do erro.
Em atividades de serviço com a forma de execução automatizada, é obrigatório o uso do evento intermediário de captura de erro anexado a ela, bem como um fluxo de saída deste evento, para permitir que o processo seja desviado quando o script de integração não for executado com sucesso em nenhuma das tentativas feitas.
O script da próxima execução – depois de uma execução com inconsistência – pode receber a quantidade de tentativas de execução e a mensagem da última execução como parâmetros, podendo ser utilizados dentro do script. Dessa forma, o script ficaria conforme o exemplo abaixo:
| Bloco de código | ||
|---|---|---|
| ||
function servicetask9(attempt, message) {
log.info("Exemplo servicetask");
var a = hAPI.getCardValue("campo_no_formulario");
if (a == "1") {
return true;
} else {
throw "Exemplo de Erro";
}
} |
Tanto a mensagem de sucesso quanto as mensagens de inconsistências são salvas no histórico da solicitação como complementos, podendo ser vistas por quem tiver acesso à solicitação.
| Estado | ||||||
|---|---|---|---|---|---|---|
|
A execução automatizada deve ser utilizada quando a execução não necessita de um retorno imediato sobre a operação ter sido ou não executada com êxito. Essa execução é mais indicada para integração com serviços que podem ficar indisponíveis ou externos e que, necessariamente, devem ser assíncronos, fornecendo um fluxo de contingência quando a integração não for concluída com sucesso em nenhuma tentativa por qualquer motivo.
O fluxo de contingência é criado anexando um evento intermediário de captura de erro à atividade de serviço (o evento deve ser colocado em cima da atividade). Esse fluxo de saída será utilizando quando todas as tentativas de integração falharem.
Execução imediata
...
A execução imediata determina que a execução do script será feita de forma síncrona, logo depois do evento afterStateEntry do processo em questão, ou seja, será executado no momento em que a solicitação chegar na atividade de serviço.
Quando o script for executado com sucesso, a solicitação é enviada imediatamente da atividade de serviço para a próxima etapa, dando continuidade ao fluxo de saída padrão. Porém, se ocorrer alguma inconsistência, esta forma de execução apenas retornará a inconsistência encontrada, mantendo a solicitação parada até que uma pessoa interaja na solicitação para averiguar e corrigir as inconsistências que ocorreram.
Esse é um exemplo de código para iniciar a integração com o serviço configurado no componente:
| Bloco de código | ||
|---|---|---|
| ||
try {
var Service = ServiceManager.getService('rm');
var serviceHelper = Service.getBean();
var serviceLocator = serviceHelper.instantiate('classe.locator');
} catch(erro) {
log.error(erro);
} |
| Estado | ||||||
|---|---|---|---|---|---|---|
|
A execução imediata deve ser utilizada quando a execução necessita de um retorno imediato sobre a operação para que o processo possa seguir adiante.
| Informações | ||
|---|---|---|
| ||
Atualmente, o tipo de execução imediata não é muito recomendado por ter seu desempenho reduzidos. |
Headers
| Âncora | ||||
|---|---|---|---|---|
|
...