2010-01-15 2 views
5

Я начал писать новую службу JBoss, предназначенную для использования некоторых существующих компонентов шва. Но, похоже, я не могу получить доступ к этим компонентам из-за несуществующих контекстов. Можно ли использовать их иначе, чем в типичной ситуации с JSF?Можно ли использовать Seam в сервисе JBoss?

Небольшой фрагмент кода, чтобы продемонстрировать то, что я хочу сделать ...

@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

Существует один способ, который немного грязный и есть много разработчиков, которые не будут использовать такой хак когда-либо, но это будет решить вашу проблему:

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

The beginCall() сделал основы ... ну. Теперь я должен решить некоторые другие предпосылки, чтобы заставить мои компоненты работать. Благодаря! –

+3

Еще один намек здесь ... beginCall() не запускает транзакцию, и все операции EntityManager терпят неудачу. Если вы используете beginCall() und endCall(), необходимо обрабатывать транзакцию тоже! Используя Transaction.instance(). Begin() и Transaction.instance(). Commit() Я мог бы заставить его реально сделать что-то реальное. –

1

Какие возможности вы определенный для компонента? Вероятно, контекст приложения, поскольку он говорит об этом в ошибке.

...

Так что я тыкал вокруг источника и обнаружил, что контексты хранятся в классе с именем Contexts. Все контексты кажутся специфичными для потоков, поскольку они заключены в ThreadLocal-instances. Это означает, что он должен быть указан для потока службы времени ...

Вопрос остается открытым: как создать контекст для определенного потока.

+0

Тот, который я хочу использовать, имеет SESSION Scope, определенный ... Я могу переключиться на CONVERSATION, если это поможет. –

1

Не можете ли вы ввести экземпляр loader вместо того, чтобы найти его с помощью этого статического вызова? Я не совсем знаком с пластами, но возможно (в теле класса):

@In private MyInterface loader; 

, а затем, в методе, просто используйте loader.

Как представляется, Шов имеет применение/statelesss областей, которые, кажется, соответствующий один в вашем случае:

@Scope(ScopeType.APPLICATION) 

или

@Scope(ScopeType.STATELESS) 

Попробуйте один из тех, - так как ваш класс Безразлично» Кажется, что нужна информация из сеанса/запроса, более уместно не использовать веб-область.

Определите MyService и MyInterface в одной из указанных областей и попробуйте как инъекцию, так и метод поиска.

Проверьте Seam tutorial на контексты и параллельности

This thread кажется полезным.

And from this thread кажется, что есть @Asynchronous аннотация, которую вы можете использовать.

+0

Нет, не могу.Инъекция имеет ту же проблему, что и при попытке доступа к компоненту, как описано выше ... контекст отсутствует. Инъекция работает только в определенных типах и обычно выполняется в течение жизненного цикла запроса/ответа. –

+0

закачки в зависимости от объема. жизненный цикл запроса/ответа относится к областям конверсии/сеанса/запроса. Есть и другие. – Bozho

+0

Но служба JBoss не тронута инспектором инжекции ... она инициализируется во время запуска сервера. Можно ли это решить? - ах ... только что узнал ваше редактирование ... попробует. –

Смежные вопросы