zoukankan      html  css  js  c++  java
  • jboss8+EJB3+MDB Queue

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

         在该图中,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

  • 相关阅读:
    正则表达式
    移动开发知识点收集
    SQL Server
    百度数据图表插件Echarts
    Xamarin
    Func与Action
    MVC Core
    利用 async & await 的异步编程
    CSS3
    [leetcode]374. Guess Number Higher or Lower
  • 原文地址:https://www.cnblogs.com/welv/p/5026561.html
Copyright © 2011-2022 走看看