2010-01-15 5 views
5

필자는 기존의 일부 이음매 구성 요소를 사용하기위한 새로운 JBoss 시간 서비스를 작성하기 시작했습니다. 그러나 존재하지 않는 컨텍스트 때문에 이러한 구성 요소에 액세스 할 수없는 것으로 보입니다. JSF의 일반적인 상황 이외의 다른 기능을 사용할 수 있습니까? JBoss Timed 서비스에서 Seam을 사용할 수 있습니까?

내가하고 싶은 것을 보여주기 위해 작은 조각

...

예를 들어 다음과 같은 예외가 발생
@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) 

답변

8

조금 더러운이며이 지금과 같은 해킹을 사용하지 것이다 많은 개발자들이 있지만이 문제를 해결할 방법은 하나입니다 일하는 다른 것을 찾지 못한다. 만약 누군가가 다른 해결책을 가지고 있다면, 나는 그것을보기를 고대하고 있습니다 :).

+0

고마워요 ... 나는 그것을 시도해 볼 것입니다 ... 더러워 보이지만 약속 : :) –

+0

beginCall()은 기본을 잘 ... 잘했습니다. 이제는 구성 요소가 작동하도록 다른 사전 조건을 해결해야합니다. 감사! –

+3

한 번 더 힌트 ... beginCall()은 트랜잭션을 시작하지 않고 모든 EntityManager 작업이 자동으로 실패합니다. beginCall() 및 endCall()을 사용하는 경우에도 트랜잭션을 처리해야합니다. Transaction.instance(). begin() 및 Transaction.instance(). commit()을 사용하여 실제로 뭔가를 수행 할 수 있습니다. –

1

당신이 구성 요소에 대해 어떤 범위 정의를? 아마도 응용 프로그램 컨텍스트 에서처럼 오류가 발생했습니다.

는 ... 그래서 소스 주위를 찌르고 상황이 Contexts라는 이름의 클래스에 저장되어있는 것을 발견했다. 모든 컨텍스트는 ThreadLocal-instances에 캡슐화되어 있기 때문에 스레드 특정 것 같습니다. 즉, 시간 서비스의 스레드에 대해 지정해야합니다 ...

특정 스레드에 대한 컨텍스트를 만드는 방법은 무엇입니까?

+0

내가 사용하고 싶은 것은 SESSION Scope이 정의되어 있습니다 ... 도움이된다면 CONVERSATION으로 전환 할 수 있습니다. –

1

정적 호출을 사용하지 않고 loader 인스턴스를 삽입 할 수 있습니까? 꽤 심에 대해 잘 알고 있지만, 아마도 (클래스 본문에서) 아니에요 :

@In private MyInterface loader; 

다음, 당신의 방법에 그냥 loader를 사용합니다. 보인다으로

, Seam은 적절한 귀하의 경우 하나 보인다, 응용 프로그램/statelesss 범위가 있습니다

@Scope(ScopeType.APPLICATION) 

또는

@Scope(ScopeType.STATELESS) 

그 중 하나를 시도 - 클래스 아무튼 이후 ' 세션/요청에서 어떤 정보가 필요해 보인다고해서 웹 관련 범위를 사용하지 않는 것이 더 적절합니다.

위의 범위 중 하나에 MyServiceMyInterface을 정의하고 주입 및 조회 방법을 모두 시도하십시오. 컨텍스트 및 동시성에

확인 Seam tutorial

This thread 도움이 보인다.

And from this thread 당신이 사용할 수있는 @Asynchronous 주석이있는 것 같습니다. 내가 하나 개의 프로젝트에서 그것을 사용했다

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(); 
    } 
} 

내가 나오지 않았어 :

+0

아니, 할 수 없다.주입은 위에서 설명한대로 구성 요소에 액세스하는 것과 같은 문제가 있습니다. 컨텍스트가 누락되었습니다. 주입은 특정 유형에서만 작동하며 일반적으로 요청/응답 수명주기 동안 수행됩니다. –

+0

주사는 범위에 따라 작동합니다. 요청/응답 수명주기는 converstation/session/request 범위에 관한 것입니다. 다른 것들도 있습니다. – Bozho

+0

그러나 JBoss 서비스는 injection inspector가 건드리지 않았습니다 ... 서버가 시작될 때 초기화됩니다. 이 문제를 해결할 수 있습니까? - 아 ... 편집을 인식했습니다 ... 시도해 보겠습니다. –

관련 문제