直接从JBoss AS 7组件使用JGroups

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

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

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

相关文章

LeetCode(28): 实现strStr()

Easy&#xff01; 题目描述&#xff1a; 实现 strStr() 函数。 给定一个 haystack 字符串和一个 needle 字符串&#xff0c;在 haystack 字符串中找出 needle 字符串出现的第一个位置 (从0开始)。如果不存在&#xff0c;则返回 -1。 示例 1: 输入: haystack "hello"…

vue2.0 配置build项目打包目录、资源文件(assets\static)打包目录

vue项目默认的打包路径&#xff1a;根目录下的dist文件夹下&#xff1b; 但是在项目开发中&#xff0c;我们肯定希望项目提交到svn目录或者git目录下&#xff0c;否则每次复制过去&#xff0c;太麻烦了&#xff1b; 那怎么配置打包路径呢&#xff1f;下面来看看&#xff1b; 我…

打印机网络共享服务器不稳定,共享打印机无法访问怎么办,教你一招问题立马解决...

基本上只有本地打印机共享才会出现下面的问题&#xff0c;通过网线连接和打印机服务器连接的打印机不会出现此类问题&#xff0c;多个电脑连接网络打印机本质上还是各个电脑连接的本地打印机。一、 设置打印机共享时出现错误连接好本地打印机后&#xff0c;想要共享给同事使用&…

css多浏览常见问题

关于CSS对各个浏览器兼容已经是老生常谈的问题了, 网络上的教程遍地都是.以下内容没有太多新颖, 纯属个人总结, 希望能对初学者有一定的帮助. 一、CSS HACK 以下两种方法几乎能解决现今所有HACK. 1, !important 随着IE7对!important的支持, !important 方法现在只针对IE6的…

0 win10重装partition_教你在安装WIN10系统中所遇到问题处理方法

光盘安装系统时提示&#xff1a;windows 无法安装到这个磁盘。选中的磁盘采用 GPT 分区形式问题&#xff1a;一般为笔记本光盘安装提示 win7 或 win8系统时 windows 无法安装到这个磁盘&#xff0c;选中的磁盘采用 GPT分区形式。(光盘 PE模式分区后都是主分区&#xff0c;Ghost…

常用matlab函数(不定时更新)

直方图类&#xff1a;histc 直方图分组 示例 histc(a,0:1:10) 意义&#xff1a;将a&#xff08;矩阵或向量&#xff09;分组&#xff0c;分组设置为 0-1 1-2 2-3 ….. 9-10,(10-11)百分位prctile 示例 prctile(a,15) prctile(a,50) prctile(a,75) 意义 求出a向量或矩阵…

Heroku和Java –从新手到初学者,第2部分

问题 所以过了几天&#xff0c;我可以回到我的Recaps小项目。 我从检查日志开始&#xff0c;发现了以下内容&#xff1a; 2012-03-04T01:52:5100:00 heroku[web.1]: Idling 2012-03-04T01:52:5300:00 heroku[web.1]: Stopping process with SIGTERM 2012-03-04T01:53:0300:00 …

global.min.css,css3-媒体查询样式不覆盖原始样式

我正在尝试对正在建立的网站使用一些媒体查询。 但是&#xff0c;我遇到的问题是&#xff0c;实际上正在应用媒体查询样式时&#xff0c;它们却被覆盖了。 我无法告诉我原因&#xff0c;因为我使用的是相同的选择器。 谁能指出我没看到的东西&#xff1f;原始CSS#global-wrappe…

CSS margin 外边距 属性的位置关系

padding&#xff1a;内边距margin &#xff1a;外边距 margin:10px; 所有 4 个外边距都是 10px ******************************************* margin:10px 5px; 上外边距和下外边距是 10px右外边距和左外边距是 5px ******************************************** margin:10px…

windows无法连接到某个wifi_windows无法连接到无线网络怎么办【解决方法】

无论是win7、win8还是win10系统的电脑&#xff0c;人们在使用它的时候&#xff0c;总会先开机&#xff0c;然后再去连接无线网络。当然&#xff0c;在连接的过程中也可能产生各种各样的问题&#xff0c;例如说无法正常连接到无线网络。常见的原因有密码输入错误&#xff0c;或者…

C语言博客作业--字符数组

一、PTA实验作业 题目1&#xff1a;7-1 字符串转换成十进制整数 1. 本题PTA提交列表 2. 设计思路 3.代码截图 4.本题调试过程碰到问题及PTA提交列表情况说明。 这个问题我看了好久&#xff0c;试了很多的的错误点&#xff0c;答案和我预料的一样&#xff0c;所以我重新看了一遍…

微信公招访问我服务器的那个端口,查看谁在使用某个网络端口

可以通过"netstat -anp" 来查看哪些端口被打开。(注&#xff1a;加参数-n会将应用程序转为端口显示&#xff0c;即数字格式的地址&#xff0c;如&#xff1a;nfs->2049, ftp->21&#xff0c;因此可以开启两个终端&#xff0c;一一对应一下程序所对应的端口号)若…

Java 7 Update 21安全改进的详细信息

甲骨文昨天发布了三个Java更新 。 重要的是要注意它们包含一些与安全性相关的更改。 一段时间以来&#xff0c;已经宣布了其中的大多数更改&#xff0c;并且首先要注意的是Oracle按计划交付。 甲骨文公司Java平台安全经理Milton Smith最近在DevoxxUK上做了题为“ 用Java保护…

css中px、em和rem的区别总结

前言 em 和 rem 都是灵活可扩展的单位&#xff0c;由浏览器转换为像素值&#xff0c;取决于设计中的字体大小&#xff0c;如果使用值 1em 或 1rem &#xff0c;它可以被浏览器转换为从 16px 到 160px 或其他任意值。浏览器使用 1px &#xff0c;那么 1px 始终显示为完全 1px。…

du的原理 linux_Linux 文件系统管理

1、文件系统介绍1&#xff09;、Linux 文件系统特性super block&#xff08;超级块&#xff09;记录整个文件系统的信息。包括 block 与 inode 的总量&#xff0c;已经使用的 block 和 inode 的数量&#xff0c;未使用的 block 和 inode 的数量&#xff0c;block 与 inode 的大…

看病

看病 链接&#xff1a;http://ybt.ssoier.cn:8088/problem_show.php?pid1371时间限制: 1000 ms 内存限制: 65536 KB【题目描述】 有个朋友在医院工作&#xff0c;想请BSNY帮忙做个登记系统。具体是这样的&#xff0c;最近来医院看病的人越来越多了&#xff0c;因此很多…

java 服务器读取客户端文件,java 服务器读取客户端文件

弹性云服务器 ECS弹性云服务器(Elastic Cloud Server)是一种可随时自助获取、可弹性伸缩的云服务器&#xff0c;帮助用户打造可靠、安全、灵活、高效的应用环境&#xff0c;确保服务持久稳定运行&#xff0c;提升运维效率三年低至5折&#xff0c;多种配置可选了解详情项目和企业…

一些基于Java的AI框架:Encog,JavaML,Weka

在进行编程收集情报工作时&#xff0c;我发现自己花了很多时间将Python代码转换为Java&#xff0c;由于通常对我的进度缓慢感到不耐烦&#xff0c;所以我一直在寻找替代方法。 我发现3&#xff1a; Encog – Heaton研究 Java语言 威卡 这绝不是一项深入的调查&#xff0c;…

input select 值得绑定与获取

<div style"margin-top:100px"><!--Input 值得绑定--><div id"app20"><input id"txt01" v-model"message" placeholder"请输入..." /><span>{{ message }}</span><textarea id"…

box-shadow IE8兼容处理

根据canisue&#xff08;http://caniuse.com/#searchbox-shadow&#xff09;&#xff0c;box-shadow兼容性如下图所示&#xff1a; 测试代码&#xff1a; 1 <!DOCTYPE html>2 <html>3 4 <head>5 <meta charset"UTF-8">6 …