The following sample demonstrates a deadlock between SFSB lock and the Component.getInstanceFromFactory factoryLock:
@Stateful
@Scope(ScopeType.SESSION)
@Name("test")
public class TestAction implements Test
{
publicString test() {
Thread.sleep(500);
Component.getInstance("foo", true);
return"test";
}
@Factory(value="testString", scope=ScopeType.EVENT)
publicString getTestString() {
return"testString";
}
@Remove
public void remove() {}
}
@Name("testProducer")
public class TestProducer {
@Factory(scope=ScopeType.EVENT)
publicString getFoo() {
System.out.println("XXX: TestProducer in getFoo");
return"foo";
}
}
when test.xhtml contains:
<h:outputText value="#{test.test()} " />
and othertest.xhtml contains:
<h:outputText value="#{testString} " />
If the othertest.seam is requested just after (<500ms after) the test.seam with the same session cookie.
The problem seems to be that the #{test.test()} first locks the TestAction SFSB lock and then the Seam factoryLock in the Component.getInstance call, while #{testString} locks the factoryLock first.