Я создаю чат Comet для своего приложения, и когда я получаю сообщение от другого пользователя, я использую:
if(new_message){
if(!document.hasFocus()){
audio.play();
document.title="Have new messages";
}
else{
audio.stop();
document.title="Application Name";
}
}
Проблема в том, что с MyTask в качестве EJB-компонента, реализующего Callable , вы удалили сам класс MyTask из «типа бина» этого бина Это означает, что он не может быть введен в «112» «клиента», согласно правилам в спецификации CDI 2.0 :
18.2.2. Типы компонентов сессионного компонента
Неограниченный набор типов компонентов для сессионного компонента содержит все локальные интерфейсы компонента и их суперинтерфейсы. Если сессионный компонент имеет представление без интерфейса, неограниченный набор типов компонентов содержит класс компонента и все суперклассы. Кроме того, java.lang.Object является типом компонента каждого сессионного компонента.
blockquote>Вот почему Weld не находит действительный bean-компонент MyTask , чтобы удовлетворить внедрение в ваш клиент TestBean .
Вы можете дать MyTask EJB представление без интерфейса, добавив аннотацию
@LocalBean
, например:@Stateless @LocalBean public class MyTask implements Callable<String> {
Или вы можете удалить
implements Callable
и рефакторинг например:public class MyTask { @Inject MyBean myBean; MyCallable callable = new MyCallable(); public Callable getCallable() { return callable; } private class MyCallable implements Callable<String> { @Override public String call() throws Exception { System.out.println("MyTask called"); myBean.print(); return "Task called"; } } } public class TestBean { // ... MyTask task = myTaskInstance.get(); tasks.add(task.getCallable()) // ... }
См. здесь для быстрого ознакомления с представлением без интерфейса, а также этот пост для дальнейшего обсуждения.