3.3. 패킷을 가로채기하여 메시지 감사
브로커를 입력하거나 종료하고 패킷을 감사하거나 메시지를 필터링하는 패킷을 가로채기합니다. 인터셉터는 가로채는 패킷을 변경합니다. 이로 인해 인터셉터가 강력하지만 잠재적으로 위험해질 수 있습니다.
고객의 비즈니스 요구 사항에 맞게 인터셉터를 개발합니다. 인터셉터는 프로토콜마다 다르며 적절한 인터페이스를 구현해야 합니다.
인터셉터는 부울 값을 반환하는 intercept()
메서드를 구현해야 합니다. 값이 true
이면 메시지 패킷은 계속됩니다. false
인 경우 프로세스가 중단되고 다른 인터셉터가 호출되지 않으며 메시지 패킷은 더 이상 처리되지 않습니다.
3.3.1. 인터셉터 생성
인터셉터는 가로채는 패킷을 변경할 수 있습니다. 직접 들어오고 나가는 인터셉터를 만들 수 있습니다. 모든 인터셉터는 프로토콜별로 다르며 각각 서버를 입력하거나 종료하는 모든 패킷에 대해 호출됩니다. 이를 통해 인터셉터를 생성하여 패킷 감사와 같은 비즈니스 요구 사항을 충족할 수 있습니다.
인터셉터와 해당 종속 항목을 브로커의 Java 클래스 경로에 배치해야 합니다. 기본적으로 classpath의 일부이므로 < broker_instance_dir> /lib
디렉터리를 사용할 수 있습니다.
다음 예제에서는 전달된 각 패킷의 크기를 확인하는 인터셉터를 생성하는 방법을 보여줍니다.
예제에서는 각 프로토콜에 대해 특정 인터페이스를 구현합니다.
절차
적절한 인터페이스를 구현하고
intercept()
메서드를 덮어씁니다.AMQP 프로토콜을 사용하는 경우
org.apache.activemq.artemis.protocol.amqp.broker.AmqpInterceptor
인터페이스를 구현합니다.package com.example; import org.apache.activemq.artemis.protocol.amqp.broker.AMQPMessage; import org.apache.activemq.artemis.protocol.amqp.broker.AmqpInterceptor; import org.apache.activemq.artemis.spi.core.protocol.RemotingConnection; public class MyInterceptor implements AmqpInterceptor { private final int ACCEPTABLE_SIZE = 1024; @Override public boolean intercept(final AMQPMessage message, RemotingConnection connection) { int size = message.getEncodeSize(); if (size <= ACCEPTABLE_SIZE) { System.out.println("This AMQPMessage has an acceptable size."); return true; } return false; } }
코어 프로토콜을 사용하는 경우 인터셉터는
org.apache.artemis.activemq.api.core.Interceptor
인터페이스를 구현해야 합니다.package com.example; import org.apache.artemis.activemq.api.core.Interceptor; import org.apache.activemq.artemis.core.protocol.core.Packet; import org.apache.activemq.artemis.spi.core.protocol.RemotingConnection; public class MyInterceptor implements Interceptor { private final int ACCEPTABLE_SIZE = 1024; @Override boolean intercept(Packet packet, RemotingConnection connection) throws ActiveMQException { int size = packet.getPacketSize(); if (size <= ACCEPTABLE_SIZE) { System.out.println("This Packet has an acceptable size."); return true; } return false; } }
MQTT 프로토콜을 사용하는 경우
org.apache.activemq.artemis.core.protocol.mqtt.MQTTInterceptor
인터페이스를 구현합니다.package com.example; import org.apache.activemq.artemis.core.protocol.mqtt.MQTTInterceptor; import io.netty.handler.codec.mqtt.MqttMessage; import org.apache.activemq.artemis.spi.core.protocol.RemotingConnection; public class MyInterceptor implements Interceptor { private final int ACCEPTABLE_SIZE = 1024; @Override boolean intercept(MqttMessage mqttMessage, RemotingConnection connection) throws ActiveMQException { byte[] msg = (mqttMessage.toString()).getBytes(); int size = msg.length; if (size <= ACCEPTABLE_SIZE) { System.out.println("This MqttMessage has an acceptable size."); return true; } return false; } }
STOMP 프로토콜을 사용하는 경우
org.apache.activemq.artemis.core.protocol.stomp.StompInterceptor
인터페이스를 구현합니다.package com.example; import org.apache.activemq.artemis.core.protocol.stomp.StompFrameInterceptor; import org.apache.activemq.artemis.core.protocol.stomp.StompFrame; import org.apache.activemq.artemis.spi.core.protocol.RemotingConnection; public class MyInterceptor implements Interceptor { private final int ACCEPTABLE_SIZE = 1024; @Override boolean intercept(StompFrame stompFrame, RemotingConnection connection) throws ActiveMQException { int size = stompFrame.getEncodedSize(); if (size <= ACCEPTABLE_SIZE) { System.out.println("This StompFrame has an acceptable size."); return true; } return false; } }
3.3.2. 인터셉터를 사용하도록 브로커 구성
사전 요구 사항
-
인터셉터 클래스를 생성하고 브로커의 Java 클래스 경로에 (및 해당 종속 항목)를 추가합니다. 기본적으로 classpath의 일부이므로 <
broker_instance_dir> /lib
디렉터리를 사용할 수 있습니다.
절차
-
Open
<broker_instance_dir>/etc/broker.xml
<broker
_instance_dir> /etc/broker.xml에 구성을 추가하여 인터셉터를 사용하도록 브로커를 구성합니다.
인터셉터가 수신되는 메시지의 경우
class-name
을remoting-incoming-interceptors
목록에 추가합니다.<configuration> <core> ... <remoting-incoming-interceptors> <class-name>org.example.MyIncomingInterceptor</class-name> </remoting-incoming-interceptors> ... </core> </configuration>
인터셉터가 발신 메시지의 용도인 경우
class-name
을remoting-outgoing-interceptors
목록에 추가하십시오.<configuration> <core> ... <remoting-outgoing-interceptors> <class-name>org.example.MyOutgoingInterceptor</class-name> </remoting-outgoing-interceptors> </core> </configuration>
3.3.3. 클라이언트 측의 인터셉터
클라이언트는 인터셉터를 사용하여 클라이언트가 서버로 전송하거나 서버가 클라이언트로 전송한 패킷을 가로챌 수 있습니다. 브로커 측 인터셉터에서 false
값을 반환하면 다른 인터셉터가 호출되지 않고 클라이언트가 패킷을 추가로 처리하지 않습니다. 이 프로세스는 발신 패킷이 차단
방식으로 전송되지 않는 한 투명하게 수행됩니다. 이 경우 ActiveMQException
이 호출자에게 throw됩니다. throw된 ActiveMQException
에는 false
값을 반환한 인터셉터 이름이 포함되어 있습니다.
서버에서 클라이언트 인터셉터 클래스와 해당 종속 항목을 클라이언트의 Java 클래스 경로에 추가하고 적절하게 인스턴스화하고 호출해야 합니다.