直接从JBoss AS 7组件使用JGroups

JGroupsBela Ban的用于可靠消息交换的软件,该软件高度可配置,可以使用TCP或UDP作为传输协议。 基本上,您在多个客户端上运行JGroup,它们构成一个集群,它们可以在集群内发送和接收消息。

JGroups由JBoss Infinispan内部使用。 但是,与JGroups不同,Infinispan添加了分布式缓存语义(复制/分布式模式,条目无效,事务行为,Map访问API等)。它甚至允许您将集群用作计算网格。

依次使用Infinispan提供JBoss AS 7集群功能。 因此,这意味着底层JGroups子系统可以并且使用标准JBoss AS 7 Standalone * .xml文件进行配置。 您可以从Java EE组件(例如EJB)访问Infinispan缓存,而不会出现此处所述的任何问题。

但是,在某些情况下,您只想使用基础JGroups消息传递而不是Infinispan为您提供的所有缓存语义。 这是事情变得越来越复杂的地方。 您始终可以直接使用JGroups,并将其配置存储为应用程序本地资源。 是否违反或违反Java EE规范可能会引起争议,Java EE规范规定应用程序不应管理低级连接,生成线程,打开套接字等。应用服务器-它还使我们可以使用一个配置文件,而不是将其分布在多个位置。 因此,问题是– 如何从我们的EJB应用程序访问JGroups子系统? 整个解决方案涉及几个步骤,下面将对其进行描述。 如果要检查整个工作项目, 请查看我的JGroups AS7 Github项目

1.编写自定义JBoss AS 7服务激活器

该激活器( JGroupsChannelServiceActivator.java )将做两件事:

  • 使用JBoss协议配置创建实际的JGroups通道,
  • 将新创建的JGroups通道绑定到JNDI。

第一部分在JGroupsChannelServiceActivator#createChannel(-) 。 我不知道ServiceActivator或JBoss AS 7模块的其他内部组件,但从中您可以看到:

InjectedValue<ChannelFactory> channelFactory = new InjectedValue<>();
ServiceName serviceName = ChannelFactoryService.getServiceName(STACK_NAME);
ChannelService channelService = new ChannelService(CHANNEL_NAME, channelFactory);

target.addService(channelServiceName, channelService)
      .addDependency(serviceName, ChannelFactory.class, channelFactory).install();

似乎它会创建一个新服务( ChannelService ),并让JBoss MSC在安装过程中自动注入其依赖的ChannelFactoryChannelFactory将使用UDP协议栈。 第二部分在JGroupsChannelServiceActivator#bindChannelToJNDI(-)完成, JGroupsChannelServiceActivator#bindChannelToJNDI(-)新创建的Channel实例绑定到用户定义位置下的JNDI。 在我们的例子中是java:jboss/channel/myChannel

2.注册激活器

现在,我们需要告诉JBoss AS 7调用我们的自定义激活器。 使用标准化的JDK ServiceLoader API完成 。 简而言之,这意味着我们需要提供一个带有我们激活器类完全限定名称的META-INF/services/org.jboss.msc.service.ServiceActivator文件。 看一下这个例子

3.将必需的模块添加到我们的应用程序

好的,所以我们有一个应该做魔术的活化剂。 如果我们尝试这样部署它,我们将获得一堆ClassNotFoundException 。 这是因为JBoss模块。 我们的应用程序未包含所有这些JBoss工件,例如JGroups,ServiceActivator API和与JNDI相关的类。 我们不想用这些库弄乱我们的应用程序–我们只想定义JBoss AS 7本身提供的模块依赖性。 我们在META-INF/jboss-deployment-structure.xml 。 请注意,我们可以在MANIFEST.MF Dependencies:部分中执行此操作,但是Intellij IDEA似乎无法与Maven生成的MANIFEST.MF一起使用

<?xml version='1.0' encoding='UTF-8'?>
<jboss-deployment-structure>
    <deployment>
        <dependencies>
            <module name='org.jgroups'/>
            <module name='org.jboss.as.naming'/>
            <module name='org.jboss.as.clustering.jgroups'/>
        </dependencies>
    </deployment>
</jboss-deployment-structure>

访问JChannel,ChannelService等需要JGroups模块。JNDI绑定代码需要命名模块。

4.使用JGroups Channel开发EJB

JGroupsSampleDataProducer是一个Singleton EJB,它显示了如何访问JGroups通道。 由于具有JNDI绑定,因此相当简单。 我们可以使用:

@Resource(lookup = 'java:jboss/channel/myChannel')
private JChannel channel;

在那里。 该EJB注册一个计时器,该计时器每2秒被调用一次,并发送一些随机的String消息。

注意,我们不必显式启动JChannel 。 我们只是注入并直接使用它。 看一下步骤1中在我们的激活器中使用的ChannelService 。它的启动方法如下:

@Override
protected void start() throws Exception {
    (...)
    if (this.channel.getProtocolStack().findProtocol(STATE_TRANSFER.class, STATE.class, STATE_SOCK.class) != null) {
        this.channel.connect(this.id, null, STATE_TRANSFER_TIMEOUT);
    } else {
        this.channel.connect(this.id);
    }

因此, 该服务将自动连接到我们的频道 。 除了使用ChannelService我们还可以开发自己的服务,该服务将负责启动和停止我们的频道,或者甚至可以将此责任移交给频道的实际用户。

5.部署EJB-JAR

现在,我们准备将应用程序部署到JBoss AS 7服务器。 这里最重要的部分是确保我们的服务器将以适当的配置运行,这意味着已定义了JGroups协议栈。 使用<subsystem xmlns='urn:jboss:domain:jgroups:1.1'> 。 我正在使用JBoss AS 7.1.1和standalone-full-ha.xml配置。

**注意:**因为Intellij IDEA不允许您像Eclipse一样轻松地更改JBoss AS的配置文件,所以我们需要使用VM选项来指定它: -Djboss.server.default.config=standalone-full-ha.xml

我们还需要确保JGroups将使用IPv4 (有时会选择IPv6,这可能会导致某些奇怪而又难以解决的问题。)为此,请在服务器配置中添加-Djava.net.preferIPv4Stack=true选项。

6.运行客户端应用程序

您可以在此处找到一个相当简单的客户端代码。 它只是使用指定的配置文件连接到JGroups集群。 请注意,对于服务器和客户端,应将多播端口号和地址设置为相同的值。 另外,请记住在运行客户端时添加-Djava.net.preferIPv4Stack=true VM选项。 希望本教程对您有所帮助,并且可以节省一些配置时间。 十分感谢贝拉班了很多重要的建议和保罗·费拉罗指着我初步认识论坛主题(像这样这样就类似的问题之一)。

参考:Piotr Nowicki主页博客上,我们的JCG合作伙伴 Piotr Nowicki 直接从JBoss AS 7组件直接使用JGroups

翻译自: https://www.javacodegeeks.com/2013/03/using-jgroups-directly-from-jboss-as-7-component.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值