我已经制作了一个非常简单的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;
}