XMPP客户端(带smack)和ActiveMQ,如何拦截"adminConsole"消息



我已经制作了一个非常简单的java应用程序(这只是一个证明),并且我可以毫无问题地连接到我的ActiveMQ消息布鲁克(安装在我用来测试Java应用程序的同一台机器上)。问题是我无法拦截任何消息。我已经在我的应用程序中设置了一个 messageListener,如下所示,但我不确定它是否在正确的位置,也不确定干预消息的正确方法(例如,使用 ActiveMQ 管理控制台中提供的"发送到"选项发送的消息,如本文下部的链接中所述)。下面是消息侦听器的代码:

/*................previous code is not relevant.................*/
ConnectionConfiguration config = new ConnectionConfiguration("192.168.43.5",61222); //to get my XMPP connector uri
String msg="";
config.setSASLAuthenticationEnabled(false);
config.setCompressionEnabled(false);
XMPPConnection xmpp = new XMPPConnection(config);
try {
    xmpp.connect(); 
    xmpp.login("name", "pw");
        /*Filter*/
    PacketFilter filter = new MessageTypeFilter(Message.Type.chat); 
        /*MessageListener to get messages*/             
    MessageListener listen = new MessageListener() {
        @Override
        public void processMessage(Chat arg0, Message arg1) {
            // TODO Auto-generated method stub
            msg = "ok ";
            msg = arg1.toString();
            }
        };
    /*New chat with my messageListener*/
        Chat c = xmpp.getChatManager().createChat("admin", listen) ;
        c.sendMessage("enter text here");
    }
     catch (XMPPException e) {  
}
/*...............other code.......................*/

这或多或少是我想做的,使用我的Java应用程序而不是Spark(我已经能够用Spark做到这一点)。ActiveMQ with XMPP

感谢所有想帮助我的人!

我不知道ActiveMQ在XMPP方面是如何工作的,但很可能ActiveMQ不会根据您创建的同一聊天向您发送消息。 聊天是使用线程 ID 协调的,如果 MQ 使用不同的 ID 发送,或者根本没有发送,则它可能与您创建的聊天不匹配,因此不会调用您的听众

尝试将侦听器添加到 ChatManager,以获取新传入聊天的通知,并尝试使用 -Dsmack.debugEnabled=true 运行,以确保您确实从 ActiveMQ 接收数据包。

顺便说一句,在这种情况下不使用您的数据包过滤器,当您将侦听器直接放在连接上时使用。

我希望这不仅仅是侥幸。我试图替换:

PacketFilter filter = new MessageTypeFilter(Message.Type.chat); 

跟:

PacketFilter filter = new AndFilter(new PacketTypeFilter(Message.class));

我已经替换了:

MessageListener listen = new MessageListener() {
    @Override
    public void processMessage(Chat arg0, Message arg1)

跟:

PacketListener ls= new PacketListener() {
@Override
public void processPacket(Packet arg0) 

听众现在工作得很好!

Apache ActiveMQ Artemis支持拦截器拦截进出服务器的数据包。核心协议的拦截器必须实现接口拦截器

官方教程中有一个例子:拦截操作

package org.apache.activemq.artemis.api.core.interceptor;
public interface Interceptor
{
    boolean intercept(Packet packet, RemotingConnection connection) throws ActiveMQException;
}

最新更新