2015-12-03 2 views
2

Я занимаюсь разработкой службы с использованием WebSphere Liberty (wlp) и JAX-RS. Я хочу запустить несколько планировщиков в своей службе, чтобы периодически выполнять разные задачи. Я установил параллельную-1.0 функцию и определить экземплярКак создать несколько ресурсов ManagedScheduledExecutorService в Jaxrs

@Resource(name ="DefaultManagedScheduledExecutorService") 
private ManagedScheduledExecutorService myScheduler; 

в моей инициализации класса, который реализует ServletContextListener

Как я могу создать еще несколько экземпляров в некоторых других классах?

я могу найти указатели для ManagedExecutorService как: http://www.adam-bien.com/roller/abien/entry/injecting_an_executorservice_with_java
Я попробовал то же самое с ManagedScheduledExecutorService, но это не сработало.

Но я не могу получить много информации для ManagedScheduledExecutorService ресурса.

Просьба указать любые ссылки или указатели, которые могут быть полезны здесь.

+1

В спецификации JAX-RS впрыск по умолчанию не включен в JAX-RS c дивчины. См. Мой ответ здесь для получения дополнительной информации: http://stackoverflow.com/a/31789566/142446 –

ответ

2

Пример внедрения, который вы используете в настоящее время, используется по умолчанию ManagedScheduledExecutorService, который доступен после включения функции concurrent-1.0.

Чтобы настроить дополнительные ManagedScheduledExecutorService, вы можете просто определить больше в вашей конфигурации server.xml как это:

<managedScheduledExecutorService jndiName="concurrent/exec1"/> 
<managedScheduledExecutorService jndiName="concurrent/exec2"/> 
<managedScheduledExecutorService jndiName="concurrent/exec3"/> 

Однако, нет действительно никакой причины, вы должны нуждаться в дополнительных ManagedScheduledExecutorService, если только они не собираются иметь различный контекст сервисные конфигурации, применяемые для различных задач. Например:

<managedScheduledExecutorService jndiName="concurrent/classloaderExec"> 
    <contextService> 
     <classloaderContext/> 
    </contextService> 
</managedScheduledExecutorService> 

<managedScheduledExecutorService jndiName="concurrent/jeeMetadataExec"> 
    <contextService> 
     <jeeMetadataContext/> 
    </contextService> 
</managedScheduledExecutorService> 

Если вы просто хотите планировать различные задачи, скажем myHourlyTask и myDailyTask, вы можете сделать это с той же ManagedScheduledExecutorService ресурса:

myScheduler.scheduleAtFixedRate(myHourlyTask, 0, 1, TimeUnit.HOURS); 
myScheduler.scheduleAtFixedRate(myDailyTask, 0, 1, TimeUnit.DAYS); 

Чтобы объявить и использовать экземпляр ресурса ManagedScheduledExecutorService по умолчанию в любом неосновном классе:

/** The scheduler. */ 
private ManagedScheduledExecutorService monkeyScheduler; 
try { 
     monkeyScheduler = (ManagedScheduledExecutorService) 
       new InitialContext().lookup("java:comp/DefaultManagedScheduledExecutorService"); 
    } catch (NamingException e) { 
     e.printStackTrace(); 
    } 
+0

Отлично! Спасибо @aguibert за очень хорошее объяснение. Таким образом, один ресурс сможет решить проблему. Но можете ли вы рассказать мне, как этот ресурс может быть объявлен в любом другом классе, кроме класса init, который реализует ServletContextListener. Кроме того, если он объявлен там, как он будет ссылаться в других классах, не делая его статическим. –

+0

@ devesh-ahuja вы можете получить экземпляр в любом компоненте, управляемом свободой (сервлет, ejb и т. Д.). Просто выполните поиск (через 'new InitialContext(). Lookup (« concurrent/myExec »)» или добавьте его с помощью аннотации '@ Resource', как было показано в начальном вопросе –

+0

Спасибо, я использовал' new InitialContext(). Lookup («java: comp/DefaultManagedScheduledExecutorService»), и это сработало для меня, но я получал «NullPointerException», когда я пытался получить его с помощью аннотации '@ Resource'. Любая другая вещь, связанная с этим? Я читал о' @ Stateless' аннотацию где-то, если это будет использоваться –

1

Проверьте эту страницу Configuring managed scheduled executors, чтобы узнать, как настроить управляемый исполнитель.

Вы должны иметь возможность использовать одного исполнителя, просто вызовите несколько методов executor.schedule* для выполнения различных задач.

+0

Спасибо @Gas за ссылку ссылки. Он рассказывает о настройке ресурса в 'web.xml', используя функцию jndi. Но, как отметил @aguibert, я использую по умолчанию значение 'DefaultManagedScheduledExecutorService', его невозможно найти с помощью jndi. Я попытался как '(ManagedScheduledExecutorService) новый InitialContext() поиск ("DefaultManagedScheduledExecutorService");' и '(ManagedScheduledExecutorService) новый InitialContext() подстановок ("Java: комп/ENV/одновременно/DefaultManagedScheduledExecutorService")..; 'но он дает' javax.naming.NameNotFoundException: ' –

+0

@ devesh-ahuja вы можете найти его по имени, определенному спецификацией Java EE7, которая является' java: comp/DefaultManagedScheduledExecutorService'. –

+0

@aguibert Спасибо, этот поиск работает! –

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