Message filters must implement both the MessageSource and the MessageSink interface. A message filter typically implements receiveMessage by manipulating the message in some way, then sending a new message, like this:

import atg.dms.patchbay.*;
import javax.jms.*;

...

MessageSourceContext mContext;
boolean mStarted = false;

// These methods implement the MessageSource interface
public void setMessageSourceContext (MessageSourceContext pContext)
{ mContext = pContext; }
public void startMessageSource ()
{ mStarted = true; }
public void stopMessageSource ()
{ mStarted = false; }

public void receiveMessage (String pPortName, Message pMessage)
  throws JMSException
{
  if (pMessage instanceof TextMessage) {
    String text = ((TextMessage).getText ());
    String newText = text.replace ('.', '/');
    TextMessage msg = mContext.createTextMessage ();
    msg.setJMSType (pMessage.getJMSType ());
    msg.setText (newText);
    mContext.sendMessage (msg);
  }
}

This filter takes in TextMessages, then sends them out again with period (.) replaced by forward slash (/) in the text. Notice that the mStarted flag is not consulted, because a message filter is allowed to send out messages in response to incoming messages regardless of whether it has been started or stopped.