Pregunta

Estoy tratando de utilizar la última tronco Smackx para obtener y luego suscribirse a un nodo pubsub. Sin embargo, OpenFire sólo me envía una copia de un error:. No se ha encontrado (404)

Estoy crear instancias de los objetos de Java de ColdFusion, por lo que mis fragmentos de código puede tener un aspecto gracioso, pero tal vez alguien será capaz de decirme lo que he olvidado.

Así es como se crea el nodo:

    ftype = createObject("java", "org.jivesoftware.smackx.pubsub.FormType");
    cform = createObject("java", "org.jivesoftware.smackx.pubsub.ConfigureForm").init(ftype.submit);
    cform.setPersistentItems(true);
    cform.setDeliverPayloads(true);
    caccess = createObject("java", "org.jivesoftware.smackx.pubsub.AccessModel");
    cform.setAccessModel(caccess.open);
    cpublish = createObject("java", "org.jivesoftware.smackx.pubsub.PublishModel");
    cform.setPublishModel(cpublish.open);
    cform.setMaxItems(99);

    manager = createObject("java", "org.jivesoftware.smackx.pubsub.PubSubManager").init(XMPPConnection);

    myNode = manager.createNode("subber", cform);

Y así es como estoy tratando de llegar a ella (en una sección diferente del código):

    manager = createObject("java", "org.jivesoftware.smackx.pubsub.PubSubManager").init(XMPPConnection);
    myNode = manager.getNode("subber");

Inmediatamente después de crear el nodo que parece ser capaz de publicar a él de esta manera:

    payload = createObject("java", "org.jivesoftware.smackx.pubsub.SimplePayload").init("book","pubsub:test:book","<book xmlns='pubsub:test:book'><title>Lord of the Rings</title></book>");
    item = createObject("java", "org.jivesoftware.smackx.pubsub.Item").init(payload);
    myNode.publish(item);

Sin embargo, es la llamada getNode () que está causando mi código de error.

He comprobado que los nodos están siendo creados por el control de la base de datos utilizada por mi servidor Openfire. Puedo verlos allí, correctamente atribuido como nodos hoja, etc.

Cualquier consejo? Alguien más por ahí haciendo nada con XMPP y ColdFusion? He tenido un gran éxito el envío y recepción de mensajes con FQ y Smack simplemente no han tenido la pubsub trabajar aún:)

Gracias!

¿Fue útil?

Solución

Esto ha sido contestada:

Hay un segundo método en la clase PubSubManager que acepta dos argumentos, una conexión y un parámetro a. Al parecer Openfire esta requiere a parámetro y después de un poco de experimentación descubrí que funciona usando pubsub.your.xmpp.address

manager = createObject("java", "org.jivesoftware.smackx.pubsub.PubSubManager").init(XMPPConnection,"pubsub.127.0.0.1");

Otros consejos

Tal vez este ejemplo se puede utilizar como una referencia para usted:

 public void login(String Ip,String username,String passwaord)
     {
         try 
         {
            connConfig = new AndroidConnectionConfiguration(Ip, 5222);
            connection = new XMPPConnection(connConfig);
            connection.connect();  
            connection.login(username, passwaord);
            pubSubAddress = "pubsub."+ connection.getServiceName();
            manager = new PubSubManager(connection,pubSubAddress);
            Log.i("MyError","connection success");  
         }
         catch (XMPPException e) 
         {
             Log.i("MyError","connection failed");      
             e.printStackTrace();
         }

     }

Un ejemplo normalizado se mostró como sigue:

Publicar nodo:

import org.jivesoftware.smack.XMPPConnection;
import org.jivesoftware.smackx.pubsub.LeafNode;
import org.jivesoftware.smackx.pubsub.PayloadItem;
import org.jivesoftware.smackx.pubsub.PubSubManager;
import org.jivesoftware.smackx.pubsub.SimplePayload;

public class XmppPubsub_Publisher {
    private static XMPPConnection connection = new XMPPConnection("think");
    private static String USRE_NAME = "test1";
    private static String PASSWORD = "1";
    static{
        try {
            connection.connect();
            connection.login(USRE_NAME,PASSWORD);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    public static void main(String[] args)throws Exception{
        try{
            PubSubManager manager = new PubSubManager(connection);
            String nodeId = "test2";
            LeafNode myNode = null;
            try {
                myNode = manager.getNode(nodeId);
            } catch (Exception e) {
                e.printStackTrace();
            }
            if(myNode == null){
                myNode = manager.createNode(nodeId);
            }
            String msg = "fsadfasdfsadfasdfd---";
            SimplePayload payload = new SimplePayload("message","pubsub:test:message", "<message xmlns='pubsub:test:message'><body>"+msg+"</body></message>");
            PayloadItem<SimplePayload> item = new PayloadItem<SimplePayload>("5", payload);
            myNode.publish(item);
            System.out.println("-----publish-----------");
        }
        catch(Exception E)
        {E.printStackTrace();}
    }
}

Recuperar nodo:

import org.jivesoftware.smack.XMPPConnection;
import org.jivesoftware.smackx.pubsub.ItemPublishEvent;
import org.jivesoftware.smackx.pubsub.Node;
import org.jivesoftware.smackx.pubsub.PayloadItem;
import org.jivesoftware.smackx.pubsub.PubSubManager;
import org.jivesoftware.smackx.pubsub.listener.ItemEventListener;

public class XmppPubsub_Reciever {
    private static XMPPConnection connection = new XMPPConnection("think");
    private static String USRE_NAME = "test1";
    private static String PASSWORD = "1";
    static {
        try {
            connection.connect();
            connection.login(USRE_NAME, PASSWORD);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    public static void main(String[] args) throws Exception {
        String nodeId = "test2";
        PubSubManager manager = new PubSubManager(connection);
        Node eventNode = manager.getNode(nodeId);
        eventNode.addItemEventListener(new ItemEventListener<PayloadItem>() {
            public void handlePublishedItems(ItemPublishEvent evt) {
                for (Object obj : evt.getItems()) {
                    PayloadItem item = (PayloadItem) obj;
                    System.out.println("--:Payload=" + item.getPayload().toString());
                }
            }
        });
        eventNode.subscribe(connection.getUser());
        while(true);
    }
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top