Activiti x Camunda BPM: o peso da comunidade

O mercado de soluções para BPM está repleto de produtos, comerciais e também software livre.

Entre as ferramentas BPMS disponíveis no mercado no formato de código aberto, dois produtos têm um passado em comum: o Activiti e o Camunda BPM.

O Camunda BPM surgiu em 2013, criado a partir de uma bifurcação do software Activiti da Alfresco. No artigo “Camunda Forks Alfresco Activiti”, Charles Humble da InfoQ explica o nascimento do Camunda BPM e apresenta também uma divergência de opiniões da época a respeito do futuro das duas ferramentas.

Na prática, de uma solução surgiu a outra, e ambas seguem em constante evolução. Este artigo vem comparar o peso das duas comunidades.

Para essa comparação, tivemos que elencar algumas características principais sobre a ferramentas e suas comunidades, e foram elas:

Colaboração – Quantidade de pessoas envolvidas ativamente no desenvolvimento do código-fonte
Atualização – Frequência de melhorias realizadas no software (commits and releases)
Documentação – Facilidade de acesso e diversidade de documentos disponíveis
Integração – Possibilidade de integração com outras tecnologias e exemplos e tutoriais para tal
Relacionamento – Atividade nos fóruns para desenvolvedores

Para essa pesquisa, utilizamos a leitura das documentações disponíveis, seguindo pela busca dos códigos fontes nos repositórios e principalmente de exemplos de utilização e tutoriais. Fizemos algumas estatísticas com base nos contribuintes do código fonte, frequência das últimas alterações e quantidade de desenvolvedores que acompanham as evoluções das duas ferramentas.

Seguimos observando as perguntas realizadas nos fóruns para desenvolvedores e principalmente na existência e qualidade das respostas, acompanhamos também as redes sociais de cada ferramenta e finalizamos observando as questões encontradas na internet de um modo geral (uma boa parte no site StackOverflow).

O resultado da pesquisa gerou insumos suficientes para elaborarmos um quadro comparativo que segue. O quadro permite observar pequenas diferenças na participação da comunidade.

Seguindo a vertente do software livre, lançaremos uma série de artigos falando mais detalhadamente sobre algumas ferramentas disponíveis, como JBPM, Intalio e outras incluindo também o Activiti e Camunda BPM, porém com um enfoque diferente, comparando a arquitetura de BPMS de cada solução.

Fontes da pesquisa:
http://camunda.org/
https://github.com/camunda
https://groups.google.com/forum/#!forum/camunda-bpm-dev
http://activiti.org/
https://github.com/activiti
http://forums.activiti.org/forums/activiti-developers
http://www.infoq.com/news/2013/03/Camunda-Forks-Activiti

Oracle BPM 11g: Disponibilizando uma tarefa humana fora do workspace

Em algumas situações de projetos de automatização de processos de negócio utilizando o Oracle BPM 11g, somos questionados sobre a possibilidade de exibir a tela nativa de uma tarefa humana em outro ambiente, como por exemplo um software web externo do cliente.

A boa notícia!

Isto é possível através da invocação de APIs do produto, que podem capturar a URL específica de uma tarefa humana.

A mágica…

Precisamos estar autenticados no BPM para obter a URL que desejamos. Devemos fazer isso de forma programática, então através do uso de algumas classes de apoio (que falaremos a seguir), vamos realizar os seguintes passos:

  • instanciar a factory linkada com o BPM
  • criar dois contextos (de um usuário administrador e do usuário final)
  • descobrir o processo correto
  • criar/obter uma tarefa
  • obter a URL da tarefa

As classes de apoio estão no bpm-services.jar, que está localizado dentro dos módulos SOA do JDeveloper. Este é o caminho padrão para o jar, que pode ser diferente conforme a instalação do JDeveloper:
C:\Oracle\Middleware\jdeveloper\soa\modules\oracle.soa.workflow_11.1.1\bpm-services.jar

Seguem os exemplos de código de cada passo:

Instanciar a BPMServiceClientFactory

public static BPMServiceClientFactory getBPMServiceClientFactory() {
    Map properties = new HashMap();

    properties.put(IWorkflowServiceClientConstants.CONNECTION_PROPERTY.CLIENT_TYPE,
                    WorkflowServiceClientFactory.REMOTE_CLIENT);

    properties.put(IWorkflowServiceClientConstants.CONNECTION_PROPERTY.EJB_PROVIDER_URL,
                    "t3://yourhost:7001");

    properties.put(IWorkflowServiceClientConstants.CONNECTION_PROPERTY.EJB_INITIAL_CONTEXT_FACTORY,
                    "weblogic.jndi.WLInitialContextFactory");

    return BPMServiceClientFactory.getInstance(properties, null, null);
}

Criar os contextos

public static IBPMContext getIBPMContext(String adminUsername, String adminPassword, String processUserUsername) throws Exception {
    //first context
    IBPMContext adminContext = getBPMServiceClientFactory()
                    .getBPMUserAuthenticationService()
                    .authenticate(adminUsername, adminPassword.toCharArray(), null);

    //second and final context
    return getBPMServiceClientFactory()
                    .getBPMUserAuthenticationService()
                    .authenticateOnBehalfOf(adminContext, processUserUsername);
}

Descobrir o processo e a tarefa corretos

public Task getTask(String compositeDN, String processName) throws Exception {
    IProcessMetadataService service = getBPMServiceClient().getProcessMetadataService();

    IBPMContext bpmContext = getIBPMContext("admin", "senhaadmin", "zeca");

    ListinitiableTasks = service.getInitiatableProcesses(bpmContext);

    ProcessMetadataSummary pms = null;
    for(ProcessMetadataSummary process :initiableTasks) {
        if(process.getProcessName().equals(processName)) {
            pms = process;
            break;
        }
    }

    IInstanceManagementService ims = getBPMServiceClient().getInstanceManagementService();

    Task task = ims.createProcessInstanceTask(
                    bpmContext,
                    pms.getCompositeDN() + "/" + pms.getProcessName());

    return task;
}

Finalmente… Obter a URL da tarefa

private String getTaskDisplayURL(Task task) throws Exception {
    Map parameters = new HashMap();
    parameters.put(Constants.BPM_WORKLIST_TASK_ID,
                    task.getSystemAttributes().getTaskId());

    parameters.put(Constants.BPM_WORKLIST_CONTEXT,
                    getIBPMContext().getToken());

    String url = WorklistUtil.getTaskDisplayURL(
                    factory.getWorkflowServiceClient(),
                    getIBPMContext(), task, null,
                    "worklist", parameters);
    return url;
}

Com estes pequenos passos é possível obter a URL de uma tarefa humana do Oracle BPM e invocar a tela nativa feita em ADF para exibir em pop-ups, janelas ou até mesmo dentro de algum site de negócio.

As assinaturas destes métodos são apenas uma sugestão de uso. Existem muitas outras opções nas classes da API que podem atender diversas necessidades de negócio, então o desenvolvedor pode modificar estes métodos ou criar outros conforme for mais conveniente.

Ficou alguma dúvida sobre este assunto ou gostaria de entender tecnicamente alguma outra peculiaridade do Oracle BPM? Escreva sua dúvida ou sugestão nos comentários!