1)在使用jboss8即WildFly进行MDB的试验时首先要在jboss8中配置jms 队列。

我使用的是修改配置文件的方式配置Jms Queue队列。

进入jboss8 安装目录的standalone\configuration文件夹下:

因为使用的是standalone-full.xml文件,所以将该文件的文件名修改为standalone.xml

搜索该文件下<hornetq-server>节点,在该节点内的末尾处加入:

                <jms-destinations>
<jms-queue name="MyQueue">
<entry name="jms/queue/MyQueue"/>
<entry name="java:jboss/exported/jms/queue/MyQueue"/>
</jms-queue>
</jms-destinations>

然后打开jboss8的控制台(需要使用add-user.bat功能设置一个用户名),点击runtime界面的JNDI view如果可找到下图所示的内容即配置成功:

在该图中,RemoteConnectionFactory是在客户端中使用的连接工厂,MyQueue则是配置好的jms Queue。

2)编写MDB

java代码如下:

import javax.ejb.ActivationConfigProperty;
import javax.ejb.MessageDriven;
import javax.jms.Message;
import javax.jms.MessageListener;
import javax.jms.TextMessage; @MessageDriven(activationConfig = {
@ActivationConfigProperty(propertyName = "destinationLookup", propertyValue = "queue/MyQueue"),
@ActivationConfigProperty(propertyName = "destinationType", propertyValue = "javax.jms.Queue"),
@ActivationConfigProperty(propertyName = "user", propertyValue = "jadmin"),
@ActivationConfigProperty(propertyName = "password", propertyValue = "jadminjadmin")
}
)
public class MyQueueMDBBean implements MessageListener { @Override
public void onMessage(Message msg) {
try {
Thread.sleep(10000);
TextMessage tm = (TextMessage) msg;
System.out.println("MDB接收到一个消息=" + tm.getText());
} catch (Exception e) { e.printStackTrace();
} } }

***由于jboss8为非匿名的访问方式,所以要在注解中配置用户名和密码,该用户名和密码可使用add-user.bat进行配置,配置Application User,权限可以为Guest

该用户名和密码的配置视为了客户端访问而设置。

3)客户端

java代码如下所示:

import javax.jms.Connection;
import javax.jms.ConnectionFactory;
import javax.jms.MessageProducer;
import javax.jms.Queue;
import javax.jms.QueueSession;
import javax.jms.Session;
import javax.jms.TextMessage;
import javax.naming.Context;
import javax.naming.InitialContext; public class Point2PClient { public static void main(String[] args) {
try {
// Properties jndiProperties = new Properties();
//
// jndiProperties.put(Context.INITIAL_CONTEXT_FACTORY,
// "org.jboss.naming.remote.client.InitialContextFactory");
//
// jndiProperties.put(Context.PROVIDER_URL,"http-remoting://localhost:8080");
// jndiProperties.put(Context.SECURITY_PRINCIPAL,"admin");
// jndiProperties.put(Context.SECURITY_CREDENTIALS, "adminadmn");
// jndiProperties.put("jboss.naming.client.ejb.context", true);
Context context = new InitialContext(); ConnectionFactory factory = (ConnectionFactory) context
.lookup("jms/RemoteConnectionFactory");
Queue destination = (Queue) context.lookup("jms/queue/MyQueue");
// Destination destination = (Destination) context
// .lookup("jms/queue/MyQueue"); Connection connection = factory.createConnection("jadmin",
"jadminjadmin"); //使用factory创建连接时,将在第二步中配置的Application User加入,作用是创建一个连接MDB的connection Session session = connection.createSession(false,
QueueSession.AUTO_ACKNOWLEDGE); TextMessage msg = session.createTextMessage("这是一个文本:13311ppppp"); MessageProducer sender = session.createProducer(destination); sender.send(msg); session.close();
connection.close(); System.out.println("+++++Success");
} catch (Exception e) {
e.printStackTrace();
}
} }

配置文件如下(jndi.properties):

java.naming.factory.initial=org.jboss.naming.remote.client.InitialContextFactory
java.naming.provider.url=http-remoting://localhost:8080

在jboss8中,将端口占用的数量大大减少,许多的功能集中在8080端口,当然也可以修改(jboss7为4447)

此外,需要在客户端类路径中加入jboss8安装目录下的client文件夹中的两个jar文件

4)运行结果如下:

16:34:34,199 INFO  [org.jboss.as.naming] (default task-4) JBAS011806: Channel end notification received, closing channel Channel ID 0478d991 (inbound) of Remoting connection 79187fc1 to null
16:34:44,144 INFO [stdout] (Thread-12 (HornetQ-client-global-threads-1153747233)) MDB接收到一个消息=这是一个文本:13311ppppp

***注意事项***

jboss8和jboss5的差异较大,可对比 jboss5+EJB3+MDB Queue

本文只分析了jms Queue的配置,Topic方面与Queue较为类似,可自己尝试修改

1.客户端异常1:

javax.naming.NameNotFoundException: RemoteConnectionFactory -- service jboss.naming.context.java.jboss.exported.RemoteConnectionFactory
at org.jboss.as.naming.ServiceBasedNamingStore.lookup(ServiceBasedNamingStore.java:104)
at org.jboss.as.naming.NamingContext.lookup(NamingContext.java:202)
at org.jboss.as.naming.NamingContext.lookup(NamingContext.java:179)
at org.jboss.naming.remote.protocol.v1.Protocol$1.handleServerMessage(Protocol.java:127)
at org.jboss.naming.remote.protocol.v1.RemoteNamingServerV1$MessageReciever$1.run(RemoteNamingServerV1.java:73)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at java.lang.Thread.run(Thread.java:745)

表示在客户端中使用的RemoteConnectionFactory无法和jboss服务器JNDI中的factory相匹配,所以无法找到。

standalone.xml文件中查找RemoteConnectionFactory的相关信息:

                    <connection-factory name="RemoteConnectionFactory">
<connectors>
<connector-ref connector-name="http-connector"/>
</connectors>
<entries>
<entry name="java:jboss/exported/jms/RemoteConnectionFactory"/>
</entries>
</connection-factory>

对比面两段代码中加粗部分可发现,异常信息处少了jms字段,所以要在客户端创建连接时使用jms/RemoteConnectionFactory

2.客户端异常2

16:46:37,917 ERROR [org.hornetq.core.server] (default I/O-3) HQ224018: Failed to create session: HornetQSecurityException[errorType=SECURITY_EXCEPTION message=HQ119031: Unable to validate user: null]

该异常主要是在使用工厂创建connection时,没有使用与MDB处相互对应的Application User

jboss8+EJB3+MDB Queue的更多相关文章

  1. jboss5+EJB3+MDB Queue

    在使用jboss5进行MDB的试验时首先要在jboss5中配置jms 队列. 1)在jboss安装目录下:server\default\deploy\messaging 打开destinations- ...

  2. ejb3: message drive bean(MDB)示例

    上一篇已经知道了JMS的基本操作,今天来看一下ejb3中的一种重要bean:Message Drive Bean(mdb) 如果要不断监听一个队列中的消息,通常我们需要写一个监听程序,这需要一定的开发 ...

  3. EJB3.0中的session bean以及MDB解析

    版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/aboy123/article/details/24587133 大型业务系统面临的主要问题就是高并发 ...

  4. Ejb3 + Jboss8 出现Session id hasn't been set for stateful component

    Ejb 3 + JBoss 8  在使用客户端远程访问有状态的Ejb对象时,出现ERROR: Session id hasn't been set for stateful component 出现该 ...

  5. EJB3 阶段总结+一个EJB3案例 (1)

    经过一段时时间的学习,对EJB3的相关知识和jboss8的配置有了大概的了解. 网上对EJB的评论很多,基本都是负面的,都表示EJB太过于沉重,不容易维护.但通过这段时间的学习,私下认为,EJB3在某 ...

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

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

  7. EJB3.0 EJB开发消息驱动bean

    (7)EJB3.0 EJB开发消息驱动bean JMS 一: Java消息服务(Java Message Service) 二:jms中的消息 消息传递系统的中心就是消息.一条 Message 由三个 ...

  8. EJB3.0

    由于EJB2.0的复杂性,在Spring和Hibernate[1]  等轻量级框架出现后,大量的用户转向应用轻量级框架.在大家的呼声中, EJB 期待已久的EJB3.0规范终于发布了.在本文中将对新的 ...

  9. tomee 第一个 远程调用 Message-driven bean(MDB)

    MDB 整体结构 HelloMDB.java package cn.zno; import javax.jms.Connection; import javax.jms.ConnectionFacto ...

随机推荐

  1. timescale

    `timescale 1ns/100ps     表示时延单位为1ns, 时延精度为100ps.`timescale 编译器指令在模块说明外部出现, 并且影响后面所有的时延值.

  2. (最小生成树)Constructing Roads -- poj -- 2421

    链接: http://poj.org/problem?id=2421 Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 2113 ...

  3. Robotframework + Appium 之常用元素定位方法

    任何自动化测试,其实手动测试也是一样的,元素定位(目标定位)是首要任务,这是最直接的测试对象呀! 好了,废话不多说,又到了元素定位啦,之前我们已经介绍过selenium及appium常用的定位方法,下 ...

  4. 解码Base64,并保存图片至本地

    五一去了具有诗情画意的城市---杭州,今天是假期结束后回来上班的第一天,玩饱之后回来,确实精神抖擞了不少; 前段时间开发了有关电子签名的需求,其中有个关于解码Base64图片的知识点,值得关注一下; ...

  5. Codeforces807 C. Success Rate 2017-05-08 23:27 91人阅读 评论(0) 收藏

    C. Success Rate time limit per test 2 seconds memory limit per test 256 megabytes input standard inp ...

  6. [svn] TortoisSVN的Blam功能

    团队开发中,我们必须要面对多个人对同一个文件进行修改的情况. 多人修改同一文件,往往就会发生很多的问题,或者随着文件中代码的数量不断增加.当我们必须要使用文件中的其他人写的代码,或者代码发生bug之后 ...

  7. bootstrap-treeview 加载默认选择第一个节点

    configAppTree: function (oArrayData){ $('#appTree').treeview({ color: "#545454", expandIco ...

  8. .net core 滑动+点击汉字验证码

    用 .net core 写的  滑动+点击汉字的验证码,代码比较简单就不做说明了. github地址  https://github.com/wangchengqun/NetCoreVerificat ...

  9. mysql之使用centos7实现主从复制(读写分离)的实现过程

    什么是主从复制? 主从复制,是用来建立一个和主数据库完全一样的数据库环境,称为从数据库:主数据库一般是准实时的业务数据库. 主从复制的作用(好处)! 1.做数据的热备,作为后备数据库,主数据库服务器故 ...

  10. .NET Core 玩一玩 Ocelot API网关

    .net 这几年国内确实不好过. 很多都选择转行.不过.net Core跨平台 开源之后 .社区的生态在慢慢建立.往好的趋势发展. 对于坚守在.NET战线的开发者来说 是个挺不错的消息.  特别是微软 ...