[JBoss JIRA] Created: (JBPM-2422) investigate if logging abstraction should be removed
by Tom Baeyens (JIRA)
investigate if logging abstraction should be removed
----------------------------------------------------
Key: JBPM-2422
URL: https://jira.jboss.org/jira/browse/JBPM-2422
Project: JBoss jBPM
Issue Type: Task
Security Level: Public (Everyone can see)
Reporter: Tom Baeyens
Priority: Minor
Fix For: jBPM 4.x
the current approach is to have a minimal log framework pluggability:
----------------------------------------------------------------------------------------------
1) jdk logging because we want it to be possible to run pvm without external library dependencies
2) log4j as jboss doesn't include a jdklogging-to-log4j bridge.
general links
------------------
http://www.jboss.org/community/wiki/Logging
select between these options:
-----------------------------------------
1) always require a jbpm.logging.properties on the classpath. that configures the jdk logging. eithers completely, or with a delegation to log4j in that case our jbpm code can always use the jdk logging.
2) keep it as it is
3) similar solution to seam for facelets:
===http://markmail.org/message/ywamc5yc7hejrlls====================================================================
Subject: Facelets JDK Logging -> JBoss Log4j bridge Actions...
From: Pete Muir (pmu...(a)bleepbleep.org.uk)
Date: Feb 19, 2008 7:27:50 am
List: net.java.dev.facelets.dev
As has been discussed many times on the seam forum and facelets mailing list, JBoss AS doesn't have a jdk logger -> log4j generic bridge (I don't know why, and I don't really want to find out) so what Stan did for JSF RI was write a JDK logging filter that would bridge JUL to log4j.
I have done the same for Facelets (included as part of jboss-seam-ui.jar, I can factor out the relevant code if anyone wants it) but hit a sight problem. Most logs in facelets are declared protected static final (so I can get at them using reflection) but in DefaultFacelet, CompositionHandler and DecorateHandler they are protected final (so I can't get at them easily as they aren't static).
Any chance they could become static? Let me know and I'll file a bug.
Code is here
http://fisheye.jboss.org/browse/Seam/trunk/ui/src/main/java/org/jboss/sea...
Thanks,
Pete
-- Pete Muir http://in.relation.to/Bloggers/Pete http://www.seamframework.org
============================================================================================================
--
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators: https://jira.jboss.org/jira/secure/Administrators.jspa
-
For more information on JIRA, see: http://www.atlassian.com/software/jira
14 years, 2 months
[JBoss JIRA] Created: (JBPM-2930) IllegalArgumentException on error path in DispatcherThread
by Per Christian Henden (JIRA)
IllegalArgumentException on error path in DispatcherThread
----------------------------------------------------------
Key: JBPM-2930
URL: https://jira.jboss.org/browse/JBPM-2930
Project: jBPM
Issue Type: Bug
Security Level: Public (Everyone can see)
Affects Versions: jBPM 4.4
Environment: JBPM 4.4 upgraded from 4.3, JDK 1.6u21.
Reporter: Per Christian Henden
DispatcherThread waits before retrying to execute a Job when there is an error. If there are multiple failures in a row, the wait period is increased in the following manner:
int currentIdleInterval = jobExecutor.getIdleMillis(); //Typically a few seconds
while(isActive) {
....
catch (Exception e) {
...
semaphore.wait(currentIdleInterval);
...
currentIdleInterval = currentIdleInterval * 2;
...
}
}
In other words, currentIdleInterval grows without bounds. Eventually the integer currentIdleInterval will overflow and semaphore.wait() will throw java.lang.IllegalArgumentException: timeout value is negative, resulting in a crash.
In my case an error occurs because there are timers that refer to inactive executions (because timers that have not fired are not deleted when a subprocess ends in JBPM 4.3). This has left me with some 340 rows in JBPM4_JOB that refers to a non-existing execution.
Another aspect of this problem is that the retry-wait can grow to unreasonably large values, for example multiple days, and if my calculations are correct, multiple years.
A simple fix is to introduce an upper bound of for example 256 * jobExecutor.getIdleMillis(), and not increase currentIdleInterval above that.
--
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators: https://jira.jboss.org/secure/Administrators.jspa
-
For more information on JIRA, see: http://www.atlassian.com/software/jira
14 years, 2 months
[JBoss JIRA] Created: (JBPM-2938) Missing attributes in jpdl-4.4.xsd
by James Baker (JIRA)
Missing attributes in jpdl-4.4.xsd
----------------------------------
Key: JBPM-2938
URL: https://jira.jboss.org/browse/JBPM-2938
Project: jBPM
Issue Type: Bug
Security Level: Public (Everyone can see)
Components: Documentation, Runtime Engine
Affects Versions: jBPM 4.4
Environment: Windows Vista, JBoss EAP 5.0
Reporter: James Baker
The 4.4 XSD does not allow the "name" attribute for <object /> or <ref /> elements which means that they cannot be used for HQL activity parameters which require a name.
I have noted that if you just ignore the XSD and specify a name anyway it does work (org.jbpm.pvm.internal.wire.descriptor.AbstractDescriptor defines a field "name").
Also it's worth pointing out that neither the user guide or examples provide an example on an HQL activity with a parameter from the execution context.
--
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators: https://jira.jboss.org/secure/Administrators.jspa
-
For more information on JIRA, see: http://www.atlassian.com/software/jira
14 years, 2 months
[JBoss JIRA] Created: (JBPM-2907) Candidate-Groups
by Sandro Röder (JIRA)
Candidate-Groups
----------------
Key: JBPM-2907
URL: https://jira.jboss.org/browse/JBPM-2907
Project: jBPM
Issue Type: Bug
Security Level: Public (Everyone can see)
Components: Runtime Engine
Affects Versions: jBPM 4.3
Reporter: Sandro Röder
@see: https://jira.jboss.org/browse/JBPM-2648
Hi everybody,
if you solve the problem like this "hql.append ( "select distinct task");" in the version 4.4 the code will not work anymore with Oracle because of the clob description field.
I test the source code from the cvs:
this is the resulting sql:
select distinct (task.id) from org.jbpm.pvm.internal.task.TaskImpl as task , org.jbpm.pvm.internal.task.ParticipationImpl as participant where participant.task = task and participant.type = 'candidate' and ((participant.userId = :candidateUserId) or (participant.groupId in (:candidateGroupIds))) and task.assignee is null
and in the result set is the following:
[1260352, 1260356]
just the task ids.
here is my working change 8on version (4.3) with a subselect to get the tasks directly:
/**
*
*/
package com.ctlmb.vip.jbpm.impl;
import java.util.ArrayList;
import java.util.List;
import org.apache.log4j.Logger;
import org.jbpm.api.identity.Group;
import org.jbpm.pvm.internal.env.EnvironmentImpl;
import org.jbpm.pvm.internal.identity.spi.IdentitySession;
import org.jbpm.pvm.internal.model.ExecutionImpl;
import org.jbpm.pvm.internal.query.TaskQueryImpl;
import org.jbpm.pvm.internal.task.ParticipationImpl;
import org.jbpm.pvm.internal.task.TaskImpl;
/**
* TODO comment me
* @author roeder
*
*/
public class TaskQueryWorkaround extends TaskQueryImpl{
private static final Logger log = Logger.getLogger(TaskQueryWorkaround.class);
/* (non-Javadoc)
* @see org.jbpm.pvm.internal.query.TaskQueryImpl#hql()
*/
@Override
public String hql() {
StringBuilder hql = new StringBuilder();
hql.append("select ");
if (count) {
hql.append("count(task) ");
} else {
hql.append("task ");
}
hql.append("from ");
hql.append(TaskImpl.class.getName());
hql.append(" as task ");
// participations
if (candidate!=null) {
//################# orginal
// hql.append(", ");
// hql.append(ParticipationImpl.class.getName());
// hql.append(" as participant ");
//
// appendWhereClause("participant.task = task ", hql);
// appendWhereClause("participant.type = 'candidate' ", hql);
//
// IdentitySession identitySession = EnvironmentImpl.getFromCurrent(IdentitySession.class);
// List<Group> groups = identitySession.findGroupsByUser(candidate);
// if (groups.isEmpty()) {
// groupIds = null;
// appendWhereClause("participant.userId = :candidateUserId ", hql);
//
// } else {
// groupIds = new ArrayList<String>();
// for (Group group: groups) {
// groupIds.add(group.getId());
// }
// appendWhereClause("((participant.userId = :candidateUserId) or (participant.groupId in (:candidateGroupIds)))", hql);
// }
//################# end orginal
//################# my change
appendWhereClause("task in ( ", hql);
StringBuilder innerSelect = new StringBuilder();
innerSelect.append("select participant.task ");
innerSelect.append("from ");
innerSelect.append(ParticipationImpl.class.getName());
innerSelect.append(" as participant ");
innerSelect.append("where ");
innerSelect.append("participant.type = 'candidate' ");
IdentitySession identitySession = EnvironmentImpl.getFromCurrent(IdentitySession.class);
List<Group> groups = identitySession.findGroupsByUser(candidate);
innerSelect.append("and ");
if (groups.isEmpty()) {
groupIds = null;
innerSelect.append("participant.userId = :candidateUserId ");
} else {
groupIds = new ArrayList<String>();
for (Group group: groups) {
groupIds.add(group.getId());
}
innerSelect.append("((participant.userId = :candidateUserId) or (participant.groupId in (:candidateGroupIds)))");
}
hql.append(innerSelect);
hql.append(") ");
}
//################# end my change
if (suspended!=null) {
if (suspended) {
appendWhereClause("task.state = '"+ExecutionImpl.STATE_SUSPENDED+"' ", hql);
} else {
appendWhereClause("task.state != '"+ExecutionImpl.STATE_SUSPENDED+"' ", hql);
}
}
if (processInstanceId!=null) {
appendWhereClause("task.processInstance.id = '"+processInstanceId+"' ", hql);
}
if (activityName!=null) {
appendWhereClause("task.execution.activityName = '"+activityName+"' ", hql);
}
if (processDefinitionId!=null) {
appendWhereClause("task.processInstance.processDefinitionId = '"+processDefinitionId+"' ", hql);
}
if (assignee!=null) {
appendWhereClause("task.assignee = :assignee ", hql);
} else if (unassigned) {
appendWhereClause("task.assignee is null ", hql);
}
appendOrderByClause(hql);
String hqlQuery = hql.toString();
log.debug(hqlQuery);
return hqlQuery;
}
/* (non-Javadoc)
* @see org.jbpm.pvm.internal.query.AbstractQuery#count()
*/
@Override
public long count() {
count = true;
return -9999;
}
}
--
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators: https://jira.jboss.org/secure/Administrators.jspa
-
For more information on JIRA, see: http://www.atlassian.com/software/jira
14 years, 2 months
[JBoss JIRA] Created: (JBPM-2929) ClassCastException after reading serialized variable
by Marcus Klimstra (JIRA)
ClassCastException after reading serialized variable
----------------------------------------------------
Key: JBPM-2929
URL: https://jira.jboss.org/browse/JBPM-2929
Project: jBPM
Issue Type: Bug
Security Level: Public (Everyone can see)
Components: Runtime Engine
Affects Versions: jBPM 4.4
Environment: Windows XP, Java 6
Reporter: Marcus Klimstra
Related to JBPM-2703.
I have a process definition with two custom nodes, refering to ActivityBehaviour classes Custom1 and Custom2. Class Custom1 sets a process variable named "bean" of class Bean, and Custom2 reads and uses this variable:
{code}
public class Bean implements Serializable {
private int value;
public int getValue() { return value; }
public void setValue(int value) { this.value = value; }
}
public class Custom1 implements ActivityBehaviour {
public void execute(ActivityExecution execution) throws Exception {
Bean bean = new Bean();
bean.setValue(42);
execution.setVariable("bean", bean);
}
}
public class Custom2 implements ActivityBehaviour {
public void execute(ActivityExecution execution) throws Exception {
Bean bean = (Bean)execution.getVariable("bean");
if (bean.getValue() != 42) {
throw new Exception("Value must be 42!");
}
}
}
{code}
All these classes were added to the deployment using addResourcesFromZipInputStream/addResourceFromInputStream. So far this works fine.
However, when I put a task node between custom1 and custom2 (apparently causing the variable to be serialized?), things go awry:
{code}
java.lang.ClassCastException: [...].Bean cannot be cast to [...].Bean
at [...].Custom2.execute(Custom2.java:6)
at org.jbpm.pvm.internal.wire.usercode.UserCodeActivityBehaviour.execute(UserCodeActivityBehaviour.java:42)
at org.jbpm.pvm.internal.model.op.ExecuteActivity.perform(ExecuteActivity.java:60)
at ...etc...
{code}
So it seems that there are two Bean-classes, loaded by different classloaders. I've traced this problem to the DeploymentObjectInputStream, which creates a new DeploymentClassLoader each time it enters the catch-clause. Since the second Bean-class is loaded by a different classloader, it is incompatible with the first.
--
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators: https://jira.jboss.org/secure/Administrators.jspa
-
For more information on JIRA, see: http://www.atlassian.com/software/jira
14 years, 2 months