2011-12-15 5 views
2

У меня возникла проблема с отправкой сообщения клиенту. Ниже мой кодCometD опубликовать сообщение обратно клиенту

JavaScript

dojox.cometd.publish('/service/getservice', { 
         userid : _USERID, 

        }); 
dojox.cometd.subscribe('/service/getservice', function(
      message) { 
     alert("abc"); 
     alert(message.data.test); 
    }); 

Configuration Servlet 

bayeux.createIfAbsent("/service/getservice", new ConfigurableServerChannel.Initializer() { 

     @Override 
     public void configureChannel(ConfigurableServerChannel channel) { 
      channel.setPersistent(true); 
      GetListener channelListner = new GetListener(); 
      channel.addListener(channelListner); 
     } 
    }); 

GetListener класс

public class GetListener implements MessageListener { 
public boolean onMessage(ServerSession ss, ServerChannel sc) { 
     SomeClassFunction fun = new SomeClassFunction; 
} 
} 

SomeClassFunction

class SomeClassFunction(){ 

} 

здесь я создаю булеву переменную булево успеха; Если это правда, отправьте сообщение клиенту, который находится в javascript. как отправить сообщение клиенту. Я тоже пробовал эту линию.

 remote.deliver(getServerSession(), "/service/getservice", 
        message, null); 

, но это дает мне ошибку на удаленный объект и метод getServerSession.

ответ

3

Для достижения вашей цели вам не нужно внедрять слушателей и не настраивать каналы. Возможно, вам придется добавить некоторую конфигурацию на более позднем этапе, например, чтобы добавить авторизаторов.

Это код ConfigurationServlet, взятый из этого link:

public class ConfigurationServlet extends GenericServlet 
{ 
    public void init() throws ServletException 
    { 
     // Grab the Bayeux object 
     BayeuxServer bayeux = (BayeuxServer)getServletContext().getAttribute(BayeuxServer.ATTRIBUTE); 
     new EchoService(bayeux); 
     // Create other services here 

     // This is also the place where you can configure the Bayeux object 
     // by adding extensions or specifying a SecurityPolicy 
    } 

    public void service(ServletRequest request, ServletResponse response) throws ServletException, IOException 
    { 
     throw new ServletException(); 
    } 
} 

Это код EchoService класса, взятый сюда этого link:

public class EchoService extends AbstractService 
{ 
    public EchoService(BayeuxServer bayeuxServer) 
    { 
     super(bayeuxServer, "echo"); 
     addService("/echo", "processEcho"); 
    } 

    public void processEcho(ServerSession remote, Map<String, Object> data) 
    { 
     // if you want to echo the message to the client that sent the message 
     remote.deliver(getServerSession(), "/echo", data, null); 

     // if you want to send the message to all the subscribers of the "/myChannel" channel 
     getBayeux().createIfAbsent("/myChannel"); 
     getBayeux().getChannel("/myChannel").publish(getServerSession(), data, null); 
    } 
} 
+0

perissf я сделал с этой техникой как и раньше, и он успешно отправляет сообщение клиенту. но я хочу в вышеупомянутом случае. потому что, если я буду использовать класс эха, он сначала вызовет класс someClassFunction, потому что я хочу отправить сообщение после выполнения someClassFunction, вы сказали мне концепцию авторизаторов, которую я должен изучить тогда. –

+0

perissf, у меня есть идея, когда я его реализую, я дам вам знать. –

+0

Что делать, если perissf, если я не хочу вызывать новое Echo (bayuex) из configurationservlet, что делать, если я хочу позвонить из определенного класса? потому что в случае конфигурацииServlet он должен вызвать свой конструктор из-за спецификации загрузки в web.xml. что, если я хочу позвонить из класса, я сделал это таким образом, но до сих пор не отображается сообщение. –