.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示例代码的基础上修改而来的)

 package org.jboss.as.quickstarts.jms;

 import java.util.Hashtable;

 import javax.jms.Connection;
import javax.jms.ConnectionFactory;
import javax.jms.Destination;
import javax.jms.JMSException;
import javax.jms.MessageConsumer;
import javax.jms.MessageProducer;
import javax.jms.Session;
import javax.jms.TextMessage;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException; public class JbossJMSTest { public static void main(String[] args) throws NamingException, JMSException { final String lOOKUP_CONNECTION_FACTORY_NAME = "lookup.connectionfactory.name";
final String lOOKUP_DESTINATION_NAME = "lookup.destination.name"; ConnectionFactory connectionFactory = null;
Connection connection = null;
Session session = null;
MessageProducer producer = null;
MessageConsumer consumer = null;
Destination destination = null;
TextMessage message = null;
Context context = null; try {
// 创建上下文(默认会从应用的classpath下加载jndi.properties做为环境参数)
context = new InitialContext(); // 把环境参数取出来,后面会用到
Hashtable<String, String> env = (Hashtable<String, String>) context
.getEnvironment(); // 查找连接工厂
connectionFactory = (ConnectionFactory) context.lookup(env
.get(lOOKUP_CONNECTION_FACTORY_NAME)); // 查找目标队列
destination = (Destination) context.lookup(env
.get(lOOKUP_DESTINATION_NAME)); // 创建连接
connection = connectionFactory.createConnection(
env.get(Context.SECURITY_PRINCIPAL),
env.get(Context.SECURITY_CREDENTIALS)); // 创建会话
session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE); // 创建生产者(即发送者)
producer = session.createProducer(destination); // 创建消费者(即接收者)
consumer = session.createConsumer(destination); // 开始连接
connection.start(); // 发送消息
message = session.createTextMessage("菩提树下的杨过,欢迎使用JMS!");
producer.send(message); // 接收消息
message = (TextMessage) consumer.receive(5000); // 打印消息
System.out.println(message.getText()); } catch (NamingException e) {
e.printStackTrace();
} catch (JMSException e) {
e.printStackTrace();
} finally {
// 释放资源
if (context != null) {
context.close();
} if (connection != null) {
connection.close();
} }
} }

JbossJMSTest

运行结果:

最后附加上pom.xml内容:

 <?xml version="1.0"?>

 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion> <groupId>cnblogs</groupId>
<artifactId>helloworld-jms</artifactId>
<version>1.0</version>
<packaging>jar</packaging> <properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties> <dependencies>
<dependency>
<groupId>org.jboss.as</groupId>
<artifactId>jboss-as-jms-client-bom</artifactId>
<version>7.2.0.Final-redhat-8</version>
<type>pom</type>
</dependency>
</dependencies> </project>

pom.xml

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

JMS + jboss EAP 6.2 示例的更多相关文章

  1. 需要安全认证的远程EJB调用示例(Jboss EAP 6.2环境)

    一,Remote EJB 服务接口定义: package yjmyzz.ejb.server.helloworld; public interface HelloWorldService { publ ...

  2. JBoss EAP应用服务器部署方法和JBoss 开发JMS消息服务小例子

    一.download JBoss-EAP-6.2.0GA: http://jbossas.jboss.org/downloads JBoss Enterprise Application Platfo ...

  3. Jboss EAP:native management API学习

    上一节已经学习了CLI命令行来控制JBOSS,如果想在程序中以编码方式来控制JBOSS,可以参考下面的代码,实际上在前面的文章,用代码控制Jboss上的DataSource,已经有所接触了,API与C ...

  4. 如何让jboss eap 6.2+ 的多个war应用共享 jar 包?

    weblogic有一个很贴心的功能,允许把多个war应用共同依赖的jar包,打包一个单独的war,以libary方式部署,然后各应用在weblogic.xml里声明引用该libary即可,这样可大大减 ...

  5. jboss EAP 6.2 + Message Drive Bean(MDB) 整合IBM Webshpere MQ 7.5

    上一篇我们知道了消息驱动Bean的基本用法,实际大型分布式企业应用中,往往会采用高性能的商业Queue产品,比如IBM Webshpere MQ(目前最新版本是7.5 ),下面讲解下如何在Jboss ...

  6. 使用mod_cluster进行apache httpd server和jboss eap 6.1集群配置

    本文简单介绍,使用mod_cluster进行apache httpd server和jboss eap 6.1集群配置.本配置在windows上测试通过,linux下应该是一样的.可能要稍作调整.后面 ...

  7. WebLogic Server 12c相对JBoss EAP 6的优势

    原文来自:https://blogs.oracle.com/middlewareplace/entry/why_should_you_choose_oracle 1.多数据中心部署和集群 WebLog ...

  8. JBoss、Tomcat、JBoss EAP、JBoss AS、wildfly,JBoss EAP安装部署,JBoss各个版本下载,JBoss允许远程访问

    感谢: https://www.cnblogs.com/invlong/p/5983334.html https://blog.csdn.net/mooncarp/article/details/78 ...

  9. jboss eap 6.2+ 版本中 加密datasource密码等敏感信息

    默认情况下,在jboss eap 6.2+ 管理控制台创建datasource后,会在standalone.xml(独立模式)或host.xml(域模式)中以明文保存相关敏感信息. 这会给服务器留下安 ...

随机推荐

  1. Third glance in Go

    在Go語言裏關於數組(Array),切片(Slice)和映射表(Map)的使用是非常常見的.有過其他語言編程背景的人會比較熟悉一下,但是也是因爲過於的熟悉,從而導致一個慣性思維,往往就會踢到“石頭”, ...

  2. SQL Server(一)——数据库基础知识

    SQL:Structured Quety Language SQL SERVER是一个以客户/服务器(c/s)模式访问.使用Transact-SQL语言的关系型数据库管理子系统(RDBMS) DBMS ...

  3. php中文乱码问题

    HTML中文乱码问题的解决方法. 比如有个index.html的页面(这里是指真正的静态页面,修改服务器的……伪静态的请看方案B) 1.在head标签里面加入这句 <head> <m ...

  4. Windows自动关机命令

    winxp中自带了自动关机功能,在开始→运行中使用SHUTDOWN命令 1. 延迟关机关机 shutdown -s -t 120 -s为关机:-t为时间,以秒为单位,120表示2分钟 表示两分钟后关机 ...

  5. oracle DB_LINK

    1.先创建远程数据库服务名(注意,如果服务器既有oracle服务端又有客户端,需要在服务端的tnsnames.ora中配置服务名,否则会报如下错误): SQL> select count(*) ...

  6. linux面试题

    一.填空题: 1. 在Linux系统中,以 文件 方式访问设备 . 2. Linux内核引导时,从文件 /etc/fstab 中读取uu要加载的文件系统. 3. Linux文件系统中每个文件用 i节点 ...

  7. setTimeout()与setInterval()——走马灯效果

    JavaScript中的setTimeout()与setInterval()都是指延时执行某一操作. 但setInterval()指每隔指定时间执行某操作,会循环不断地执行该操作:setTimeout ...

  8. C语言中怎么将文件里的数据创建到(读到)链表中?

    定义的结构体: struct student { ]; //学生学号 ]; //学生姓名 struct student *next; //next 指针 指向 struct student 类型的变量 ...

  9. java 生产者消费者问题 并发问题的解决

    引言 生产者和消费者问题是线程模型中的经典问题:生产者和消费者在同一时间段内共用同一个存储空间,如下图所示,生产者向空间里存放数据,而消费者取用数据,如果不加以协调可能会出现以下情况: 生产者消费者图 ...

  10. FTP定时批量下载文件(SHELL脚本及使用方法 )

    1. 脚本实例 将以下脚本保存为 getftp.sh #!/bin/bash  datesign=`date -d -95day +%Y%m%d` ftp -nv 12.2.2.28 << ...