jboss8+EJB3+MDB Queue

摘要:
1) 使用jboss8(WildFly)进行MDB测试时,必须首先在jboss8中配置jms队列。如果使用xml文件,则将文件名更改为独立的。xml搜索该文件下的<hornetq server>节点,并在节点末尾添加:<jms destination><jms queue name=“MyQueue”><entryname=“jms/queue/MyQueue”/˃<entryname=“java:jboss/exported/jms/queue/MyQueue”/>,RemoteConnectionFactory是客户端中使用的连接工厂,MyQueue是配置的jmsQueue。

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

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

     进入jboss8 安装目录的standaloneconfiguration文件夹下:

     因为使用的是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如果可找到下图所示的内容即配置成功:

jboss8+EJB3+MDB Queue第1张

     在该图中,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》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇统计章节的几个难点Oracle中的rowid rownum下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

【aspnetcore】在过滤器(Filter)中使用注入服务(ServiceFilter|TypeFilter)

在MVC中,AOP是很常用的功能,我们经常会使用如 ActionFilter,IAuthorizeFilter 等描述对Controller和Action进行约束和扩展,一般做法如下: public class TestActionFilterAttribute : Attribute, IActionFilter { public voi...

MVC5 + EF6 完整入门教程三

期待已久的EF终于来了。 学完本篇文章,你将会掌握基于EF数据模型的完整开发流程。 本次将会完成EF数据模型的搭建和使用。 基于这个模型,将之前的示例添加数据库查询验证功能。 文章提纲 概述 & 要点 详细步骤 总结 概述 & 要点 下面是本文要点,正文部分会有详细介绍。 EF架构图 新建基于EF的Data Model的约定 关于ORM的...

基于python的种子搜索网站-开发过程

本讲会对种子搜索网站的开发过程进行详细的讲解。 源码地址:https://github.com/geeeeeeeek/bt 项目开发过程 项目简介 该项目是基于python的web类库django开发的一套web网站,做为本人的毕业设计。本人的研究方向是一项关于搜索的研究项目。在该项目中,笔者开发了一个简单版的搜索网站,实现了对数据库数据的检索和更新。 网...

HTTP Bearer认证及JWT的使用

                            一、自定义CheckJWTAttribute特性方式 之前使用的是这种方式,根据jwt原理自定义生成JWT、验证jwt,感觉挺好。原理就是自定义一个拦截器(特性),拦截器对每个请求都优先进行处理,认证成功的进行下一步操作。 1、定义JWTPayload类 using System; namespace...

Android广播机制的基本使用

一提到广播我们第一感觉就会联想到小时候村里面的广播,安卓的广播机制也是类似于大喇叭。有发送广播的地方,也有接收广播的地方。但是具体怎么操作呢,我们来一步一步的看下去~ 安卓的广播种类 系统发送的广播:具体有哪些可以看下这篇Bloghttp://blog.sina.com.cn/s/blog_7dbac1250101mt5h.html app发送的广播...

weblogic的集群与配置图文方法

一、Weblogic的集群 还记得我们在第五天教程中讲到的关于Tomcat的集群吗? 两个tomcat做node即tomcat1, tomcat2,使用Apache HttpServer做请求派发。 现在看看WebLogic的集群吧,其实也差不多。 区别在于: Tomcat的集群的实现为两个物理上不同的tomcat,分别就是两个node,没有总控端,...