Skip to content

jBPM – couldn’t get task instances by ids

Julho 27, 2011

Passei um bom tempo pesquisando sobre este erro, então resolvi postar aqui o veredito.

Este problema é referente ao uso da variável #{taskInstanceList} do jBPM, responsável por trazer todas as tarefas que estão associadas a um determinado ator. O inconveniente acontece quando esta variável é chamada, por exemplo dentro de um código feito com seam (meu caso), e o ator em questão não possui nenhuma tarefa passível a ser executada por ele. Assim, é gerada a exceção:

org.jbpm.persistence.JbpmPersistenceException: couldn't get task instances by ids '[]'
    at org.jbpm.db.TaskMgmtSession.findTaskInstancesByIds(TaskMgmtSession.java:204)
    at org.jbpm.db.TaskMgmtSession.findPooledTaskInstances(TaskMgmtSession.java:123)
Caused by: org.hibernate.hql.ast.QuerySyntaxException: unexpected end of subtree [

      select ti
      from org.jbpm.taskmgmt.exe.TaskInstance ti
      where ti.id in (  )

  ]

Para quem quer economizar leitura, a solução é: migre seu jBPM para uma versão igual ou superior à 3.2.9.

 

O erro acontece porque, no cenário descrito, acontece a execução de uma query que recebe uma lista vazia dentro da cláusula WHERE IN. A classe que contém a chamada desta query é a org.jbpm.db.TaskMgmtSession. Através do trecho de código abaixo, repare que, em primeira instância, acontece a busca de todas as pooledTasks passíveis de execução pelo ator em questão, conforme o método findPooledTaskInstances. Verifique que, logo após, é chamado o método findTasksInstancesByIds, passando como parâmetro o resultado da busca anterior.

public List findPooledTaskInstances(String actorId) {
    try {
      List taskInstanceIds = session.getNamedQuery(“TaskMgmtSession.findPooledTaskInstancesByActorId”)
          .setString(“actorId”, actorId)
         .list();
      return findTaskInstancesByIds(taskInstanceIds);
         ….
public List findTaskInstancesByIds(List taskInstanceIds) {
    try {
      return session.getNamedQuery(“TaskMgmtSession.findTaskInstancesByIds”)
          .setParameterList(“taskInstanceIds”, taskInstanceIds)
          .list();
    }

….

Como, no cenário de erro, a primeira busca retorna um lista vazia (não há tarefas que o ator possa executar), a segunda recebe uma lista vazia dentro da cláusula WHERE, segundo o próprio log nos mostra.
 select ti
      from org.jbpm.taskmgmt.exe.TaskInstance ti
      where ti.id in (  )

Este erro foi reportado como um bug, disponível em https://issues.jboss.org/browse/JBPM-2637. Aparentemente, tudo funcionava bem quando, nas versões 3.2.7 e 3.2.8, foi removida uma validação que cobria o caso de a lista passada para a query estar vazia. Deste modo, como a própria resolução do bug descreve, faça a atualização do jBPM para a versão 3.2.9, onde a validação foi novamente codificada.

 

From → Uncategorized

2 comentários
  1. Jocimar Farias permalink

    Rafael,

    Onde encontramos a versão 3.2.9 ou mesmo a 3.2.12 para download, no link de downloads do site http://www.jboss.org/jbpm só tem até a versão 3.2.8.

  2. Cara,

    També me surpreendi ao não ver a varsão lá.
    Tente com a versão 3.3.0.GA.
    []’s

Deixe uma Resposta

Preencha os seus detalhes abaixo ou clique num ícone para iniciar sessão:

Logótipo da WordPress.com

Está a comentar usando a sua conta WordPress.com Terminar Sessão / Alterar )

Imagem do Twitter

Está a comentar usando a sua conta Twitter Terminar Sessão / Alterar )

Facebook photo

Está a comentar usando a sua conta Facebook Terminar Sessão / Alterar )

Google+ photo

Está a comentar usando a sua conta Google+ Terminar Sessão / Alterar )

Connecting to %s

Coding Horror

Um prato de informações tecnológicas com uma pitada de conhecimento aleatório.

InfoQ

Um prato de informações tecnológicas com uma pitada de conhecimento aleatório.

JBoss Developer Recent Posts

Um prato de informações tecnológicas com uma pitada de conhecimento aleatório.

JBossDivers

Mergulhando no Mundo JBoss

%d bloggers like this: