Проблемы с внедрением BayeuxService в другой класс с аннотациями - PullRequest
0 голосов
/ 08 июля 2011

У меня есть веб-приложение, которое использует Bayeux для обработки соединений Comet. Я инициализирую BayeuxServer и привязываю его к аннотациям Spring, и все это отлично работает, слушая выбранные каналы и отвечая.

У меня есть аннотированный класс в Джерси и аннотированный сервис Байе, как показано ниже. Идея заключается в том, что я хотел иметь возможность управлять ресурсами через Rest из отдельного веб-приложения, а затем сразу после изменения ресурса выполнить передачу через сервер Comet всем остальным применимым клиентам, чтобы сообщить им обновить свою информацию.

Вот проблема: служба Bayeux создается при развертывании веб-приложения, настраивая надлежащие каналы для прослушивания и мониторинга клиентов. Там должен быть только один случай этого. Когда Джерси пытается использовать сервис Bayeux, он создает совершенно новый сервис, когда он должен использовать оригинальный. Эта новая служба не имеет BayeuxServer должным образом внедрены, поэтому я не могу получить доступ к информации о клиенте через него.

С тех пор это должно быть выполнимо, но я не понимаю, как правильно вводить эти вещи с помощью аннотаций. Кто-нибудь может указать мне правильное направление?

Джерси Аннотированный Класс:

@Path("JsonTest")
public class JsonTest {

@Context
Request request;
@Context
UriInfo uriInfo;

@Context
ResourceContext resourceContext;

protected final Logger log = Logger.getLogger(getClass());

public JsonTest() {

}

@DELETE
@Path("{id}")
public void deleteJson(@PathParam("id") String id) {
    JsonTestDao.instance.getModel().remove(id);
    log.info("Deleted Json..." + id);
    log.info("New json: " + JsonTestDao.instance.getModel().toString());


    JsonTestService jsonTestService = resourceContext.getResource(JsonTestService.class);
    jsonTestService.sendUpdate();
}
}

BayeuxService:

@Named
// Singleton here didn't seem to make a difference
@Service
public class JsonTestService {

protected final Logger log = Logger.getLogger(getClass());

@Inject
private BayeuxServer bayeux;
@Session
private ServerSession serverSession;

@PostConstruct
public void init() {
    log.info("Initializing JsonTest Bayeux HelloService...");
    log.info("Current sessions are: " + bayeux.getSessions().toString());
}

@Listener("/cometd/JsonTest")
public void jsonTestHandler(ServerSession remote, ServerMessage.Mutable message) {

}

public void sendUpdate() {
    //bayeux.newMessage(); // Need a method that the Jersey class can call to notify changes
    log.info("Bayeux server should be sending an update now...");
}

@PreDestroy
public void destroy() {
    log.info("Destroying JsonTest Bayeux HelloService...");
}

}

1 Ответ

0 голосов
/ 13 июля 2011

См. Интеграция трикотажа и пружины - Инъекции бобов равны нулю во время выполнения .

Еще один вопрос, который я задал. Оба они вытекают из одной и той же проблемы, связанной с правильной установкой зависимости Джерси и ее интеграцией с пружиной.

...