Проблемы с внедрением BayeuxService в другой класс с аннотациями

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

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

Вот проблема: служба 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();
}
}

БайёСервис:

@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...");
}

}

person zclark    schedule 08.07.2011    source источник


Ответы (1)