jboss加载组件_直接从JBoss AS 7组件使用JGroups

jboss加载组件

JGroups是Bela 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

jboss加载组件

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/348767.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

开源PagerSlidingTabStrip的使用Tab与ViewPager的完美结合

链接地址&#xff1a;https://github.com/astuetz/PagerSlidingTabStrip 下载PagerSlidingTabStrip-master 将com.astuetz包&#xff0c;res下的下的资源复制进工程 布局文件&#xff1a;activity_main.xml <RelativeLayout xmlns:android"http://schemas.android.co…

如何处理异常

最近&#xff0c;我与一个朋友进行了讨论&#xff0c;他是一个相对初级但很聪明的软件开发人员。 她问我有关异常处理的问题。 这些问题指出了一种技巧和窍门&#xff0c;肯定有它们的清单。 但是我坚信我们编写软件的方式背后的背景和动机&#xff0c;因此我决定从这种角度写关…

android动画详解

转自&#xff1a;工匠若水 http://blog.csdn.net/yanbober 1 背景 不能只分析源码呀&#xff0c;分析的同时也要整理归纳基础知识&#xff0c;刚好有人微博私信让全面说说Android的动画&#xff0c;所以今天来一发Android应用的各种Animation大集合。英文厉害的请直接移步参考…

凹数科技笔试

一、Java 1、成员变量作用域public/protected/defaultprivate/区别&#xff1f; public&#xff1a;该成员变量或其方法对当前类、同一包、子类、其他包都可见&#xff0c;所有类和对象都可以直接访问。 protected&#xff1a;该成员变量或其方法对当前类、同一包、子类都可…

jsr250-api_JSON处理的Java API(JSR-353)–流API

jsr250-apiJava很快将具有一组标准的API&#xff0c;作为Java EE 7的一部分处理JSON。该标准定义为JSR 353 – JSON处理的Java API &#xff08;JSON-P&#xff09;&#xff0c;目前正在最终批准投票中。 JSON-P提供面向对象和基于流的方法&#xff0c;在本文中&#xff0c;我将…

上传至GitHub

在工作目录下&#xff1a; git init git status git add . git commit -m"IndoorLocation" git status git remote add origin githttps://github.com/HiSunny/HelloInLoc.git git pull https://github.com/HiSunny/HelloInLoc.git master git push https://…

弹簧和线程:事务

为了能够在我们的线程中使用事务&#xff0c;我们需要了解事务如何在spring中工作。 spring中的事务信息存储在ThreadLocal变量中。 因此&#xff0c;这些变量特定于单个线程上正在进行的事务。 当涉及由单个线程运行的动作时&#xff0c;事务将在分层调用的Spring组件之间传播…

eclipse误删文件

右键工程--->restore from local history

Activity的LaunchMode和taskAffinity

Thanks to:http://www.cnblogs.com/SteveMing/archive/2012/04/24/2459575.html 【原】Activity的LaunchMode和taskAffinity 做项目到现在都一直没有理解LaunchMode有什么用&#xff0c;或许根本就没真正花心思去看&#xff0c;所以今天把这部分整理下。 设置Activity的Launc…

RelativeLayout重要属性

RelativeLayout用到的一些重要的属性&#xff1a;第一类:属性值为true或falseAndroid:layout_centerHrizontal 水平居中android:layout_centerVertical 垂直居中android:layout_centerI…

gradle spring_使用Gradle的简单Spring MVC Web应用程序

gradle spring除了我们现在将使用Spring MVC而不是原始servlet之外&#xff0c;该文章将与我们之前的文章Simple Gradle Web Application相似。 使用Gradle运行基本的Spring MVC应用程序确实很容易。 您可以在Github上下载本教程的源代码。 先决条件 安装Gradle 我们的基本项…

绘制Nine-Patch图片

Android sdk----->tools----->draw9patch.bat 打开draw9patch.bat文件 File--》open 0-patch将要绘制的.png图片加载进来 ctrl 图片边缘点击鼠标左键 绘制出线条&#xff0c;表示图片需要被拉伸的部分 File--save 9-patch 文件名pp.9.png。

jms spring_JMS和Spring:有时很重要的小事情

jms springJmsTemplate和DefaultMessageListenerContainer是用于访问JMS兼容MOM的Spring帮助器。 他们的主要目标是在JMS API之上形成一层&#xff0c;并处理诸如事务管理/消息确认之类的基础结构&#xff0c;并隐藏JMS API的某些重复和笨拙的部分&#xff08;保留在那里&#…

重温1 Android系统架构及版本

1、Linux内核层(Linux Kernel) 为Android设备的各种硬件提供了底层驱动&#xff0c;Display Driver/Camera Driver/Bluetooth Driver/Flash Memory Driver/Binder(IPC)Driver/USB Driver/Keypad Driver/WiFi Driver/Audio Drivers/Power Management 2、Libraries/Android Run…

REST资源何时应获得其自己的地址?

在纯粹的REST方法中&#xff0c;所有端点&#xff08;起始端点除外&#xff09;都是不透明的&#xff0c;不需要发布其各种详细信息。 即使使用这种方法&#xff0c;本文中的要点也很重要&#xff0c;因为服务器逻辑将必须确定何时需要结束点。 介绍 在REST体系结构中&#xf…

重温2 在Activity中使用Menu

1、引用string.xml中的字符串 1) 代码中 R.string.hello_world 2) XML中string/hello_world 2、AndroidManifest <activityandroid:name".MainActivity"android:label"string/app_name" ><intent-filter><action android:name"andr…

玩转大数据22:常见的关联规则挖掘算法

引言 关联规则挖掘是数据挖掘中的一种重要技术&#xff0c;主要用于发现数据集中项之间的有趣关系。关联规则挖掘在许多领域都有广泛的应用&#xff0c;如市场篮子分析、推荐系统等。常见的关联规则挖掘算法包括Apriori算法和FP-Growth算法。 一、Apriori算法 关联规则挖掘是…

重温3 Activity Intent 向下传递数据 向上传递数据

1、使用Intent向下传递数据 Intent intent new Intent(MainActivity.this,SecongActivity.class); intent.putExtra("data_from_MainActivity","I am MainActivity"); startActivity(intent);从SecondActivity取数据 Intent intent getIntent(); String …

junit 循环测试_重复运行JUnit测试而没有循环

junit 循环测试最近&#xff0c;我遇到了一个问题&#xff0c;我不得不编写一种方法的测试&#xff0c;该方法需要计算在一定可能性范围内的随机分布值1 。 更准确地说&#xff0c;如果您假设签名看起来像 interface RandomRangeValueCalculator {long calculateRangeValue( l…

Java 9:欢迎来到Module World

Java 9已于9月21日正式发布&#xff0c;Eclipse从Eclipse Oxygen.1a&#xff08;4.7.1a&#xff09;支持Java 9&#xff0c;让我们进入模块世界。 从此处下载Java 9&#xff0c;然后将其添加到Eclipse Installed JRE中&#xff0c;如下所示 就是这样&#xff0c;我们很高兴在…