1

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

/*................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做到这一点)。 带有 XMPP 的 ActiveMQ

感谢所有愿意帮助我的人!

4

3 回答 3

1

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

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

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

于 2012-11-14T14:36:28.437 回答
0

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

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) 

听众现在工作得很好!

于 2012-11-15T07:35:08.083 回答
0

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

官方教程中有一个例子:Intercepting Operations

package org.apache.activemq.artemis.api.core.interceptor;

public interface Interceptor
{
    boolean intercept(Packet packet, RemotingConnection connection) throws ActiveMQException;
}
于 2018-06-26T02:18:31.320 回答