@Override
public Listener listen(final MessageHandler handler, Codecs codecs, Map<ListenOption, Object> options) throws Exception {
Options<ListenOption> opts = new Options<>(options);
Context givenContext = (Context)opts.get(ListenOption.CONTEXT);
if (givenContext != null &&
!givenContext.isRemote()) {
throw new IllegalArgumentException("Listening only accepts a remote context.");
}
MessageHandler wrappedHandler = new MessageHandler() {
@Override
public Reply onMessage(Message msg, Context ctx) throws Exception {
((JMSSpecificContext)ctx).setLatestMessage((JMSMessage)msg);
return handler.onMessage(msg, ctx);
}
};
final JMSSpecificContext context = context(givenContext);
Listener listener = new JMSMessageHandlerGroup(context,
wrappedHandler,
codecs,
this,
opts).start();
if (givenContext != null) {
givenContext.addCloseable(listener);
}
this.broker.addCloseableForDestination(this, listener);
this.broker.addCloseable(listener);
return listener;
}