Serviço Criminal Local (On-Prem)
Público-alvo: Equipes de infraestrutura e DevOps dos tribunais que farão a implantação local do Serviço Criminal.
Pré-requisito de código: As alterações descritas na análise técnica devem estar implementadas e implantadas antes de executar qualquer etapa deste guia.
Visão Geral
O Módulo Criminal pode operar em dois modos:
| Modo | Descrição |
|---|---|
| Nacional (padrão) | O PJe do tribunal se comunica com o Serviço Criminal hospedado na infraestrutura do CNJ via API Gateway. |
| Local (on-prem) | O tribunal hospeda sua própria instância do Serviço Criminal. O PJe aponta diretamente para ela, e o Criminal Local consome apenas as mensagens do próprio tribunal via RabbitMQ. |
A habilitação do modo local exige configuração em quatro componentes:
- PJe — apontar clients REST criminais para a URL local
- Serviço Criminal Local — filtrar mensagens AMQP apenas do tribunal
- pje2-web — usar URL local no frontend Angular através de parâmetro do PJe
- Criminal Nacional — ignorar mensagens do tribunal que foi migrado para local
Conceitos Necessários
appName
Cada instância do PJe possui um identificador único chamado appName, configurado via variável de ambiente ENV_PJE2_CLOUD_APP_NAME (ou pje2.cloud.appName no integracao.properties). Por convenção, o formato é pje-<sigla-tribunal-em-minúsculas>, por exemplo:
| Tribunal | appName |
|---|---|
| TJMG | pje-tjmg |
| TJSP | pje-tjsp |
| TJBA | pje-tjba |
Confirme o appName da instância PJe do seu tribunal antes de prosseguir — ele é usado como filtro AMQP.
Routing Key AMQP
As mensagens publicadas pelo PJe no RabbitMQ seguem o padrão:
<JTR>.<GRAU>.<appName>.<MODELO>.<VERBO>
Exemplo para o TJMG (JTR 160, 2º grau):
160.2.pje-tjmg.ProcessoParte.POST
O Criminal Local usa esse padrão para filtrar somente as mensagens do próprio tribunal.
Etapa 1 — Configurar o PJe
O PJe precisa saber qual URL usar para as chamadas ao Serviço Criminal. Isso é feito via variável de ambiente ou propriedade de configuração.
Variável de ambiente (recomendado)
Adicione ao ambiente de execução do JBoss/WildFly:
ENV_PJE2_CLOUD_URL_CRIMINAL=https://<url-do-criminal-local-do-tribunal>
Exemplo:
ENV_PJE2_CLOUD_URL_CRIMINAL=https://criminal.tjxx.jus.br
Alternativa: integracao.properties
Se o tribunal preferir configurar via arquivo de propriedades em vez de variável de ambiente:
pje2.cloud.urlCriminal=https://criminal.tjmg.jus.br
Comportamento de fallback: Se ENV_PJE2_CLOUD_URL_CRIMINAL e pje2.cloud.urlCriminal não estiverem definidos, o PJe continuará usando o API Gateway nacional — o Criminal Local simplesmente não será acionado.
Convenção importante: sufixo /criminal/
O CriminalRestClient acrescenta automaticamente o sufixo /criminal/ ao path das requisições. A URL configurada não deve incluir esse sufixo. Exemplos:
| Correto | Incorreto |
|---|---|
https://criminal.tjxx.jus.br | https://criminal.tjxx.jus.br/criminal/ |
Reinicialização
Após definir a variável, reinicie o servidor de aplicações do PJe para que a configuração seja lida.
Etapa 2 — Configurar o Serviço Criminal Local
O Serviço Criminal Local é uma aplicação Spring Boot. Toda a configuração é feita por variáveis de ambiente que sobrescrevem os valores padrão do application.yml.
2.1 Configurações obrigatórias
Banco de dados
| Variável | Descrição |
|---|---|
CRIMINAL_DB_URL | URL JDBC do banco PostgreSQL |
CRIMINAL_DB_USER | Usuário do banco |
CRIMINAL_DB_PASSWORD | Senha do banco |
RabbitMQ
| Variável | Descrição |
|---|---|
CRIMINAL_RABBITMQ_HOST | Host do broker RabbitMQ |
CRIMINAL_RABBIT_USERNAME | Usuário do RabbitMQ |
CRIMINAL_RABBIT_PASSWORD | Senha do RabbitMQ |
CRIMINAL_RABBIT_VHOST | Virtual host |
Keycloak / SSO
| Variável | Descrição |
|---|---|
SSO_AUTH_SERVER | URL do servidor Keycloak |
SSO_REALM | Realm |
SSO_RESOURCE | Client ID |
Eureka (Service Discovery)
| Variável | Descrição |
|---|---|
EUREKA_CLIENT_ENABLED | Desabilitar o registro no Eureka |
2.2 Configuração do filtro AMQP — crítico
Esta é a configuração que distingue o Criminal Local do Nacional.
O Criminal Local deve consumir apenas as mensagens do próprio tribunal.
Defina as seguintes variáveis com o appName do PJe do tribunal:
CRIMINAL_AMQP_ROUTING_KEY_PROCESSO_PARTE=*.*.pje-tjmg.ProcessoParte.*
CRIMINAL_AMQP_ROUTING_KEY_PROCESSO_EVENTO=*.*.pje-tjmg.ProcessoEvento.*
Substitua pje-tjmg pelo appName real do tribunal (ver conceito de appName).
Comportamento de fallback: Se essas variáveis não forem definidas, os padrões *.*.*.ProcessoParte.* e *.*.*.ProcessoEvento.* serão usados — o serviço consumirá mensagens de todos os tribunais, o que é o comportamento do Criminal Nacional.
Variáveis AMQP completas (com valores padrão)
| Variável | Padrão | Valor para local |
|---|---|---|
CRIMINAL_AMQP_QUEUE | pje.criminal | Pode usar um nome distinto, ex.: pje.criminal.tjxx |
CRIMINAL_AMQP_EXCHANGE | pje.exchange | Manter pje.exchange |
CRIMINAL_AMQP_ROUTING_KEY_PROCESSO_PARTE | *.*.*.ProcessoParte.* | *.*.pje-tjxx.ProcessoParte.* |
CRIMINAL_AMQP_ROUTING_KEY_PROCESSO_EVENTO | *.*.*.ProcessoEvento.* | *.*.pje-tjxx.ProcessoEvento.* |
Use um nome de fila distinto (ex.: pje.criminal.tjxx) para evitar conflito com a fila do Criminal Nacional caso ambos estejam conectados ao mesmo broker.
2.3 Configurações opcionais
| Variável | Padrão | Descrição |
|---|---|---|
CRIMINAL_PORT | 8480 | Porta HTTP do serviço |
CRIMINAL_MANAGEMENT_PORT | 8480 | Porta de gerenciamento (Actuator) |
CRIMINAL_APP_NAME | criminal | Nome da aplicação no Eureka |
SEEU_WSDL | URL nacional | WSDL de integração com o SEEU |
ASSINADOR_URL | URL nacional | URL do serviço de assinatura A1 |
Etapa 3 — Configurar o pje2-web (Frontend Angular)
O frontend Angular do PJe2 precisa saber a URL do Criminal Local para montar as requisições corretamente.
3.1 Cadastrar o parâmetro no banco do PJe
O parâmetro ENV_PJE2_CLOUD_URL_CRIMINAL deverá ser criado pelo Flyway ou outro script de migração do PJe.
O valor do parâmetro deve ser ajustado de acordo com a URL do criminal local.
O nome do parâmetro deve ser exatamente ENV_PJE2_CLOUD_URL_CRIMINAL (sensível a maiúsculas/minúsculas).
3.2 Verificar via interface administrativa
Alternativamente, o parâmetro pode ser cadastrado ou atualizado pela interface administrativa do PJe2, no menu de configuração de parâmetros do sistema.
3.3 Comportamento de fallback
Se o parâmetro ENV_PJE2_CLOUD_URL_CRIMINAL não existir ou estiver vazio, o frontend continuará usando AppConfig.getUrlApiGateway() — ou seja, o Gateway nacional.
Etapa 4 — Atualizar o Criminal Nacional
Após habilitar o Criminal Local, o Criminal Nacional continuará recebendo as mensagens do mesmo tribunal (pois o padrão *.*.*.ProcessoParte.* abrange qualquer appName). Para evitar processamento duplicado:
4.1 Adicionar o tribunal à lista de exclusão
No Criminal Nacional, adicione o appName do tribunal à variável de ambiente:
CRIMINAL_AMQP_APPNAMES_IGNORADOS=pje-tjmg
Para múltiplos tribunais com Criminal Local, separe por vírgula:
CRIMINAL_AMQP_APPNAMES_IGNORADOS=pje-tjmg,pje-tjsp,pje-tjba
4.2 Reinicialização
Reinicie o Criminal Nacional para que o filtro seja aplicado.
Se esta etapa for omitida, o Criminal Nacional processará as mensagens do tribunal em paralelo com o Criminal Local, resultando em duplicidade de dados.
Resumo das Variáveis por Componente
PJe (JBoss/WildFly)
| Variável | Obrigatória | Descrição |
|---|---|---|
ENV_PJE2_CLOUD_URL_CRIMINAL | Sim | URL base do Criminal Local (sem sufixo /criminal/) |
Serviço Criminal Local (Spring Boot)
| Variável | Obrigatória | Descrição |
|---|---|---|
CRIMINAL_DB_URL | Sim | JDBC URL do PostgreSQL |
CRIMINAL_DB_USER | Sim | Usuário do banco |
CRIMINAL_DB_PASSWORD | Sim | Senha do banco |
CRIMINAL_RABBITMQ_HOST | Sim | Host do RabbitMQ |
CRIMINAL_RABBIT_USERNAME | Sim | Usuário do RabbitMQ |
CRIMINAL_RABBIT_PASSWORD | Sim | Senha do RabbitMQ |
CRIMINAL_RABBIT_VHOST | Sim | Virtual host do RabbitMQ |
SSO_AUTH_SERVER | Sim | URL do Keycloak |
SSO_REALM | Sim | Realm do Keycloak |
CRIMINAL_AMQP_ROUTING_KEY_PROCESSO_PARTE | Sim | Filtro AMQP — *.*.pje-<tribunal>.ProcessoParte.* |
CRIMINAL_AMQP_ROUTING_KEY_PROCESSO_EVENTO | Recomendado | Filtro AMQP — *.*.pje-<tribunal>.ProcessoEvento.* |
CRIMINAL_AMQP_QUEUE | Recomendado | Nome de fila distinto, ex.: pje.criminal.tjxx |
Criminal Nacional (Spring Boot)
| Variável | Obrigatória | Descrição |
|---|---|---|
CRIMINAL_AMQP_APPNAMES_IGNORADOS | Sim | Lista de appNames dos tribunais com criminal local |
Ordem de Execução Recomendada
- Implantar o Serviço Criminal Local e configurar banco de dados, SSO e Eureka
- Configurar as variáveis AMQP com o routing key específico do tribunal
- Iniciar o Criminal Local e verificar os logs de conexão com RabbitMQ
- Cadastrar o parâmetro
URL_CRIMINAL_LOCALno banco do PJe2 - Definir
ENV_PJE2_CLOUD_URL_CRIMINALno PJe e reiniciar o servidor de aplicações - Atualizar
CRIMINAL_AMQP_APPNAMES_IGNORADOSno Criminal Nacional e reiniciá-lo - Executar testes de validação (ver seção abaixo)
Validação
Verificar conectividade PJe → Criminal Local
Acesse um processo criminal no PJe2. Se os dados criminais carregarem sem erros de rede, a configuração do PJe e do pje2-web está correta.
Para confirmar qual URL está sendo usada, verifique os logs do servidor de aplicações PJe — as chamadas criminais devem mostrar a URL local configurada, não o gateway nacional.
Verificar consumo AMQP no Criminal Local
Nos logs do Criminal Local, ao tramitar um processo criminal, deve aparecer:
[PJE-CLOUD-EVENT] ... appName: pje-tjmg ...
Se aparecer Não foi possível identificar o tribunal, verifique se o appName configurado no RabbitMQ routing key corresponde exatamente ao ENV_PJE2_CLOUD_APP_NAME definido no PJe.
Verificar que o Criminal Nacional não está duplicando
Nos logs do Criminal Nacional, mensagens do tribunal migrado devem aparecer com:
Tribunal pje-tjmg possui criminal local. Descartando mensagem.
Troubleshooting
| Sintoma | Causa provável | Solução |
|---|---|---|
| Frontend continua usando o gateway nacional | Parâmetro ENV_PJE2_CLOUD_URL_CRIMINAL ausente ou vazio | Cadastrar o parâmetro no banco (Etapa 3) |
| PJe envia requisições para o gateway nacional | ENV_PJE2_CLOUD_URL_CRIMINAL não definido | Definir a variável e reiniciar o JBoss |
| Criminal Local recebe mensagens de outros tribunais | CRIMINAL_AMQP_ROUTING_KEY_PROCESSO_PARTE usa padrão global *.*.* | Configurar routing key específico do tribunal |
| Criminal Nacional continua processando o tribunal | CRIMINAL_AMQP_APPNAMES_IGNORADOS não atualizado | Adicionar appName e reiniciar o Nacional |
| Dados criminais duplicados | Etapa 4 omitida antes da Etapa 5 | Atualizar Nacional antes de ativar o Local |
| Erro 404 nas chamadas REST criminais | URL configurada inclui /criminal/ | Remover o sufixo da URL (ver Etapa 1) |