[英]Is it possible to use JBoss SEAM on an application that is not a WEB application?
[英]Is it possible to use Seam in a JBoss timed service?
我已经开始编写一些新的JBoss定时服务,旨在使用一些现有的接缝组件。 但由于不存在的上下文,我似乎无法访问这些组件。 除了JSF的典型情况之外,是否可以使用它们?
一个小小的片段来展示我想要做的事情......
@Service
public class MyService extends DefaultTimedService implements TimedObject, DefaultServiceInterface {
@Timeout
public void ejbTimeout(Timer timer) {
MyInterface loader = (MyInterface) Component.getInstance(MyInterface.SEAM_NAME, true);
// throws no context!
}
}
例如,抛出以下异常:
java.lang.IllegalStateException: No application context active
at org.jboss.seam.Component.forName(Component.java:1945)
at org.jboss.seam.Component.getInstance(Component.java:2005)
有一种方法有点脏,有很多开发人员不会使用这样的黑客,但它会解决你的问题:
import org.jboss.seam.contexts.Lifecycle;
@Service
public class MyService extends DefaultTimedService implements TimedObject, DefaultServiceInterface {
@Timeout
public void ejbTimeout(Timer timer) {
Lifecycle.beginCall();
MyInterface loader = (MyInterface) Component.getInstance(MyInterface.SEAM_NAME, true);
// will not throw no context!
// also the Component.getInstance(MyInterface.SEAM_NAME, true,true); call
// is another way you could inject that component.
Lifecycle.endCall();
}
}
我在一个项目中使用它,在那里我找不到任何有用的东西。 如果有人有另一个解决方案,我期待在这里看到它:)。
您为组件定义了什么范围? 可能是应用程序上下文,因为它在错误中如此说明。
...
所以我在源头周围探索并发现上下文存储在一个名为Contexts的类中。 所有上下文似乎都是特定于线程的,因为它们封装在ThreadLocal实例中 。 这意味着必须为定时服务的线程指定...
问题仍然存在:如何为特定线程创建上下文。
你不能注入loader
实例,而不是用静态调用来定位它吗? 我对Seam不太熟悉,但也许(在课堂上):
@In private MyInterface loader;
然后,在您的方法中,只需使用loader
。
看起来,Seam有应用程序/无状态范围,在您的情况下似乎是合适的:
@Scope(ScopeType.APPLICATION)
要么
@Scope(ScopeType.STATELESS)
尝试其中之一 - 因为您的类似乎不需要会话/请求中的任何信息,所以更适合不使用与Web相关的范围。
因此,在上述范围之一中定义MyService
和MyInterface
,并尝试注入和查找方法。
检查有关上下文和并发性的Seam教程
这个帖子似乎很有用。
从这个线程看来,你可能会使用@Asynchronous
注释。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.