2016-12-21 5 views
0

thisの例で私たちのCometアプリケーションでOortをマルチキャストで有効にしようとしています。私は今すぐオートが必要です。 Setiの部分ではありません。しかしOortは動作していないようです。私はcometdデバッグを有効にしており、Oortが初期化されていないのがわかります。Cometd Oort Cluster - Springの設定

私はローカル(異なるポート上)で2つのOortノードのインスタンスを実行してテストしました。たとえば、AとBです。クライアントをノードAに接続させます。ノードAからのメッセージを/user/*チャネルとクライアントそれを受け取る。しかし、ノードBからのメッセージを公開すると、クライアントは何も取得しません。

Spring構成:

import org.cometd.annotation.ServerAnnotationProcessor; 
import org.cometd.bayeux.server.BayeuxServer; 
import org.cometd.oort.Oort; 
import org.cometd.oort.OortMulticastConfigServlet; 
import org.cometd.oort.OortMulticastConfigurer; 
import org.cometd.server.BayeuxServerImpl; 
import org.cometd.server.transport.AsyncJSONTransport; 
import org.cometd.server.transport.JSONTransport; 
import org.cometd.websocket.server.WebSocketTransport; 
import org.slf4j.Logger; 
import org.slf4j.LoggerFactory; 
import org.springframework.beans.BeansException; 
import org.springframework.beans.factory.config.DestructionAwareBeanPostProcessor; 
import org.springframework.context.annotation.Bean; 
import org.springframework.context.annotation.Configuration; 
import org.springframework.web.context.ServletContextAware; 

import javax.annotation.PostConstruct; 
import javax.servlet.ServletContext; 

@Configuration 
public class BayeuxInitializer implements DestructionAwareBeanPostProcessor, ServletContextAware { 

    private ServerAnnotationProcessor processor; 
    private ServletContext context; 

    @PostConstruct 
    private void init() { 
     BayeuxServer bayeuxServer = bayeuxServer(); 
     this.processor = new ServerAnnotationProcessor(bayeuxServer); 
     Oort oort = oort(); 
     oort.observeChannel("/user/*"); 
    } 

    public Object postProcessBeforeInitialization(Object bean, String name) throws BeansException { 
     processor.processDependencies(bean); 
     processor.processConfigurations(bean); 
     processor.processCallbacks(bean); 
     return bean; 
    } 

    public Object postProcessAfterInitialization(Object bean, String name) throws BeansException { 
     return bean; 
    } 

    public void postProcessBeforeDestruction(Object bean, String name) throws BeansException { 
     processor.deprocessCallbacks(bean); 
    } 


    @Bean(initMethod = "start", destroyMethod = "stop") 
    public BayeuxServer bayeuxServer() { 
     BayeuxServerImpl bean = new BayeuxServerImpl(); 
     bean.setTransports(new WebSocketTransport(bean), new JSONTransport(bean), new AsyncJSONTransport(bean)); 
     bean.setOption("timeout", 60000); 
     bean.setOption("ws.timeout", 60000); 
     bean.setOption("maxSessionsPerBrowser", 20); 
     bean.setOption(ServletContext.class.getName(), context); 
     bean.setOption("cometdURLMapping", "/,/svc"); 
     context.setAttribute(BayeuxServer.ATTRIBUTE, bean); 
     return bean; 
    } 

    @Bean(initMethod = "start", destroyMethod = "stop") 
    public Oort oort() { 
     Oort oort = new Oort(bayeuxServer(), "http://localhost:8094/comet/svc"); 
     context.setAttribute(Oort.OORT_ATTRIBUTE, oort); 
     return oort; 
    } 

    @Override 
    public void setServletContext(ServletContext servletContext) { 
     this.context = servletContext; 
    } 
} 

のweb.xml:私は以下のようにweb.xmlにそれを初期化する場合

<servlet> 
     <servlet-name>cometd</servlet-name> 
     <servlet-class>org.cometd.server.CometDServlet</servlet-class> 
     <load-on-startup>1</load-on-startup> 
     <async-supported>true</async-supported> 
    </servlet> 
    <servlet-mapping> 
     <servlet-name>cometd</servlet-name> 
     <url-pattern>/svc/*</url-pattern> 
    </servlet-mapping> 

オールトが動作しているようだ:

<servlet> 
     <servlet-name>cometd</servlet-name> 
     <servlet-class>org.cometd.server.CometDServlet</servlet-class> 
     <load-on-startup>1</load-on-startup> 
     <async-supported>true</async-supported> 
    </servlet> 
    <servlet-mapping> 
     <servlet-name>cometd</servlet-name> 
     <url-pattern>/svc/*</url-pattern> 
    </servlet-mapping> 


    <servlet> 
     <servlet-name>oort</servlet-name> 
     <servlet-class>org.cometd.oort.OortMulticastConfigServlet</servlet-class> 
     <init-param> 
      <param-name>oort.url</param-name> 
      <param-value>http://localhost:8094/comet/svc</param-value> 
     </init-param> 
     <init-param> 
      <param-name>oort.channels</param-name> 
      <param-value>/user/*</param-value> 
     </init-param> 
     <load-on-startup>2</load-on-startup> 
    </servlet> 

しかしとしてバージョンでBayeuxServerが初期化されている場合は、Springで初期化する必要があります。だから私の質問は:

  1. 私のOort Springの設定に何か問題はありますか?
  2. Oortはweb.xmlの初期化で動作することを考慮すると、それを行う上で問題はありますか(Spring自体のBayeuxServer設定を維持する)か?
  3. hereは、Oortオブジェクトを初期化するだけです。 cometdはそのマルチキャストかスタティックかをどのように知っていますか?

cometdバージョン:3.0.10

桟橋のバージョン:9.3.11

すべてのヘルプ感謝!

答えて

1

Spring(またはその他の埋め込みコード)を使用してOortオブジェクトを作成すると、ノードが作成されましたが、他のOortノードにリンクされていません。あなたのコードで

、お電話:

Oort oort = oort(); 
oort.observeChannel("/user/*"); 

これは、ノードを作成し、他のノードからのチャネル/user/*上のメッセージを観察し、それを構成しますが、それは他のノードとそれを接続しません。例では

あなたがリンクされ、それが呼び出す欠落している部分がある:

oort.observeComet("http://cloud.cometd.org/cometd"); 

例である、それは正確なURIを知らない、ので、一例ではコメントアウトされて呼び出します例ではhttp://cloud.cometd.org/cometdを使用していますが、そのURIは既存のノードを指していないため、コメントアウトされています。

ここで、マルチキャストを使用したいので、リンクした例は、OortMulticastConfigurerを使用するように提案しています。

OortMulticastConfigurerは、で正常に使用されているOortMulticastConfigServletによって使用されているものです。

OortMulticastConfigServletOortMulticastConfigurer をどのように使用するかを見てみましょう。

ご覧のとおり、OortMulticastConfigurerが作成、設定、開始されています。

デフォルト値にとどまる場合は、最小のコードは次のようになります。

configurer = new OortMulticastConfigurer(oort); 
configurer.start(); 

があなたのBayeuxInitializer.init()方法にそれらの2行を追加し、あなたが行くように良いことがあります。

+0

これは完全に機能しました。ありがとう@スボルデ!そして私たちに彗星を与えてくれてありがとう! –