RF 4.2.2 Final custom topicListener not work.(Again this question)
yyq2009 May 24, 2012 5:25 AMI asked the question several months ago, but no one replied. The link: https://community.jboss.org/message/642052#642052
I use it like following lines:
TopicsContext topicsContext = TopicsContext.lookup(); Topic topic = topicsContext.getOrCreateTopic(new TopicKey("test")); topic.setMessageDataSerializer(DefaultMessageDataSerializer.instance()); topic.addTopicListener(new SessionTopicListener2() { @Override public void processPreSubscriptionEvent(SessionPreSubscriptionEvent event) throws SubscriptionFailureException { //TODO } @Override public void processSubscriptionEvent(SessionSubscriptionEvent event) { //TODO } @Override public void processUnsubscriptionEvent(SessionUnsubscriptionEvent event) { //TODO } });
I noted that listeners in TopicImpl are all the SessionTopicListener2 type, because add method is:
public void addTopicListener(TopicListener topicListener) { TopicListener listener = topicListener; if (listener instanceof SessionTopicListener) { listener = new SessionTopicListenerWrapper((SessionTopicListener) listener); } listeners.add(listener); }
All SessionTopicListeners are wrapped to type SessionTopicListener2, and when event publish in TopicImpl, it check it if it is appropriate listener like this:
public void publishEvent(TopicEvent event) { for (TopicListener listener : listeners) { if (event.isAppropriateListener(listener)) { try { event.invokeListener(listener); } catch (Exception e) { logError(e); } } } }
But event type SessionPreSubscriptionEvent, SessionSubscriptionEvent or SessionUnsubscriptionEvent does not override the mothed isAppropriateListener, so when checking, it use the method of its parent SessionTopicEvent, its parent method is like this:
@Override public boolean isAppropriateListener(EventListener listener) { return (listener instanceof SessionTopicListener); }
Then it always returns false for above three SessionTopicEvent , and the custom listeners will never be called. I think it may be changed from " return (listener instanceof SessionTopicListener);" to return (listener instanceof SessionTopicListener2); or override it in seperator implement of type SessionTopicEvent .