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ção | Entrada XML | Valores Permitidos | Valor Padrão |
|---|---|---|---|
| Nome da unidade de persistência para os dados de tempo de execução | persistence-unit | Qualquer nome de pacote de persistência válido | org.jbpm.domain |
| Nome da unidade de persistência para os dados de auditoria | audit-persistence-unit | Qualquer nome de pacote de persistência válido | org.jbpm.domain |
| Modo de persistência | persistence-mode | JPA, NENHUM | JPA |
| Mode de auditoria | audit-mode | JPA, JMS ou NENHUM | JPA |
| Estratégia de Tempo de Execução | runtime-strategy | SINGLETON, PER_REQUEST ou PER_PROCESS_INSTANCE | SINGLETON |
| Lista de Ouvintes de Evento a serem registrados | event-listeners | Nomes de classe de ouvintes válidos, como ObjectModel | Nenhum valor padrão |
| Lista de Ouvintes de Evento de Tarefa a serem registrados | task-event-listeners | Nomes de classe de ouvintes válidos, como ObjectModel | Nenhum valor padrão |
| Lista de Manipuladores de Itens de Trabalho a serem registrados | work-item-handlers | Classes de Manipuladores de Itens de Trabalho válidas fornecidas como NamedObjectHandler | Nenhum valor padrão |
| Lista de Globais a serem registradas | globals | Variáveis globais válidas fornecidas como NamedObjectModel | Nenhum valor padrão |
| Estratégias de marshalling a serem registradas (para persistências variáveis conectáveis) | marshalling-strategies | Classes ObjectModel válidas | Nenhum valor padrão |
| Funções necessárias que serão concedidas acesso aos recursos do kjar | required-roles | Nomes de funções de cadeia | Nenhum valor padrão |
| Entradas de Ambiente adicionais para a Sessão de Conhecimento | environment-entries | NamedObjectModel válido | Nenhum valor padrão |
| Opções de configuração adicionais da Sessão de Conhecimento | configurações | NamedObjectModel válido | Nenhum 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ção → Criação de Projeto e, depois, selecionando Ferramentas → Descritor de Implantação) ou clicando no menu Criação → Administraçã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 (Implantar → Implantaçõ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.