I have to following code:
| protected TaskInstance locateTask(ContextInstance ctx, JbpmContext jbpmContext) throws
ApplicationException {
| String searchValue = (String) ctx.getVariable(contextKey);
| if (searchValue == null || searchValue.trim().equals(""))
| return null;
| String query = String.format("select t.ID_ TASK_ID from JBPM_TASKINSTANCE t ,
JBPM_VARIABLEINSTANCE vi "
| + "where vi.STRINGVALUE_ = '%s' and vi.TOKEN_ = t.TOKEN_ and
(t.ISOPEN_ = 1 or t.ISSUSPENDED_ = 1)"
| + " and t.END_ is null and t.NAME_ ", new Object[] {searchValue});
|
| String inString;
| if (!notInTaskType) {
| inString = String.format("in ( %s )", new Object[] {taskName});
| }
| else {
| // we're looking for tasks which are not of types given
| inString = String.format("not in ( %s )", new Object[] {taskName});
| }
|
| query += inString;
|
| SQLQuery sqlQuery =
jbpmContext.getSession().createSQLQuery(query).addScalar("TASK_ID",
Hibernate.LONG);
| List result = sqlQuery.list();
| // Collection<DbaseFieldList> result =
JDBCHelper.getInstance().runSelectStatement(query,
| // (Connection) ctx.getTransientVariable(FlowVariables.CONNECTION));
| if (result == null || result.isEmpty()) {
| return null;
| }
| // always take the first one found! usually there should be only one task in
existence
| // long taskId =
Long.parseLong(result.iterator().next().get("ID_").getValueAsString());
| Long taskId = (Long) result.get(0);
| if (logger.isLoggable(Level.FINEST))
| logger.finest("Found a Task with ID: " + taskId);
| TaskInstance task;
| try {
| task = TaskManager.loadInstance(taskId, jbpmContext);
| if (logger.isLoggable(Level.FINEST))
| logger.finest(task.toString());
| }
| catch (ApplicationException ae) {
| // the task is either being opened by a user of is being finished by a user.
| Long userId = (Long) ctx.getTransientVariable(FlowVariables.USER_ID);
| if (userId != null) {
| String folderId = (String) ctx.getVariable(FlowVariables.FOLDER_ID);
| String text = ServerSideResources.translate("Msg38") + " " +
folderId;
| Set<String> users = new HashSet<String>();
| users.add(userId.toString());
| MessageManager.getInstance().sendMessageToUsers(users, text);
| }
| return null;
| }
| return task;
| }
|
| public static EmiTaskInstance loadInstance(long taskId, JbpmContext ctx) throws
ApplicationException {
| EmiTaskMgmntSession mgmtSession = (EmiTaskMgmntSession) ctx.getTaskMgmtSession();
| try {
| return (EmiTaskInstance) mgmtSession.loadTaskInstance(taskId);
| }
| catch (JbpmException e) {
| throw new ApplicationException("ALREADY_ASSIGNED", e.getMessage());
| }
| }
|
|
In one process I call a subprocess. Before the subprocess is called I run an action which
closes a Task (Hence Task A). At the beginning of the subprocess I run an action which
runs the locateTask from above to locate open tasks that have a certain value. The select
I run using the open hibernate session returns finding Task A although Task A is closed
i.e has an end date, and is not marked as open or suspended. More over, on the next couple
of lines of code I load the task with the id the select returned and try to resume it,
this fails on exception that says I can't resume a task that has been closed. How can
the select find this task if it closed?
I'm running a Jbpm 3.2 in a clustered environment, which means I'm using an XA
DataSource and XA transactions. A Transaction is opened before I begin and the commit is
only after The subprocess has reached a blocking state.
The only thing I can think of is that for some reason the connection used for the query is
not the connection used for loading and closing the task. I also want to mention that the
same exact code does not fail in a non clusterd environment.
I'll be happy to read any thoughts on this matter that can point me to a
direction....
View the original post :
http://www.jboss.com/index.html?module=bb&op=viewtopic&p=4196209#...
Reply to the post :
http://www.jboss.com/index.html?module=bb&op=posting&mode=reply&a...