2.4. Descritores de Implantação

As regras e os processos no Red Hat JBoss BPM Suite 6, ou superior, ficam armazenados em pacotes baseados no Apache Maven e são conhecidos como arquivos de conhecimento ou kjar. As regras, os processos, os ativos e etc fazem parte de um arquivo jar compilado e gerenciado pelo Maven. Um arquivo mantido dentro do diretório META-INF do kjar chamado kmodule.xml pode ser usado para definir as sessões e bases de conhecimento. Este arquivo kmodule.xml, por padrão, fica vazio.
Sempre que um componente de tempo de execução, como o Business Central, está prestes a processar o kjar, ele consulta kmodule.xml para construir a representação do tempo de execução.
Os Descritores de Implantação, um novo recurso introduzido na ramificação 6.1 do Red Hat BPM Suite, permitem que você controle sua implantação e também suplementam o arquivo kmodule.xml. A presença desses descritores é opcional e sua implantação procederá sem eles com êxito. As propriedades que você pode definir usando esses descritores são puramente técnicas, em natureza, e incluem valores meta, como persistência, auditoria e estratégia de tempo de execução.
Esses descritores permitem que você configure o servidor de execução em vários níveis (nível de servidor padrão, descriptor de implatação diferente por kjar, entre outros). Isso permite que você faça simples ajustes à configuração inicial do servidor de execução (possivelmente por kjar).
Você deve definir esses descritores em um arquivo chamado kie-deployment-descriptor.xml e deixar esse arquivo próximo ao seu arquivo kmodule.xml na pasta META-INF. Você pode mudar esse local padrão (e o nome do arquivo) ao especificá-lo como um parâmetro de sistema:
-Dorg.kie.deployment.desc.location=file:/path/to/file/company-deployment-descriptor.xml

2.4.1. Configuração dos Descritores de Implantação

Os descritores de implantação permitem que o usuário configure o servidor de execução em vários níveis:
  • nível de servidor: é o nível principal e é aquele que se aplica a todos kjars implantados no servidor.
  • nível kjar: permite que você configure os descritores com base em kjar.
  • nível de tempo de implantação: descritores que são aplicados durante a implantação de um kjar.
Os itens de configuração granular especificados pelos descritores de implantação têm prioridade sobre aqueles de nível de servidor, exceto nos casos dos itens de configuração que são baseados em coleção, os quais são mesclados. A hierarquia funciona da seguinte maneira: configuração do tempo de implantação > configuração kjar > configuração do servidor.

Nota

A configuração do tempo de implantação é aplicada às implantações feitas via API REST.
Por exemplo, se o modo de persistência (um dos itens que você pode configurar) definido no nível de servidor for NONE (Nenhum), mas esse mesmo modo estiver especificado como JPA no nível kjar, o modo, na verdade, será JPA para aquele kjar. Caso nada esteja especificado para o modo de persistência no descritor de implantação para esse kjar (ou caso não haja descritor de implantação algum), ele retrocederá para a configuração do nível de servidor, a qual é, nesse caso, NONE (Nenhum) (ou para JPA, caso não haja descritor de implantação do nível de servidor).

É possível substituir esse comportamento de modo de mesclagem hierárquica?

Sim. Na forma padrão, caso existam descritores de implantação presentes em vários níveis, as propriedades de configuração são mescladas com as granulares, substituindo os valores brutos, e com os itens de configuração ausentes no nível granular, sendo fornecidos com esses valores a partir de níveis mais altos. O resultado final é uma configuração do Descritor de Implantação mesclada. Esse modo de mesclagem padrão é chamado de modo MERGE_COLLECTIONS. Mas, você pode alterá-lo (Seção 2.4.2, “Gerenciando os Descritores de Implantação”) para um dos seguintes modos, caso não seja adequado para o seu ambiente:
  • KEEP_ALL: nesse modo, todos os valores de nível superior substituem todos os valores de nível inferior (os valores do nível do servidor substituem os valores do nível kjar)
  • OVERRIDE_ALL: nesse modo, todos os valores de nível inferior substituem todos os valores de nível superior (os valores kjar substituem os valores do nível do servidor)
  • OVERRIDE_EMPTY: nesse modo, todos os itens de configuração não vazia de níveis inferiores substituem aqueles em níveis superiores, incluindo os itens que estão representados como coleções.
  • MERGE_COLLECTIONS (PADRÃO): nesse modo, todos os itens de configuração não vazia de níveis inferiores substituem aqueles de níveis superiores (como em OVERRIDE_EMPTY), mas as propriedades de coleção são mescladas (combinadas).
Os Decritores de Implantação de kjars dependentes são colocados mais baixos do que o próprio kjar sendo implantado, mas eles ainda estão em uma posição mais elevada na hierarquia do que o nível do servidor.

Preciso fornecer um Descritor de Implantação completo para todos os kjars?

Não. E é exatamente aqui que a mesclagem entre os diferentes arquivos pode ser útil a você. É possível e recomendável o fornecimento de Descritores de Implantação parcial. Por exemplo, se quiser substituir apenas o modo de auditoria em um kjar, você precisa apenas fornecê-lo e o resto dos valores será mesclado a partir do nível do servidor ou dos kjars de nível superior.
É importante notar que, ao usar o modo de mesclagem OVERRIDE_ALL, todos os itens de configuração devem ser especificados já que os kjars relevantes sempre os usarão e não mesclarão com nenhum outro descritor de implantação na hierarquia.

O que pode ser configurado?

Os detalhes de configuração técnica de nível superior podem ser configurados através dos descritores de implantação. A tabela a seguir lista esses detalhes junto com os valores padrão e os valores permitidos.

Tabela 2.1. Descritores de Implantação

ConfiguraçãoEntrada XMLValores PermitidosValor Padrão
Nome da unidade de persistência para os dados de tempo de execução persistence-unitQualquer nome de pacote de persistência válido org.jbpm.domain
Nome da unidade de persistência para os dados de auditoriaaudit-persistence-unitQualquer nome de pacote de persistência válido org.jbpm.domain
Modo de persistênciapersistence-modeJPA, NENHUMJPA
Mode de auditoriaaudit-modeJPA, JMS ou NENHUMJPA
Estratégia de Tempo de Execuçãoruntime-strategySINGLETON, PER_REQUEST ou PER_PROCESS_INSTANCESINGLETON
Lista de Ouvintes de Evento a serem registradosevent-listenersNomes de classe de ouvintes válidos, como ObjectModelNenhum valor padrão
Lista de Ouvintes de Evento de Tarefa a serem registradostask-event-listenersNomes de classe de ouvintes válidos, como ObjectModelNenhum valor padrão
Lista de Manipuladores de Itens de Trabalho a serem registradoswork-item-handlersClasses de Manipuladores de Itens de Trabalho válidas fornecidas como NamedObjectHandlerNenhum valor padrão
Lista de Globais a serem registradasglobalsVariáveis globais válidas fornecidas como NamedObjectModelNenhum valor padrão
Estratégias de marshalling a serem registradas (para persistências variáveis conectáveis) marshalling-strategiesClasses ObjectModel válidasNenhum valor padrão
Funções necessárias que serão concedidas acesso aos recursos do kjarrequired-rolesNomes de funções de cadeia Nenhum valor padrão
Entradas de Ambiente adicionais para a Sessão de Conhecimentoenvironment-entriesNamedObjectModel válidoNenhum valor padrão
Opções de configuração adicionais da Sessão de Conhecimento configuraçõesNamedObjectModel válidoNenhum valor padrão

Como fornecer valores para itens de configuração baseados em coleções?

Você deve ter notado anteriormente, na tabela dos itens válidos de configuração, que os valores válidos para os itens baseados em coleção são ObjectModel ou NamedObjectModel. Ambos são semelhantes e fornecem uma definição do objeto a ser construído ou criado durante o tempo de execução, com exceção de que os detalhes do objeto NamedObjectModel nomeiam o objeto a ser observado. Esses dois tipos são definidos usando um identificador, parâmetros opcionais e um resolvedor (para resolver o objeto).
  • identificador - define todas as informações sobre o objeto, tais como o nome de classe totalmente qualificado, a identidade Spring bean ou uma expressão MVEL.
  • parâmetros - parâmetros opcionais que devem ser usados durante a criação de instâncias de objetos a partir deste modelo.
  • resolvedor - identificador do resolvedor que será usado para criar instâncias de objetos a partir do modelo - (reflection, mvel ou Spring).
Por exemplo, suponhamos que você tenha construído uma estratégia marshalling personalizada e queira que suas implantações usem essa estratégia ao invés da padrão, você precisará fornecer essa estratégia como um ObjectModel, com o identificador sendo com.mycompany.MyStrategy, o resolvedor sendo reflection (padrão e mais fácil) e quaisquer parâmetros necessários para a sua estratégia funcionar. O reflection será usado, então, para criar uma instância dessa estratégia usando o nome de classe totalmente qualificado que você forneceu como o identificador.
<marshalling-strategy> 
 <resolver>reflection</resolver> 
 <identifier>com.myCompany.MyStrategy</identifier> 
 <parameters>
    <parameter xsi:type="xs:string" xmlns:xs="http://www.w3.org/2001/XMLSchema">
      param
    </parameter>
  </parameters> 
</marshalling-strategy>
Caso o reflection baseado em resolvedores não seja suficiente (como demonstrado no exemplo anterior), você pode usar um resolvedor baseado na expressão MVEL, como o identificador do modelo do objeto. Durante o processo de avaliação das expressões, você pode substituir os parâmetros iniciais. Como no exemplo a seguir:
<marshalling-strategy> 
  <resolver>mvel</resolver> 
  <identifier>new com.myCompany.CustomStrategy(runtimeManager)</identifier> 
</marshalling-strategy>
O resolvedor baseado em Spring permite que você consulte um bean pelo seu identificador a partir de um contexto do aplicativo Spring. Toda vez que o JBoss BPM Suite é usado com Spring, esse resolvedor ajuda a implantar kjars no período de execução. Observe o exemplo a seguir (observe que o identificador, nesse caso, é um bean nomeado no contexto Spring):
<marshalling-strategy>
 <resolver>spring</resolver> 
 <identifier>customStrategy</identifier> 
</marshalling-strategy>

2.4.2. Gerenciando os Descritores de Implantação

Os Descritores de Implantação podem ser editados através do Business Central de duas formas: graficamente (clicando em CriaçãoCriação de Projeto e, depois, selecionando FerramentasDescritor de Implantação) ou clicando no menu CriaçãoAdministração e, depois, clicando na pasta META-INF no Explorador de Arquivo. Clique no arquivo kie-deployment-descriptor.xml para editá-lo manualmente.
Toda vez que um projeto é criado, um arquivo de estoque kie-deployment-descriptor.xml é gerado com valores padrão como descritos anteriormente.

Substituindo o Comportamento de Modo de Mesclagem Hierárquica

Para alterar o modo padrão de MERGE_COLLECTIONS para uma das opções KEEP_ALL, OVERRIDE_ALL ou OVERRIDE_EMPTY, você pode usar os seguintes métodos, dependendo dos requisitos.
  • Defina a propriedade do sistema org.kie.dd.mergemode com um desses valores. Esse modo de mesclagem se tornará padrão para todos kjars implantados no sistema, ao menos que você o substitua em um nível kjar usando o próximo método.
  • Quando implantando uma nova unidade de implantação através do Business Central (ImplantarImplantações), você pode selecionar o modo de mesclagem que deve ser usado para aquele kjar em particular.
  • Quando estiver implantando via API REST, você pode adicionar o parâmetro de consulta mergemode ao comando URL para um desses modos e definir o modo de mesclagem para essa implantação.

Restringindo o acesso ao Mecanismo de Tempo de Execução

Um dos itens de configuração discutidos anteriormente, required-roles, pode ser editado através dos Descritores de Implantação. Essa propriedade restringe o acesso ao mecanismo de tempo de execução ao nível do servidor ou kjar, assegurando que o acesso a certos processos seja concedido somente a usuários definidos por esta propriedade.
A função de segurança pode ser usada para restringir o acesso às definições do processo ou para restringir o acesso durante o tempo de execução.
O comportamento padrão é adicionar as funções necessárias às propriedades com base nas restrições dos repositórios. Você pode, é claro, editar essas propriedades manualmente, caso necessário, como descrito acima, fornecendo funções que correspondam com as funções definidas no realm de segurança.