Package tigase.server
Class MessageRouter
- java.lang.Object
-
- tigase.server.BasicComponent
-
- tigase.server.AbstractMessageReceiver
-
- tigase.server.MessageRouter
-
- All Implemented Interfaces:
ClusteredComponentIfc
,Configurable
,XMPPService
,ConfigurationChangedAware
,Initializable
,RegistrarBean
,UnregisterAware
,MessageReceiver
,MessageRouterIfc
,PacketWriterWithTimeout
,ServerComponent
,StatisticsContainer
,StatisticsContainerIfc
,VHostListener
@Bean(name="message-router", parent=Kernel.class, active=true) public class MessageRouter extends AbstractMessageReceiver implements MessageRouterIfc, RegistrarBean, UnregisterAware
Class MessageRouter
Created: Tue Nov 22 07:07:11 2005- Author:
- Artur Hefczyc
-
-
Nested Class Summary
-
Nested classes/interfaces inherited from class tigase.server.BasicComponent
BasicComponent.ServerInfoVHostItemExtension
-
Nested classes/interfaces inherited from interface tigase.server.PacketWriterWithTimeout
PacketWriterWithTimeout.Handler
-
-
Field Summary
-
Fields inherited from class tigase.server.AbstractMessageReceiver
HOUR, INCOMING_FILTERS_PROP_KEY, INCOMING_FILTERS_PROP_VAL, MAX_QUEUE_SIZE_PROP_KEY, MAX_QUEUE_SIZE_PROP_VAL, maxInQueueSize, maxOutQueueSize, maxQueueSize, MINUTE, OUTGOING_FILTERS_PROP_KEY, OUTGOING_FILTERS_PROP_VAL, PACKET_DELIVERY_RETRY_COUNT_PROP_KEY, SCHEDULER_THREADS_PROP_KEY, SECOND
-
Fields inherited from class tigase.server.BasicComponent
admins, ALL_PROP_KEY, COMMAND_PROP_NODE, scriptCommands, scriptEngineManager, SCRIPTS_DIR_PROP_DEF, SCRIPTS_DIR_PROP_KEY, trusted, vHostManager
-
Fields inherited from interface tigase.conf.Configurable
ADMINS_PROP_KEY, AMP_CLASS_NAME, AMP_CLUST_CLASS_NAME, AUTH_DOMAIN_POOL_CLASS, AUTH_REPO_DOMAINS_PROP_KEY, AUTH_REPO_PARAMS_NODE, AUTH_REPO_POOL_CLASS, AUTH_REPO_URL_PROP_KEY, BOSH_CLUST_COMP_CLASS_NAME, BOSH_COMP_CLASS_NAME, C2S_CLUST_COMP_CLASS_NAME, C2S_COMP_CLASS_NAME, CL_COMP_CLASS_NAME, CLUSTER_CONECT, CLUSTER_CONTR_CLASS_NAME, CLUSTER_LISTEN, CLUSTER_MODE, CLUSTER_NODES, CLUSTER_NODES_PROP_KEY, COMP_PROT_CLASS_NAME, COMPONENT_ID_PROP_KEY, DEF_AMP_NAME, DEF_BOSH_NAME, DEF_C2S_NAME, DEF_CL_COMP_NAME, DEF_CLUST_CONTR_NAME, DEF_COMP_PROT_NAME, DEF_EVENTBUS_NAME, DEF_EXT_COMP_NAME, DEF_HOSTNAME_PROP_KEY, DEF_MONITOR_NAME, DEF_S2S_NAME, DEF_SM_NAME, DEF_STATS_NAME, DEF_VHOST_MAN_NAME, DEF_WS2S_NAME, DERBY_REPO_CLASS_PROP_VAL, DERBY_REPO_URL_PROP_VAL, DRUPAL_REPO_URL_PROP_VAL, DRUPALWP_REPO_CLASS_PROP_VAL, DUMMY_REPO_CLASS_PROP_VAL, EVENTBUS_CLASS_NAME, EXT_COMP_CLASS_NAME, GEN_ADMINS, GEN_AUTH_DB, GEN_AUTH_DB_URI, GEN_COMP_CLASS, GEN_COMP_NAME, GEN_CONF, GEN_CONFIG, GEN_CONFIG_ALL, GEN_CONFIG_COMP, GEN_CONFIG_CS, GEN_CONFIG_DEF, GEN_CONFIG_SM, GEN_DEBUG, GEN_DEBUG_PACKAGES, GEN_EXT_COMP, GEN_MAX_QUEUE_SIZE, GEN_SCRIPT_DIR, GEN_SM_PLUGINS, GEN_SREC_ADMINS, GEN_SREC_DB, GEN_SREC_DB_URI, GEN_TEST, GEN_TRUSTED, GEN_USER_DB, GEN_USER_DB_URI, GEN_USER_DB_URI_PROP_KEY, GEN_VIRT_HOSTS, HOSTNAMES_PROP_KEY, LIBRESOURCE_REPO_CLASS_PROP_VAL, LIBRESOURCE_REPO_URL_PROP_VAL, MONITOR_CLASS_NAME, MONITOR_CLUST_CLASS_NAME, MONITORING, MYSQL_REPO_CLASS_PROP_VAL, MYSQL_REPO_URL_PROP_VAL, PGSQL_REPO_CLASS_PROP_VAL, PGSQL_REPO_URL_PROP_VAL, ROUTER_COMP_CLASS_NAME, S2S_CLUST_COMP_CLASS_NAME, S2S_COMP_CLASS_NAME, SHARED_AUTH_REPO_PARAMS_PROP_KEY, SHARED_AUTH_REPO_PROP_KEY, SHARED_USER_REPO_PARAMS_PROP_KEY, SHARED_USER_REPO_PROP_KEY, SM_CLUST_COMP_CLASS_NAME, SM_COMP_CLASS_NAME, STANZA_WHITE_CHAR_ACK, STANZA_XMPP_ACK, STATS_CLASS_NAME, STRINGPREP_PROCESSOR, TIGASE_AUTH_REPO_CLASS_PROP_VAL, TIGASE_AUTH_REPO_URL_PROP_VAL, TIGASE_CUSTOM_AUTH_REPO_CLASS_PROP_VAL, TRUSTED_PROP_KEY, USER_DOMAIN_POOL_CLASS, USER_REPO_DOMAINS_PROP_KEY, USER_REPO_PARAMS_NODE, USER_REPO_POOL_CLASS, USER_REPO_POOL_SIZE, USER_REPO_POOL_SIZE_PROP_KEY, USER_REPO_URL_PROP_KEY, VHOST_MAN_CLASS_NAME, VHOST_MAN_CLUST_CLASS_NAME, WS2S_CLASS_NAME, WS2S_CLUST_CLASS_NAME, XML_REPO_CLASS_PROP_VAL, XML_REPO_URL_PROP_VAL, XMPP_STANZA_ACK
-
Fields inherited from interface tigase.disco.XMPPService
CMD_FEATURES, DEF_FEATURES, INFO_XMLNS, ITEMS_XMLNS
-
-
Constructor Summary
Constructors Constructor Description MessageRouter()
-
Method Summary
All Methods Instance Methods Concrete Methods Modifier and Type Method Description void
addComponent(ServerComponent component)
void
addRegistrator(ComponentRegistrator registr)
void
addRouter(MessageReceiver receiver)
void
beanConfigurationChanged(java.util.Collection<java.lang.String> changedFields)
Method called when configuration was applied to bean.void
beforeUnregister()
Method called before bean unregister.java.util.Set<ServerComponent>
getComponentsAll()
java.lang.String
getDiscoCategoryType()
Method returns component category type used for service discovery responses.java.lang.String
getDiscoDescription()
Method returns description used for service discovery responses.Element
getDiscoInfo(JID toJid, JID fromJid, java.lang.String node)
protected java.lang.Integer
getMaxQueueSize(int def)
java.util.Optional<Element>
getServiceEntityCaps(JID fromJid)
void
getStatistics(StatisticsList list)
Method returns component statistics.int
hashCodeForPacket(Packet packet)
This method decides how incoming packets are distributed among processing threads.void
initBindings(javax.script.Bindings binds)
Initialize a mapping of key/value pairs which can be used in scripts loaded by the servervoid
initialize()
Method will be called, when bean will be created, configured and ready to use.int
processingInThreads()
Concurrency control method.int
processingOutThreads()
Concurrency control method.void
processPacket(Packet packet)
This is the mainPacket
processing method.void
processPacketMR(Packet packet, java.util.Queue<Packet> results)
void
register(Kernel kernel)
Method called when bean is being registered allowing developer to programatically register other beans.protected void
reloadScripts()
void
removeComponent(ServerComponent component)
void
removeRegistrator(ComponentRegistrator registr)
void
removeRouter(MessageReceiver receiver)
void
setComponentsAll(java.util.Set<ServerComponent> components)
void
setConfig(ConfiguratorAbstract config)
void
start()
void
stop()
void
unregister(Kernel kernel)
Method called while bean is being unregistered.-
Methods inherited from class tigase.server.AbstractMessageReceiver
addOutPacket, addOutPacketNB, addOutPackets, addOutPacketWithTimeout, addOutPacketWithTimeout, addPacket, addPacketNB, addPackets, addRegexRouting, addTimerTask, addTimerTask, addTimerTask, addTimerTaskWithTimeout, addTimerTaskWithTimeout, clearRegexRoutings, everyHour, everyMinute, everySecond, getRegexRoutings, getResourceForPacketWithTimeout, isInRegexRoutings, newPacketId, processOutPacket, processPacket, release, removeRegexRouting, schedulerThreads, setCompId, setIncoming_filters, setName, setOutgoing_filters, setParent, setSchedulerThreads_size, updateFiltersName
-
Methods inherited from class tigase.server.BasicComponent
addComponentDomain, canCallCommand, canCallCommand, checkCommandAcl, checkCommandAcl, createScriptEngineManager, getComponentId, getComponentInfo, getDefaults, getDefHostName, getDefVHostItem, getDiscoCategory, getDiscoExtensionsForm, getDiscoFeatures, getDiscoFeatures, getDiscoInfo, getDiscoItems, getName, getNodesConnected, getNodesConnectedWithLocal, getScriptCommands, getScriptItems, getServiceEntity, getVHostItem, handlesLocalDomains, handlesNameSubdomains, handlesNonLocalDomains, initializationCompleted, isAdmin, isInitializationComplete, isLocalDomain, isLocalDomainOrComponent, isNonAdminCommands, isSubdomain, isTrusted, isTrusted, nodeConnected, nodeDisconnected, onNodeConnected, onNodeDisconnected, processScriptCommand, removeComponentDomain, removeServiceDiscoveryItem, setAdmins, setClusterController, setCommandsACL, setProperties, setScriptsBaseDir, setVHostManager, updateServiceDiscoveryItem, updateServiceDiscoveryItem, updateServiceDiscoveryItem, updateServiceEntity
-
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
-
Methods inherited from interface tigase.server.MessageReceiver
getDefHostName
-
Methods inherited from interface tigase.server.ServerComponent
getComponentId, getComponentInfo, getName, initializationCompleted, isInitializationComplete, processPacket, release, setName
-
Methods inherited from interface tigase.stats.StatisticsContainerIfc
getName
-
-
-
-
Method Detail
-
register
public void register(Kernel kernel)
Description copied from interface:RegistrarBean
Method called when bean is being registered allowing developer to programatically register other beans.- Specified by:
register
in interfaceRegistrarBean
- Parameters:
kernel
- - instance from local scope
-
unregister
public void unregister(Kernel kernel)
Description copied from interface:RegistrarBean
Method called while bean is being unregistered.- Specified by:
unregister
in interfaceRegistrarBean
- Parameters:
kernel
- - instance from local scope
-
getComponentsAll
public java.util.Set<ServerComponent> getComponentsAll()
-
setComponentsAll
public void setComponentsAll(java.util.Set<ServerComponent> components)
-
addComponent
public void addComponent(ServerComponent component) throws ConfigurationException
- Throws:
ConfigurationException
-
addRegistrator
public void addRegistrator(ComponentRegistrator registr) throws ConfigurationException
- Throws:
ConfigurationException
-
addRouter
public void addRouter(MessageReceiver receiver) throws ConfigurationException
- Throws:
ConfigurationException
-
beanConfigurationChanged
public void beanConfigurationChanged(java.util.Collection<java.lang.String> changedFields)
Description copied from interface:ConfigurationChangedAware
Method called when configuration was applied to bean.- Specified by:
beanConfigurationChanged
in interfaceConfigurationChangedAware
- Overrides:
beanConfigurationChanged
in classAbstractMessageReceiver
- Parameters:
changedFields
- collection of field names which were changed
-
hashCodeForPacket
public int hashCodeForPacket(Packet packet)
Description copied from class:AbstractMessageReceiver
This method decides how incoming packets are distributed among processing threads. Different components needs different distribution to efficient use all threads and avoid packets re-ordering.
If there are N processing threads, packets are distributed among threads using following code:
int threadNo = Math.abs(hashCodeForPacket(packet) % N);
For a PubSub component, for example, a better packets distribution would be based on the PubSub channel name, for SM a better distribution is based on the destination address, etc....- Overrides:
hashCodeForPacket
in classAbstractMessageReceiver
- Parameters:
packet
- is aPacket
which needs to be processed by some thread.- Returns:
- a hash code generated for the input thread.
-
initialize
public void initialize()
Description copied from interface:Initializable
Method will be called, when bean will be created, configured and ready to use.- Specified by:
initialize
in interfaceInitializable
- Overrides:
initialize
in classBasicComponent
-
initBindings
public void initBindings(javax.script.Bindings binds)
Description copied from class:BasicComponent
Initialize a mapping of key/value pairs which can be used in scripts loaded by the server- Overrides:
initBindings
in classBasicComponent
- Parameters:
binds
- A mapping of key/value pairs, all of whose keys are Strings.
-
processingInThreads
public int processingInThreads()
Description copied from class:AbstractMessageReceiver
Concurrency control method. Returns preferable number of threads set for this component.- Overrides:
processingInThreads
in classAbstractMessageReceiver
- Returns:
- preferable number of threads set for this component.
-
processingOutThreads
public int processingOutThreads()
Description copied from class:AbstractMessageReceiver
Concurrency control method. Returns preferable number of threads set for this component.- Overrides:
processingOutThreads
in classAbstractMessageReceiver
- Returns:
- preferable number of threads set for this component.
-
processPacket
public void processPacket(Packet packet)
Description copied from class:AbstractMessageReceiver
This is the mainPacket
processing method. It is called concurrently from many threads so implementing it in thread save manner is essential. The method is called for each packet addressed to the component.
Please note, thePacket
instance may be processed by different parts of the server, different components or plugins at the same time. Therefore this is very important to tread thePacket
instance as unmodifiable object.
Processing in this method is asynchronous, therefore there is no result value. If there are some 'result' packets generated during processing, they should be passed back usingaddOutPacket(Packet)
method.- Specified by:
processPacket
in classAbstractMessageReceiver
- Parameters:
packet
- is an instance of thePacket
class passed for processing.
-
removeComponent
public void removeComponent(ServerComponent component)
-
removeRegistrator
public void removeRegistrator(ComponentRegistrator registr)
-
removeRouter
public void removeRouter(MessageReceiver receiver)
-
start
public void start()
- Specified by:
start
in interfaceMessageReceiver
- Specified by:
start
in interfaceMessageRouterIfc
- Overrides:
start
in classAbstractMessageReceiver
-
stop
public void stop()
- Overrides:
stop
in classAbstractMessageReceiver
-
getDiscoCategoryType
public java.lang.String getDiscoCategoryType()
Description copied from class:BasicComponent
Method returns component category type used for service discovery responses.- Overrides:
getDiscoCategoryType
in classBasicComponent
- Returns:
- category type of a component
-
getDiscoDescription
public java.lang.String getDiscoDescription()
Description copied from class:BasicComponent
Method returns description used for service discovery responses.- Overrides:
getDiscoDescription
in classBasicComponent
- Returns:
- description of a component
-
getStatistics
public void getStatistics(StatisticsList list)
Description copied from class:AbstractMessageReceiver
Method returns component statistics. Please note, the method can be called every second by the server monitoring system therefore no extensive or lengthy calculations are allowed. If there are some statistics requiring lengthy operations like database access they must haveLevel.FINEST
assigned and must be put inside the level guard to prevent generating them by the system monitor. The system monitor does not collectFINEST
statistics.
Level guard code looks like the example below:
if (list.checkLevel(Level.FINEST)) { // Some CPU intensive calculations or lengthy operations list.add(getName(), "Statistic description", stat_value, Level.FINEST); }
This way you make sure your extensive operation is not executed every second by the monitoring system and does not affect the server performance.- Specified by:
getStatistics
in interfaceStatisticsContainerIfc
- Overrides:
getStatistics
in classAbstractMessageReceiver
- Parameters:
list
- is aStatistcsList
where all statistics are stored.
-
setConfig
public void setConfig(ConfiguratorAbstract config) throws ConfigurationException
- Specified by:
setConfig
in interfaceMessageRouterIfc
- Throws:
ConfigurationException
-
beforeUnregister
public void beforeUnregister()
Description copied from interface:UnregisterAware
Method called before bean unregister.- Specified by:
beforeUnregister
in interfaceUnregisterAware
-
getServiceEntityCaps
public java.util.Optional<Element> getServiceEntityCaps(JID fromJid)
- Overrides:
getServiceEntityCaps
in classBasicComponent
-
getMaxQueueSize
protected java.lang.Integer getMaxQueueSize(int def)
- Overrides:
getMaxQueueSize
in classAbstractMessageReceiver
-
reloadScripts
protected void reloadScripts()
- Overrides:
reloadScripts
in classBasicComponent
-
-