xmlBlaster 2.2.0 API

Class DropIfNotDeliverableUniqueOnly

  extended by org.xmlBlaster.contrib.mime.DropIfNotDeliverableUniqueOnly
All Implemented Interfaces:
I_AccessFilter, I_ConnectionStatusListener, I_Plugin

public class DropIfNotDeliverableUniqueOnly
extends java.lang.Object
implements I_Plugin, I_AccessFilter, I_ConnectionStatusListener

Sometimes we need to support this subscribe pattern: A client only wants the newest message with this details:

 - Initial connect and subscribe: send current newest (or given history depth)
 - If it is online it is a normal subscription
 - If it is offline don't add messages to callback queue
 - If it comes online again check if current message was delivered,
   if not send it initially (if redeliverNewestOnReconnect==false which is default; else on reconnect the newest is always send. Note: You can't use both variants simultaneously as it operates on the session Map)

If a client callback goes to polling, this plugin removes all existing subscriptions. The client needs to add a filter Qos to its SubscribeQos to activate the plugin.
and needs to re-subscribe on relogin if desired.

The message uniqueness is checked per topic, but if you pass a client property "_uniqueGroupId" this is used to check uniqueness: Messages with the same "_uniqueGroupId" value are compared to decide if delivered already. This is like a sub-group of the topic and is for your convenience only as it could be solved by having a separate topic for each "_uniqueGroupId".

This makes only sense if the client is operating in fail save mode (-dispatch/callback/retries -1) and reconnects with the same publicSessionId > 0 (-session.name jack/session/1) so that its session is found again.

Configuration example (put to xmlBlaster.properties):

dropper.types=* is default and activates the plugin for any published message where a subscriber has set this filter,
dropper.types=text/xml;application/xml would for example limit the plugin to such messages having his mime type declared on publish

A typical subscribeQos is for example:

   <filter type='DropIfNotDeliverableUniqueOnly'>

The query statement '_' is ignored by this plugin.

This plugin is a singleton and loaded once only for multiple subscribers configuring it

Example to try on command line

  export CLASSPATH=$XMLBLASTER_HOME/lib/xmlBlaster.jar
  Start the server:
    java org.xmlBlaster.Main
  Start a sniffer GUI to see what happens:
    cd ~/xmlBlaster
    build SimpleReader
  Start the subscriber which wants the newest and unique message only:
    java javaclients.HelloWorldSubscribe -session.name subscriber/session/1 -disconnect false -multiSubscribe false -initialUpdate true -unSubscribe false -dispatch/callback/retries -1 -filter.type DropIfNotDeliverableUniqueOnly -filter.query _
    (Avoid disconnect as it cleans up the session)
    (example to get first ten of history: -historyNumUpdates 10 -historyNewestFirst false)
  Start the publisher for two groupIds:
    java javaclients.HelloWorldPublish -clientProperty[_uniqueGroupId] weather.south

Marcel Ruff
See Also:
The mime.plugin.accessfilter requirement

Field Summary
private  Global glob
private static java.util.logging.Logger log
private  java.lang.String ME
static java.lang.String MIME_TYPES
private  java.lang.String[] mimeTypes
private  PluginInfo pluginInfo
private  boolean redeliverNewestOnReconnect
private  java.lang.String uniqueGroupIdKeyName
Constructor Summary
Method Summary
 java.lang.String[] getMimeExtended()
          Get the content MIME version number for which this plugin applies
 java.lang.String[] getMimeTypes()
          Get the content MIME type for which this plugin applies, currently { "*" }.
 java.lang.String getName()
          Get a human readable name of this filter implementation
 java.lang.String getType()
          Return plugin type for Plugin loader
 java.lang.String getVersion()
          Return plugin version for Plugin loader
 void init(Global glob, PluginInfo pluginInfo)
          This method is called by the PluginManager (enforced by I_Plugin).
 void initialize(ServerScope serverScope)
          This is called after instantiation of the plugin
 boolean match(SessionInfo receiver, MsgUnit msgUnit, Query query)
          Check if the filter rule matches for this message.
 void shutdown()
          Cleans up the resource.
 void toAlive(I_DispatchManager dispatchManager, ConnectionStateEnum oldState)
 void toAliveSync(I_DispatchManager dispatchManager, ConnectionStateEnum oldState)
 void toDead(I_DispatchManager dispatchManager, ConnectionStateEnum oldState, XmlBlasterException xmlBlasterException)
 void toPolling(I_DispatchManager dispatchManager, ConnectionStateEnum oldState)
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait

Field Detail


private final java.lang.String ME
See Also:
Constant Field Values


private Global glob


private static java.util.logging.Logger log


private java.lang.String[] mimeTypes


private PluginInfo pluginInfo


public static final java.lang.String MIME_TYPES
See Also:
Constant Field Values


private java.lang.String uniqueGroupIdKeyName


private boolean redeliverNewestOnReconnect
Constructor Detail


public DropIfNotDeliverableUniqueOnly()
Method Detail


public void initialize(ServerScope serverScope)
This is called after instantiation of the plugin

Specified by:
initialize in interface I_AccessFilter
glob - The Global handle of this xmlBlaster server instance.


public void init(Global glob,
                 PluginInfo pluginInfo)
          throws XmlBlasterException
This method is called by the PluginManager (enforced by I_Plugin).

Specified by:
init in interface I_Plugin
See Also:


public java.lang.String getType()
Return plugin type for Plugin loader

Specified by:
getType in interface I_Plugin


public java.lang.String getVersion()
Return plugin version for Plugin loader

Specified by:
getVersion in interface I_Plugin


public java.lang.String getName()
Get a human readable name of this filter implementation

Specified by:
getName in interface I_AccessFilter


public java.lang.String[] getMimeTypes()
Get the content MIME type for which this plugin applies, currently { "*" }. Is configurable with dropper.types=text/xml;image/svg+xml;application/xml

Specified by:
getMimeTypes in interface I_AccessFilter
{ "*" } This plugin handles all mime types


public java.lang.String[] getMimeExtended()
Get the content MIME version number for which this plugin applies

Specified by:
getMimeExtended in interface I_AccessFilter
"1.0" (this is the default version number)


public boolean match(SessionInfo receiver,
                     MsgUnit msgUnit,
                     Query query)
              throws XmlBlasterException
Description copied from interface: I_AccessFilter
Check if the filter rule matches for this message.

Note that you are not allowed to manipulate the content or XmlKey or QoS of a message with your plugin as this would affect all other subscribers (you are working on a reference to the original message). You can find out the publisher name like msgUnit.getQosData().getSender()

Specified by:
match in interface I_AccessFilter
receiver - The session object describing the receiver, is never null.
msgUnit - The message to check, is never null.
query - The query containing the filter rule on subscribe/get usually the client defines his own rule which is passed here.
null: If for a subscribe() or get() no rule is given, your plugin needs to have its own general rule or react how it likes.
Access the raw query string with query.getQuery(), you can parse it and store the prepared query with query.setPreparedQuery() - query.getPreparedQuery() to increase performance.
true If the filter matches this message, else false
XmlBlasterException - Is thrown on problems, for example if the MIME type does not fit to message content.
Take care throwing an exception, the message is not updated and an error is logged and the message is sent as dead letter. (see TopicHandler.java:1032). It is best to return 'false' instead and handle the situation yourself.


public void shutdown()
Description copied from interface: I_Plugin
Cleans up the resource.

Specified by:
shutdown in interface I_AccessFilter
Specified by:
shutdown in interface I_Plugin


public void toAlive(I_DispatchManager dispatchManager,
                    ConnectionStateEnum oldState)
Specified by:
toAlive in interface I_ConnectionStatusListener


public void toAliveSync(I_DispatchManager dispatchManager,
                        ConnectionStateEnum oldState)
Specified by:
toAliveSync in interface I_ConnectionStatusListener


public void toDead(I_DispatchManager dispatchManager,
                   ConnectionStateEnum oldState,
                   XmlBlasterException xmlBlasterException)
Specified by:
toDead in interface I_ConnectionStatusListener
xmlBlasterException - Can be null


public void toPolling(I_DispatchManager dispatchManager,
                      ConnectionStateEnum oldState)
Specified by:
toPolling in interface I_ConnectionStatusListener

xmlBlaster 2.2.0 API

Copyright © 1999-2014 The xmlBlaster.org contributers.