私は、Bayeuxを使ってComet接続を処理するWebアプリケーションを持っています。私はBayeuxServerを初期化し、それをSpringの注釈に結びつけ、すべてうまく動作し、選択されたチャンネルでリッスンし、応答します。注釈付きの別のクラスにBayeuxServiceを注入する際の問題
私は、以下に示すように、ジャージ注釈クラスと注釈付きBayeuxサービスを持っています。アイデアは、個々のWebアプリケーションからRestを介してリソースを制御できるようにし、リソースが変更された直後にCometを介して他のすべての適用可能なクライアントにサーバープッシュを行い、情報を更新するように指示したいということです。
問題は次のとおりです。Webアプリケーションの展開時にBayeuxサービスが作成され、リッスンしてクライアントを監視する適切なチャネルが設定されます。これのインスタンスは1つだけあります。 Jerseyが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...");
}
}