前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >JMS + jboss EAP 6.2 示例

JMS + jboss EAP 6.2 示例

作者头像
菩提树下的杨过
发布于 2018-01-24 03:28:36
发布于 2018-01-24 03:28:36
1.7K00
代码可运行
举报
运行总次数:0
代码可运行

.Net中如果需要消息队列功能,可以很方便的使用微软自带的MSMQ,对应到Java中,这个功能就是JMS(Java Message Service). 下面以Jboss EAP 6.2环境,介绍一下基本的用法:

JMS有二种基本的使用模式,

一种是点对点模式(即“一条”消息只能从“一个”发送方传输到“一个”接收方) - 这种模式下,发送方、接收方不必同时在线,消息在未取回走,一直存放在队列中。

另一种是发布/订阅模式,即一条消息(该模式下,称为“主题”),被一个发送方发送后,如果有多个接收方订阅了,这些接收方都能收到消息 - 这种模式下,发布者和订阅都必须同时在线,否则接收不到消息。

本文主要演示“点对点”模式的基本使用

一、jboss上创建相应的用户

JMS要求用户安全认证,即不允许随便谁都向队列里发送/接收,先在Jboss里创建一个用户。

%JBOSS_HOME%/bin/add-user.sh (mac/linux机环境,如果是windows,则是add-user.bat)

执行这个命令后,会出现文字交互界面,参考下图:

将创建一个msgUser的用户,提示:jboss eap 6.2安全性比较高,要求用户的密码满足复杂性要求(比如: Password1! ),如果太简单的密码,将创建失败

输完密码后,会提示该用户是否加入某个组,这里输入组名:guest (后面创建queue时会用到),参考下图:

注:上图中最后一个加密字符串,最好记录一下,某些应用要求安全认证时,需要在配置中配置该串(本文中暂时用不到)

创建完成后,实质上是在%JBOSS_HOME%/standalone/configuration的application-roles.properties、application-users.properties这二个文件中加了一些内容:

msgUser=5f7e011c53bb155cf99b9eeffccdad4d (这是application-users.properties中增加的内容)

msgUser=guest (这是application-roles.properties中增加的内容)

二、在jboss中创建队列

把%JBOSS_HOME%/standalone/configuration下的standalone.xml先改个名,然后把standalone-full.xml改成standalone.xml,启动jboss (即:要以standalone-full.xml中的内容做为配置启动jboss)

a)  图形界面方式

进入jboss的管理控制台,找到Profile -> Subsystems -> Messageing -> Destinations -> 查看 (参考下图)

默认情况,应该没有任何Queue

点击“添加”,Name这里输入myQueue(这个可以随便改),JNDI Names这里输入 java:jboss/exported/queue/mytest (最后面的mytest可以随便改,前面的部分建议不要改)

这样就创建一个Queue,到目前为止,还没看到跟安全认证相关的设置,切换到Seurity Settings面板

可以看到,默认情况下,创建的Queue允许"guest"角色 "发送"消息(Send这里是true)、"接收"消息(Consume这里是true),这就是为什么我们在第一步,要把msgUser这个用户加入guest组的原因

b) standalone.xml 配置方式

其实刚才的操作,最后的结果就是在standalone.xml中生成了如下代码:

<subsystemxmlns="urn:jboss:domain:messaging:1.4">

          ...

<security-settings>

<security-setting match="#">

<permission type="send" roles="guest"/>

<permission type="consume" roles="guest"/>

</security-setting>

</security-settings>

      ...

<jms-destinations>

<jms-queue name="myQueue">

//注:这一行建议也手动加上,对于单纯向Queue发送消息而言,加不加效果一样,

        //但是对于Message-drive-bean不加,偶尔会发现无法从queue/mytest接收到消息

<entry name="queue/mytest"/>  

<entryname="java:jboss/exported/queue/mytest"/>

<durable>true</durable>

</jms-queue>

</jms-destinations>

</hornetq-server>

</subsystem>

熟悉这个结构后,可以直接在standalone.xml中修改

c) 单独在deployments目录下部署 xxx-jms.xml (注:必须是以-jms.xml结尾的文件) 

内容如下:

<?xmlversion="1.0"encoding="UTF-8"?>

<messaging-deploymentxmlns="urn:jboss:messaging-deployment:1.0"><hornetq-server><jms-destinations><jms-queuename="fred"><entryname="jms/queue/fred"/><entryname="java:jboss/exported/jms/queue/fred"/></jms-queue></jms-destinations></hornetq-server></messaging-deployment>

注:经实际测试,建议所有内容都写在一行上,不加要其它任何空格或Tab字符,否则部署会失败(jboss EAP 6.1+版本对xml的校验极严格,哪怕是不可见字符,只要有一个字符校验失败,整个部署将失败)

另外:该方式部署的queue,在管理控制界面上看不到,但是代码可访问

三、编写测试代码

3.1 jndi.properties

要连接到队列,必然需要一些相关的参数,比如:队列地址、用户名、密码、连接“字符串”等,如果硬编码在java代码中,显然不好,我们可以在src目录下,新建一个jndi.properties文件,内容参考下图:

java.naming.factory.initial=org.jboss.naming.remote.client.InitialContextFactory

java.naming.provider.url=remote\://localhost\:4447

java.naming.security.principal=msgUser

java.naming.security.credentials=Password1!

lookup.connectionfactory.name=jms/RemoteConnectionFactory

lookup.destination.name=queue/mytest

前面java开头是的必须的,后面的二行,是我自己加的(当然大家也可以自行添加任何需要的属性)

3.2 编写测试代码

(以下代码是在jboss-quickstart示例代码的基础上修改而来的)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 1 package org.jboss.as.quickstarts.jms;
 2 
 3 import java.util.Hashtable;
 4 
 5 import javax.jms.Connection;
 6 import javax.jms.ConnectionFactory;
 7 import javax.jms.Destination;
 8 import javax.jms.JMSException;
 9 import javax.jms.MessageConsumer;
10 import javax.jms.MessageProducer;
11 import javax.jms.Session;
12 import javax.jms.TextMessage;
13 import javax.naming.Context;
14 import javax.naming.InitialContext;
15 import javax.naming.NamingException;
16 
17 
18 
19 public class JbossJMSTest {
20 
21     public static void main(String[] args) throws NamingException, JMSException {
22 
23         final String lOOKUP_CONNECTION_FACTORY_NAME = "lookup.connectionfactory.name";
24         final String lOOKUP_DESTINATION_NAME = "lookup.destination.name";
25 
26         ConnectionFactory connectionFactory = null;
27         Connection connection = null;
28         Session session = null;
29         MessageProducer producer = null;
30         MessageConsumer consumer = null;
31         Destination destination = null;
32         TextMessage message = null;
33         Context context = null;
34 
35         try {
36             // 创建上下文(默认会从应用的classpath下加载jndi.properties做为环境参数)
37             context = new InitialContext();
38 
39             // 把环境参数取出来,后面会用到
40             Hashtable<String, String> env = (Hashtable<String, String>) context
41                     .getEnvironment();
42 
43             // 查找连接工厂
44             connectionFactory = (ConnectionFactory) context.lookup(env
45                     .get(lOOKUP_CONNECTION_FACTORY_NAME));
46 
47             // 查找目标队列
48             destination = (Destination) context.lookup(env
49                     .get(lOOKUP_DESTINATION_NAME));
50 
51             // 创建连接
52             connection = connectionFactory.createConnection(
53                     env.get(Context.SECURITY_PRINCIPAL),
54                     env.get(Context.SECURITY_CREDENTIALS));
55 
56             // 创建会话
57             session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
58 
59             // 创建生产者(即发送者)
60             producer = session.createProducer(destination);
61 
62             // 创建消费者(即接收者)
63             consumer = session.createConsumer(destination);
64 
65             // 开始连接
66             connection.start();
67 
68             // 发送消息
69             message = session.createTextMessage("菩提树下的杨过,欢迎使用JMS!");
70             producer.send(message);
71 
72             // 接收消息
73             message = (TextMessage) consumer.receive(5000);
74 
75             // 打印消息
76             System.out.println(message.getText());
77 
78         } catch (NamingException e) {
79             e.printStackTrace();
80         } catch (JMSException e) {
81             e.printStackTrace();
82         } finally {
83             // 释放资源
84             if (context != null) {
85                 context.close();
86             }
87 
88             if (connection != null) {
89                 connection.close();
90             }
91 
92         }
93     }
94 
95 }

运行结果:

最后附加上pom.xml内容:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 1 <?xml version="1.0"?>
 2 
 3 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 4     xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
 5     <modelVersion>4.0.0</modelVersion>
 6 
 7     <groupId>cnblogs</groupId>
 8     <artifactId>helloworld-jms</artifactId>
 9     <version>1.0</version>
10     <packaging>jar</packaging>
11 
12     <properties>
13         <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
14     </properties>
15 
16     <dependencies>
17         <dependency>
18             <groupId>org.jboss.as</groupId>
19             <artifactId>jboss-as-jms-client-bom</artifactId>
20             <version>7.2.0.Final-redhat-8</version>
21             <type>pom</type>
22         </dependency>
23     </dependencies>
24 
25 </project>

示例源代码下载:helloworld-jms.zip

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2014-02-22 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
ejb3: message drive bean(MDB)示例
上一篇已经知道了JMS的基本操作,今天来看一下ejb3中的一种重要bean:Message Drive Bean(mdb) 如果要不断监听一个队列中的消息,通常我们需要写一个监听程序,这需要一定的开发量,而且如果要实现高并发处理,也不易扩展,而MDB则自动实现了该功能,简单点讲,MDB的应用部署到jboss后,能自动监听目标队列,一旦有消息接收,会触发onMessage事件,开发人员可以在该事件处理中扩展自己的业务逻辑. 一、定义一个MDB 1 package mdb; 2 3 4 5 im
菩提树下的杨过
2018/01/24
1.4K0
ejb3: message drive bean(MDB)示例
jboss EAP 6.2 + Message Drive Bean(MDB) 整合IBM Webshpere MQ 7.5
上一篇我们知道了消息驱动Bean的基本用法,实际大型分布式企业应用中,往往会采用高性能的商业Queue产品,比如IBM Webshpere MQ(目前最新版本是7.5 ),下面讲解下如何在Jboss EAP 6.2 版本上整合Webshpere MQ 7.5 一、修改jboss的standalone-full.xml a) 添加IBM的resource-adapters 找到<subsystem xmlns="urn:jboss:domain:resource-adapters:1.1"/> 改成下面这样(
菩提树下的杨过
2018/01/24
2K0
jboss EAP 6.2 + Message Drive Bean(MDB)  整合IBM Webshpere MQ 7.5
【EJB学习笔记】——JMS和消息驱动Bean
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/huyuyang6688/article/details/50996458
DannyHoo
2018/09/13
6340
【EJB学习笔记】——JMS和消息驱动Bean
需要安全认证的远程EJB调用示例(Jboss EAP 6.2环境)
一,Remote EJB 服务接口定义: 1 package yjmyzz.ejb.server.helloworld; 2 3 public interface HelloWorldService { 4 5 public String sayHello(String name); 6 7 } 实现: 1 package yjmyzz.ejb.server.helloworld; 2 3 import javax.annotation.security.RolesAllowe
菩提树下的杨过
2018/01/24
6640
Spring JMS的使用
我们都知道使用Spring可以简化我们的开发,同样的使用Spring也可以集成JMS来连接ActiveMQ,这里说明一下几个需要用到的类:
端碗吹水
2020/09/23
8880
Spring JMS的使用
JBoss WildFly 7 连接到 ActiveMQ 5.9
我们最近发现大量的客户都有一个同样的问题:在运行于JBoss Wildfly 7中的HornetQ JMS实现和独立运行的ActiveMQ服务器之间,如何才能建立一个桥接。ActiveMQ作为一个独立运行的消息代理(message broker),一直是一个可靠的选择。而且随着Red Hat已经收购了Fusesource(译者注:Fusesource是ActiveMQ项目的维护组织,Red Hat此前在2006年收购了JBoss,现在JBoss和Fusesource都是Red Hat旗下的开源组织),在等待JBoss AMQ版本的ActiveMQ推出期间(译者注:JBoss基于ActiveMQ定制了一个新MQ,官方名称为JBoss A-MQ),这个问题尤其突出。
星哥玩云
2022/07/03
1.1K0
JBoss WildFly 7 连接到 ActiveMQ 5.9
如何让jboss eap 6.2+ 的多个war应用共享 jar 包?
weblogic有一个很贴心的功能,允许把多个war应用共同依赖的jar包,打包一个单独的war,以libary方式部署,然后各应用在weblogic.xml里声明引用该libary即可,这样可大大减少打包后的war文件尺寸,可以加快部署的上传进度,对web server而言,这类共用jar包只加载一次,也节省资源。 但是jboss下想达到类似的功能就要复杂很多了,先来一个简单的示例: 一、基础篇 1.1 假如我们先开发了一个工具库,打包后生成的mylib.jar ,为了减少各种依赖项的干扰,这个工程不依赖
菩提树下的杨过
2018/01/18
1.7K0
如何让jboss eap 6.2+ 的多个war应用共享 jar 包?
JMS的常用方法
import javax.jms.Connection; import javax.jms.ConnectionFactory; import javax.jms.Destination; import javax.jms.Message; import javax.jms.MessageConsumer; import javax.jms.MessageListener; import javax.jms.Session; import javax.jms.TextMessage; import org
用户3003813
2018/09/06
6990
spring 整合JMS
(1)创建工程springjms_producer,在POM文件中引入SpringJms 、activeMQ以及单元测试相关依赖
一点博客
2019/07/24
6120
JMS--ActiveMQ的简单使用
消息中间件利用高效可靠的消息传递机制进行平台无关的数据交流,并基于数据通信来进行分布式系统的集成。通过提供消息传递和消息排队模型,它可以在分布式环境下扩展进程间的通信。对于消息中间件,常见的角色大致也就有 Producer(生产者)、Consumer(消费者)。消息队列中间件是分布式系统中重要的组件,主要解决应用解耦,异步消息,流量削锋等问题,实现高性能,高可用,可伸缩和最终一致性架构。
宋先生
2019/07/18
1.1K0
Spring JMS---三种消息监听器
链接:https://blog.csdn.net/u012562943/article/details/51424232
用户5224393
2019/08/13
2.5K0
消息队列中间件(二)使用 ActiveMQ
Active MQ 是由 Apache 出品的一款流行的功能强大的开源消息中间件,它速度快,支持跨语言的客户端,具有易于使用的企业集成模式和许多的高级功能,同时完全支持 JSM1.1 和 J2EE1.4 。
未读代码
2019/11/04
1.7K0
消息队列中间件(二)使用 ActiveMQ
干货--JMS(java消息服务)整合Spring项目案例
Sprng-jms消息服务小项目 所需的包: spring的基础包 spring-jms-xx包 spring-message–xx包 commons-collection-xx包 commons-pool2-xx包 aop切面的包: spring-aop,spring-aspect,aopalliance,aspectjrt.jar,aspectjweaver.jar 配置: 1.配置ConnectionFactory 2.
汤高
2018/01/11
1.8K0
干货--JMS(java消息服务)整合Spring项目案例
ActiveMQ的安装与使用。
4、ActiveMQ的安装。官方网址:http://activemq.apache.org/
别先生
2019/09/29
1.8K0
ActiveMQ的安装与使用。
『学习笔记』WebLogic 中 JMS 服务的配置与应用
🎈今日推荐——https://cloud.tencent.com/developer/article/2466203
数字扫地僧
2024/11/18
1260
『学习笔记』WebLogic 中 JMS 服务的配置与应用
JMS学习之路(一):整合activeMQ到SpringMVC
JMS的全称是Java Message Service,即Java消息服务。它主要用于在生产者和消费者之间进行消息传递,生产者负责产生消息,而消费者负责接收消息。把它应用到实际的业务需求中的话我们可以在特定的时候利用生产者生成一消息,并进行发送,对应的消费者在接收到对应的消息后去完成对应的业务逻辑。对于消息的传递有两种类型,一种是点对点的,即一个生产者和一个消费者一一对应;另一种是发布/订阅模式,即一个生产者产生消息并进行发送后,可以由多个消费者进行接收。
肖哥哥
2019/02/22
1.6K1
JMS学习之路(一):整合activeMQ到SpringMVC
ActiveMQ消息队列 原
        下载完成后解压缩apache-activemq-5.5.1-bin.zip,然后双击apache-activemq-5.5.1\bin\activemq.bat运行ActiveMQ程序。    
尚浩宇
2018/08/17
6420
ActiveMQ消息队列
                                                                            原
深入浅出JMS(四)--Spring和ActiveMQ整合的完整实例
第一篇博文深入浅出JMS(一)–JMS基本概念,我们介绍了JMS的两种消息模型:点对点和发布订阅模型,以及消息被消费的两个方式:同步和异步,JMS编程模型的对象,最后说了JMS的优点。
程序猿小亮
2021/01/29
5860
activitemq整合spring
image.png activitemq整合spring 一.activmq的点对点模型 image.png pom.xml: <?xml version="1.0" encoding="UTF-8"
Dream城堡
2019/01/28
4830
activitemq整合spring
Java消息队列--JMS概述
1、什么是JMS  JMS即Java消息服务(Java Message Service)应用程序接口,是一个Java平台中关于面向消息中间件(MOM)的API,用于在两个应用程序之间,或分布式系统中发送消息,进行异步通信。Java消息服务是一个与具体平台无关的API,绝大多数MOM提供商都对JMS提供支持(百度百科给出的概述)。我们可以简单的理解:两个应用程序之间需要进行通信,我们使用一个JMS服务,进行中间的转发,通过JMS 的使用,我们可以解除两个程序之间的耦合。 2、JMS的优势   Asynch
九灵
2018/03/09
2.2K0
Java消息队列--JMS概述
相关推荐
ejb3: message drive bean(MDB)示例
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文