2014-12-11 07:17:29 -05:00
|
|
|
# Intercepting Operations
|
2014-12-04 10:25:29 -05:00
|
|
|
|
2015-04-27 17:32:30 -04:00
|
|
|
Apache ActiveMQ Artemis supports *interceptors* to intercept packets entering and
|
2014-12-04 10:25:29 -05:00
|
|
|
exiting the server. Incoming and outgoing interceptors are be called for
|
|
|
|
any packet entering or exiting the server respectively. This allows
|
|
|
|
custom code to be executed, e.g. for auditing packets, filtering or
|
|
|
|
other reasons. Interceptors can change the packets they intercept. This
|
|
|
|
makes interceptors powerful, but also potentially dangerous.
|
|
|
|
|
2014-12-11 07:17:29 -05:00
|
|
|
## Implementing The Interceptors
|
2014-12-04 10:25:29 -05:00
|
|
|
|
2016-07-03 22:30:13 -04:00
|
|
|
All interceptors are protocol specific.
|
|
|
|
|
|
|
|
An interceptor for the core protocol must implement the interface `Interceptor`:
|
2014-12-04 10:25:29 -05:00
|
|
|
|
2014-12-11 07:17:29 -05:00
|
|
|
``` java
|
2017-07-31 06:26:28 -04:00
|
|
|
package org.apache.activemq.artemis.api.core.interceptor;
|
2014-12-04 10:25:29 -05:00
|
|
|
|
2014-12-11 07:17:29 -05:00
|
|
|
public interface Interceptor
|
2015-02-25 08:37:19 -05:00
|
|
|
{
|
2014-12-11 07:17:29 -05:00
|
|
|
boolean intercept(Packet packet, RemotingConnection connection) throws ActiveMQException;
|
|
|
|
}
|
|
|
|
```
|
2014-12-04 10:25:29 -05:00
|
|
|
|
2016-07-03 22:30:13 -04:00
|
|
|
For stomp protocol an interceptor must implement the interface `StompFrameInterceptor`:
|
2015-03-13 05:29:33 -04:00
|
|
|
|
|
|
|
``` java
|
2015-04-27 17:32:30 -04:00
|
|
|
package org.apache.activemq.artemis.core.protocol.stomp;
|
2015-03-13 05:29:33 -04:00
|
|
|
|
2016-07-03 22:30:13 -04:00
|
|
|
public interface StompFrameInterceptor extends BaseInterceptor<StompFrame>
|
|
|
|
{
|
|
|
|
boolean intercept(StompFrame stompFrame, RemotingConnection connection);
|
|
|
|
}
|
|
|
|
```
|
|
|
|
|
|
|
|
Likewise for MQTT protocol, an interceptor must implement the interface `MQTTInterceptor`:
|
|
|
|
|
|
|
|
``` java
|
|
|
|
package org.apache.activemq.artemis.core.protocol.mqtt;
|
|
|
|
|
|
|
|
public interface MQTTInterceptor extends BaseInterceptor<MqttMessage>
|
2015-03-13 05:29:33 -04:00
|
|
|
{
|
2016-07-03 22:30:13 -04:00
|
|
|
boolean intercept(MqttMessage mqttMessage, RemotingConnection connection);
|
2015-03-13 05:29:33 -04:00
|
|
|
}
|
|
|
|
```
|
|
|
|
|
2014-12-04 10:25:29 -05:00
|
|
|
The returned boolean value is important:
|
|
|
|
|
|
|
|
- if `true` is returned, the process continues normally
|
|
|
|
|
|
|
|
- if `false` is returned, the process is aborted, no other
|
|
|
|
interceptors will be called and the packet will not be processed
|
|
|
|
further by the server.
|
|
|
|
|
2014-12-11 07:17:29 -05:00
|
|
|
## Configuring The Interceptors
|
2014-12-04 10:25:29 -05:00
|
|
|
|
|
|
|
Both incoming and outgoing interceptors are configured in
|
2015-04-29 05:30:31 -04:00
|
|
|
`broker.xml`:
|
2014-12-04 10:25:29 -05:00
|
|
|
|
|
|
|
<remoting-incoming-interceptors>
|
2015-04-29 13:20:31 -04:00
|
|
|
<class-name>org.apache.activemq.artemis.jms.example.LoginInterceptor</class-name>
|
|
|
|
<class-name>org.apache.activemq.artemis.jms.example.AdditionalPropertyInterceptor</class-name>
|
2014-12-04 10:25:29 -05:00
|
|
|
</remoting-incoming-interceptors>
|
|
|
|
|
|
|
|
<remoting-outgoing-interceptors>
|
2015-04-29 13:20:31 -04:00
|
|
|
<class-name>org.apache.activemq.artemis.jms.example.LogoutInterceptor</class-name>
|
|
|
|
<class-name>org.apache.activemq.artemis.jms.example.AdditionalPropertyInterceptor</class-name>
|
2014-12-04 10:25:29 -05:00
|
|
|
</remoting-outgoing-interceptors>
|
|
|
|
|
|
|
|
The interceptors classes (and their dependencies) must be added to the
|
|
|
|
server classpath to be properly instantiated and called.
|
|
|
|
|
2014-12-11 07:17:29 -05:00
|
|
|
## Interceptors on the Client Side
|
2014-12-04 10:25:29 -05:00
|
|
|
|
2017-03-09 11:59:09 -05:00
|
|
|
The interceptors can also be run on the Apache ActiveMQ Artemit client side to intercept packets
|
2014-12-04 10:25:29 -05:00
|
|
|
either sent by the client to the server or by the server to the client.
|
|
|
|
This is done by adding the interceptor to the `ServerLocator` with the
|
|
|
|
`addIncomingInterceptor(Interceptor)` or
|
|
|
|
`addOutgoingInterceptor(Interceptor)` methods.
|
|
|
|
|
|
|
|
As noted above, if an interceptor returns `false` then the sending of
|
|
|
|
the packet is aborted which means that no other interceptors are be
|
|
|
|
called and the packet is not be processed further by the client.
|
|
|
|
Typically this process happens transparently to the client (i.e. it has
|
|
|
|
no idea if a packet was aborted or not). However, in the case of an
|
|
|
|
outgoing packet that is sent in a `blocking` fashion a
|
|
|
|
`ActiveMQException` will be thrown to the caller. The exception is
|
|
|
|
thrown because blocking sends provide reliability and it is considered
|
|
|
|
an error for them not to succeed. `Blocking` sends occurs when, for
|
|
|
|
example, an application invokes `setBlockOnNonDurableSend(true)` or
|
|
|
|
`setBlockOnDurableSend(true)` on its `ServerLocator` or if an
|
|
|
|
application is using a JMS connection factory retrieved from JNDI that
|
|
|
|
has either `block-on-durable-send` or `block-on-non-durable-send` set to
|
|
|
|
`true`. Blocking is also used for packets dealing with transactions
|
|
|
|
(e.g. commit, roll-back, etc.). The `ActiveMQException` thrown will
|
|
|
|
contain the name of the interceptor that returned false.
|
|
|
|
|
|
|
|
As on the server, the client interceptor classes (and their
|
|
|
|
dependencies) must be added to the classpath to be properly instantiated
|
|
|
|
and invoked.
|
|
|
|
|
2014-12-11 07:17:29 -05:00
|
|
|
## Example
|
2014-12-04 10:25:29 -05:00
|
|
|
|
2015-03-16 07:27:36 -04:00
|
|
|
See [the examples chapter](examples.md) for an example which shows how to use interceptors to add
|
2014-12-04 10:25:29 -05:00
|
|
|
properties to a message on the server.
|