Cometd Oort Cluster - Spring 配置
Cometd Oort Cluster - Spring configuration
我正在按照 this 示例在我们的 Comet 应用程序中尝试通过多播启用奥尔特。我现在只需要奥尔特。不是 Seti 部分。但奥尔特似乎并没有奏效。我启用了 cometd 调试,但没有看到 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:
<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>
如果我在 web.xml 中初始化 Oort,它似乎可以正常工作,如下所示:
<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 中初始化,Oort 应该在 Spring 中初始化。所以我的问题是:
- 我的奥尔特 Spring 配置有什么问题吗?
- 考虑到 Oort 在 web.xml 初始化方面对我有用,这样做有什么问题吗(将 BayeuxServer 配置保留在 Spring 本身)?
- 例子here只是初始化了Oort对象。 cometd 如何知道它是多播还是静态?
cometd 版本:3.0.10
码头版本:9.3.11
感谢任何帮助!
当您通过 Spring(或其他嵌入式代码)创建一个 Oort
对象时,您创建了一个节点,但它没有链接到其他奥尔特节点。
在您的代码中,您调用:
Oort oort = oort();
oort.observeChannel("/user/*");
这将创建节点,将其配置为在通道 /user/*
上观察来自其他节点的消息,但不会将其与其他节点连接。
在您链接的示例中,缺少一块,它调用:
oort.observeComet("http://cloud.cometd.org/cometd");
该调用在示例中被注释掉了,因为作为一个示例,它不知道另一个节点的确切 URI,因此作为示例使用 http://cloud.cometd.org/cometd
,但该 URI 不指向一个现有节点 - 这就是注释掉的原因。
现在,由于您想使用多播,您链接的示例建议使用 OortMulticastConfigurer
。
OortMulticastConfigurer
是您在 web.xml
.
中成功使用的 OortMulticastConfigServlet
使用的内容
让我们看看OortMulticastConfigServlet
如何使用OortMulticastConfigurer
here.
如您所见,OortMulticastConfigurer
已创建、配置并启动。
如果保留默认值,最小代码将变为:
configurer = new OortMulticastConfigurer(oort);
configurer.start();
将这两行添加到您的 BayeuxInitializer.init()
方法中,您应该可以开始了。
我正在按照 this 示例在我们的 Comet 应用程序中尝试通过多播启用奥尔特。我现在只需要奥尔特。不是 Seti 部分。但奥尔特似乎并没有奏效。我启用了 cometd 调试,但没有看到 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:
<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>
如果我在 web.xml 中初始化 Oort,它似乎可以正常工作,如下所示:
<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 中初始化,Oort 应该在 Spring 中初始化。所以我的问题是:
- 我的奥尔特 Spring 配置有什么问题吗?
- 考虑到 Oort 在 web.xml 初始化方面对我有用,这样做有什么问题吗(将 BayeuxServer 配置保留在 Spring 本身)?
- 例子here只是初始化了Oort对象。 cometd 如何知道它是多播还是静态?
cometd 版本:3.0.10
码头版本:9.3.11
感谢任何帮助!
当您通过 Spring(或其他嵌入式代码)创建一个 Oort
对象时,您创建了一个节点,但它没有链接到其他奥尔特节点。
在您的代码中,您调用:
Oort oort = oort();
oort.observeChannel("/user/*");
这将创建节点,将其配置为在通道 /user/*
上观察来自其他节点的消息,但不会将其与其他节点连接。
在您链接的示例中,缺少一块,它调用:
oort.observeComet("http://cloud.cometd.org/cometd");
该调用在示例中被注释掉了,因为作为一个示例,它不知道另一个节点的确切 URI,因此作为示例使用 http://cloud.cometd.org/cometd
,但该 URI 不指向一个现有节点 - 这就是注释掉的原因。
现在,由于您想使用多播,您链接的示例建议使用 OortMulticastConfigurer
。
OortMulticastConfigurer
是您在 web.xml
.
OortMulticastConfigServlet
使用的内容
让我们看看OortMulticastConfigServlet
如何使用OortMulticastConfigurer
here.
如您所见,OortMulticastConfigurer
已创建、配置并启动。
如果保留默认值,最小代码将变为:
configurer = new OortMulticastConfigurer(oort);
configurer.start();
将这两行添加到您的 BayeuxInitializer.init()
方法中,您应该可以开始了。