jboss 7 ejb jpa jms datasource配置

来源:互联网 发布:erp软件是什么 编辑:程序博客网 时间:2024/04/27 06:34
最近闲的蛋疼啊,有木有。闲也不能真闲着。不然咱就废了。那就学习吧。

jboss都出到7了。虽然生产环境暂时不会有太多人用,但是学习下总是好的。就是7的改变有点蛋疼。真不习惯。行了。直接上代码了。

我的环境是myeclipse10 jboss-as-7.1.1.Final

先上datasource配置还有半小时下班不知道能不能贴完。

当前我配的数据源是oracle的。相关的配置文件路径为jboss-as-7.1.1.Final\standalone\configuration\standalone.xml

找到<subsystem xmlns="urn:jboss:domain:datasources:1.0">节点,jboss已经写好一个h2的数据源了。不管它,直接加咱的配置

 <datasource jndi-name="java:/OracleDS" pool-name="OracleDS" enabled="true" use-java-context="true">
                    <connection-url>jdbc:oracle:thin:@192.168.16.92:1521:ORCL</connection-url>
                    <driver>oracle</driver>
                    <pool>
                        <min-pool-size>10</min-pool-size>
                        <max-pool-size>20</max-pool-size>
                        <prefill>true</prefill>
                    </pool>
                    <security>
                        <user-name>test</user-name>
                        <password>test</password>
                    </security>
                </datasource>

这个配置我就不多说了。关键是<driver>oracle</driver>节点 这里指定的驱动配置 而不是之前版本中的驱动类名。指的是下面的driver配置,这个配置就在datasource下面

 <drivers>
                    <driver name="h2" module="com.h2database.h2">
                        <xa-datasource-class>org.h2.jdbcx.JdbcDataSource</xa-datasource-class>
                    </driver>
                    <driver name="oracle" module="com.oracledatabase.oracle">
                        <driver-class>oracle.jdbc.OracleDriver</driver-class>
                        <xa-datasource-class>oracle.jdbc.xa.client.OracleXADataSource</xa-datasource-class>
                    </driver>
                </drivers>

h2是jboss例子中用的 咱用的是oracle的配置。在jboss7中jboss引入了module概念。NND 把jar包都分门别类了。路径是jboss-as-7.1.1.Final\modules下面。当前我们的驱动位置就是jboss-as-7.1.1.Final\modules\com\oracledatabase\oracle\main

在这个路径下jar包ojdbc14.jar还有一个module.xml配置文件,内容如下

<module xmlns="urn:jboss:module:1.1" name="com.oracledatabase.oracle">

    <resources>
        <resource-root path="ojdbc14.jar"/>
        <!-- Insert resources here -->
    </resources>
    <dependencies>
        <module name="javax.api"/>
        <module name="javax.transaction.api"/>
        <module name="javax.servlet.api" optional="true"/>
    </dependencies>
</module>

module节点中的name属性 对应上面driver中的module

好了 只要你这几步没有复制出错那你就启动jboss就ok了。

本来想写个测试程序来着。妹的不行,jndiname不知道咋写了,发布出来的名称叫java:/OracleDS结果死活找不到。算了,刚好要测试ejb。就用jpa代替datasource的测试吧。

persistence.xml内容为:

<?xml version="1.0" encoding="UTF-8"?>
<persistence xmlns="http://java.sun.com/xml/ns/persistence"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/persistence
    http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd" version="2.0">
   
 <persistence-unit name="OracleDS" transaction-type="JTA">
    <jta-data-source>java:/OracleDS</jta-data-source>
    <properties>
      <property name="hibernate.show_sql" value="true" />
      <property name="hibernate.format_sql" value="true" />
       <property name="hibernate.hbm2ddl.auto" value="update" />
       </properties>
 </persistence-unit>
</persistence>

这个不用多说吧。引入hibernate的配置是为了让它自动生成表以及sql显示.

entity:

 

package test.dao.entity;import java.io.Serializable;import java.lang.reflect.Field;import java.lang.reflect.Method;import java.util.HashMap;import java.util.Map;public class UtilEntity implements Serializable {public Map getAllField(){Map<String,Object> map=new HashMap<String, Object>();Class<? extends UtilEntity> clazz=this.getClass();Field[] fields=clazz.getDeclaredFields();String fieldName="";String methodName="";Method method=null;Object val=null;for(Field field:fields){fieldName=field.getName();methodName="get"+fieldName.substring(0, 1).toUpperCase()+fieldName.substring(1);try {method=clazz.getMethod(methodName);if(method!=null){val=method.invoke(this, null);map.put(fieldName, val);}} catch (Exception e) {} }return map;}}

这个entity里面写一些公用的工具方法。其实这里是用不到的。

package test.dao.entity;import javax.persistence.Entity;import javax.persistence.GeneratedValue;import javax.persistence.GenerationType;import javax.persistence.Id;import javax.persistence.NamedQueries;import javax.persistence.NamedQuery;import javax.persistence.SequenceGenerator;import javax.persistence.Table;import javax.persistence.TableGenerator;@Entity@Table(name="t_user_info")@NamedQueries({@NamedQuery(name="userInfo.getUserInfoById",query="select us from UserInfo us where us.userId=:userId"),@NamedQuery(name="userInfo.findUserInfoList",query="select us from UserInfo us where 1=1")})public class UserInfo extends UtilEntity {/** *  */private static final long serialVersionUID = 1L;@Id@GeneratedValue(strategy=GenerationType.SEQUENCE,generator="t_sq_user_info")@SequenceGenerator(name="t_sq_user_info",sequenceName="t_sq_user_info")private Long id;private String userId;private String userName;private String password;public String getUserId() {return userId;}public void setUserId(String userId) {this.userId = userId;}public String getUserName() {return userName;}public void setUserName(String userName) {this.userName = userName;}public String getPassword() {return password;}public void setPassword(String password) {this.password = password;}public Long getId() {return id;}public void setId(Long id) {this.id = id;}}


上面是咱要用到的。

下面是sessionbean 我用的是无状态的sessionbean

package test.dao;import java.util.List;import javax.ejb.Remote;import test.dao.entity.UtilEntity;@Remotepublic interface UtilEntityDAORemote<T> {public T getEntity(String hql);public void insertEntity(UtilEntity ent);public List<T> getEntityList(String hql,Integer start,Integer count);}
package test.dao;import java.util.List;import javax.ejb.Stateless;import javax.persistence.EntityManager;import javax.persistence.PersistenceContext;import javax.persistence.PersistenceUnit;import javax.persistence.Query;import test.dao.entity.UtilEntity;@Statelesspublic class UtilEntityDAO<T> implements UtilEntityDAORemote<T> {@PersistenceContext(unitName="OracleDS")private EntityManager enm;@SuppressWarnings("unchecked")@Overridepublic T getEntity(String hql) {Query query=enm.createQuery(hql);//query=enm.createNamedQuery("userInfo.getUserInfoById");return  (T) query.getSingleResult();}@Overridepublic void insertEntity(UtilEntity ent) {enm.merge(ent);}@SuppressWarnings("unchecked")@Overridepublic List<T> getEntityList(String hql, Integer start, Integer count) {Query query=enm.createQuery(hql);query.setFirstResult(start);query.setMaxResults(count);return query.getResultList();}}

结了,发布路径是jboss-as-7.1.1.Final\standalone\deployments,这里要注意下,就是你发布出来的jar包名称要记号哈,不然下面不成功别冤我。结果应该是

上测试程序:尼玛啊jboss。你到7连jndi的获取方式都挫了。这回只要引用一个jar包就好了。就是jboss-as-7.1.1.Final\bin\client下面的jboss-client.jar

 

src下面新建文件jboss-ejb-client.properties贴入以下键值

remote.connectionprovider.create.options.org.xnio.Options.SSL_ENABLED=false
remote.connections=default
remote.connection.default.host=localhost
remote.connection.default.port = 4447
remote.connection.default.connect.options.org.xnio.Options.SASL_POLICY_NOANONYMOUS=false

这下上咱的测试代码:

    Hashtable<String, String> jndiProperties = new Hashtable<String, String>();    jndiProperties.put(Context.URL_PKG_PREFIXES, "org.jboss.ejb.client.naming");    try {     jndiProperties.put(Context.PROVIDER_URL, "remote://localhost:4447");      jndiProperties.put(Context.SECURITY_PRINCIPAL, "root");      jndiProperties.put(Context.SECURITY_CREDENTIALS, "123456");      jndiProperties.put(Context.INITIAL_CONTEXT_FACTORY, "org.jboss.naming.remote.client.InitialContextFactory");        Context context = new InitialContext(jndiProperties);        /*ejb test*/        Object obj = context.lookup("ejb:/MyEjb/UtilEntityDAO!test.dao.UtilEntityDAORemote");        UtilEntityDAORemote utilEntityDAO = (UtilEntityDAORemote)obj;        UserInfo us=new UserInfo();        us.setPassword("123");        us.setUserId("14556");        us.setUserName("test");       // utilEntityDAO.insertEntity(us);        us=(UserInfo) utilEntityDAO.getEntity("from UserInfo us where us.userId='14556'");        System.out.println(us.getAllField());    } catch (NamingException e) {        e.printStackTrace();    }

看到那个蛋疼的jndiname没有?看看它多蛋疼多严格ejb:/MyEjb/UtilEntityDAO!test.dao.UtilEntityDAORemote,ejb是jndi的前缀,我打出的jar包名称为MyEjb所以后面追上,还有remote的路径。其他不多说了。结果自己看哈。

擦 忘了说了,还得加个application账户,就是在bin目录下面的add-user.bat

 

下面上jms部分的。当热是先配置了。相关的配置在jboss-as-7.1.1.Final\standalone\configuration\standalone-full.xml及standalone-full-xa.xml中都有,就是message那部分,我是直接复制到了默认的配置中,省的再换配置启动。从standalone-full.xml中复制以下节点至standalone.xml对应的节点中     

   <extension module="org.jboss.as.messaging"/>

  <subsystem xmlns="urn:jboss:domain:messaging:1.1">
            <hornetq-server>
                <persistence-enabled>true</persistence-enabled>
                <journal-file-size>102400</journal-file-size>
                <journal-min-files>2</journal-min-files>

                <connectors>
                    <netty-connector name="netty" socket-binding="messaging"/>
                    <netty-connector name="netty-throughput" socket-binding="messaging-throughput">
                        <param key="batch-delay" value="50"/>
                    </netty-connector>
                    <in-vm-connector name="in-vm" server-id="0"/>
                </connectors>

                <acceptors>
                    <netty-acceptor name="netty" socket-binding="messaging"/>
                    <netty-acceptor name="netty-throughput" socket-binding="messaging-throughput">
                        <param key="batch-delay" value="50"/>
                        <param key="direct-deliver" value="false"/>
                    </netty-acceptor>
                    <in-vm-acceptor name="in-vm" server-id="0"/>
                </acceptors>

                <security-settings>
                    <security-setting match="#">
                        <permission type="send" roles="guest"/>
                        <permission type="consume" roles="guest"/>
                        <permission type="createNonDurableQueue" roles="guest"/>
                        <permission type="deleteNonDurableQueue" roles="guest"/>
                    </security-setting>
                </security-settings>

                <address-settings>
                    <address-setting match="#">
                        <dead-letter-address>jms.queue.DLQ</dead-letter-address>
                        <expiry-address>jms.queue.ExpiryQueue</expiry-address>
                        <redelivery-delay>0</redelivery-delay>
                        <max-size-bytes>10485760</max-size-bytes>
                        <address-full-policy>BLOCK</address-full-policy>
                        <message-counter-history-day-limit>10</message-counter-history-day-limit>
                    </address-setting>
                </address-settings>

                <jms-connection-factories>
                    <connection-factory name="InVmConnectionFactory">
                        <connectors>
                            <connector-ref connector-name="in-vm"/>
                        </connectors>
                        <entries>
                            <entry name="java:/ConnectionFactory"/>
                        </entries>
                    </connection-factory>
                    <connection-factory name="RemoteConnectionFactory">
                        <connectors>
                            <connector-ref connector-name="netty"/>
                        </connectors>
                        <entries>
                            <entry name="RemoteConnectionFactory"/>
                            <entry name="java:jboss/exported/jms/RemoteConnectionFactory"/>
                        </entries>
                    </connection-factory>
                    <pooled-connection-factory name="hornetq-ra">
                        <transaction mode="xa"/>
                        <connectors>
                            <connector-ref connector-name="in-vm"/>
                        </connectors>
                        <entries>
                            <entry name="java:/JmsXA"/>
                        </entries>
                    </pooled-connection-factory>
                </jms-connection-factories>

                <jms-destinations>
                    <jms-queue name="testQueue">
                        <entry name="queue/test"/>
                        <entry name="java:jboss/exported/jms/queue/test"/>
                    </jms-queue>
                    <jms-topic name="testTopic">
                        <entry name="topic/test"/>
                        <entry name="java:jboss/exported/jms/topic/test"/>
                    </jms-topic>
                </jms-destinations>
            </hornetq-server>
        </subsystem>

            <mdb>
                <resource-adapter-ref resource-adapter-name="hornetq-ra"/>
                <bean-instance-pool-ref pool-name="mdb-strict-max-pool"/>
            </mdb>

   <socket-binding name="messaging" port="5445"/>
        <socket-binding name="messaging-throughput" port="5455"/>

注意复制完整哈。在这个配置中我直接用了它默认的测试消息配置相关服务的端口就是5445和5455.ok了。上代码吧。代码倒是和之前版本的消息驱动bean的写法一致

 

package test.jms;import javax.ejb.ActivationConfigProperty;import javax.ejb.MessageDriven;import javax.jms.JMSException;import javax.jms.Message;import javax.jms.MessageListener;import javax.jms.TextMessage;@MessageDriven(mappedName = "jms/MyMessage", activationConfig = {@ActivationConfigProperty(propertyName = "acknowledgeMode", propertyValue = "Auto-acknowledge"),@ActivationConfigProperty(propertyName = "destinationType", propertyValue = "javax.jms.Queue"),@ActivationConfigProperty(propertyName = "destination", propertyValue = "java:jboss/exported/jms/queue/test")})public class MyQueueMessage implements MessageListener {@Overridepublic void onMessage(Message arg0) {TextMessage tmsg = (TextMessage)arg0; try { System.out.println(tmsg.getText()); } catch (JMSException e) { // TODO Auto-generated catch block e.printStackTrace(); } }}


这个是queue

 

下面是topic

package test.jms;import javax.ejb.ActivationConfigProperty;import javax.ejb.MessageDriven;import javax.jms.JMSException;import javax.jms.Message;import javax.jms.MessageListener;import javax.jms.TextMessage;@MessageDriven(mappedName = "jms/MyTopicMessage", activationConfig = {@ActivationConfigProperty(propertyName = "acknowledgeMode", propertyValue = "Auto-acknowledge"),@ActivationConfigProperty(propertyName = "destinationType", propertyValue = "javax.jms.Topic"),@ActivationConfigProperty(propertyName = "subscriptionDurability", propertyValue = "Durable"),@ActivationConfigProperty(propertyName = "clientId", propertyValue = "MyTopicMessage"),@ActivationConfigProperty(propertyName = "subscriptionName", propertyValue = "MyTopicMessage") ,@ActivationConfigProperty(propertyName = "destination", propertyValue = "java:jboss/exported/jms/topic/test")})public class MyTopicMessage implements MessageListener {@Overridepublic void onMessage(Message arg0) {// TODO Auto-generated method stubTextMessage tmsg = (TextMessage)arg0; try { System.out.println(tmsg.getText()); } catch (JMSException e) { // TODO Auto-generated catch block e.printStackTrace(); } }}


测试程序

import javax.jms.Connection;import javax.jms.ConnectionFactory;import javax.jms.Destination;import javax.jms.JMSException;import javax.jms.MessageProducer;import javax.jms.Session;import javax.jms.TextMessage;import javax.naming.Context;import javax.naming.InitialContext;import javax.naming.NamingException;import java.util.Hashtable;import test.dao.UtilEntityDAORemote;import test.dao.entity.UserInfo;public class Test {public static void main(String[] args){Hashtable<String, String> jndiProperties = new Hashtable<String, String>();    jndiProperties.put(Context.URL_PKG_PREFIXES, "org.jboss.ejb.client.naming");    try {    jndiProperties.put(Context.PROVIDER_URL, "remote://localhost:4447");     jndiProperties.put(Context.SECURITY_PRINCIPAL, "root");     jndiProperties.put(Context.SECURITY_CREDENTIALS, "123456");     jndiProperties.put(Context.INITIAL_CONTEXT_FACTORY, "org.jboss.naming.remote.client.InitialContextFactory");        Context context = new InitialContext(jndiProperties);        /*jboss jms 测试 queue*/        /*ConnectionFactory connectionFactory = (ConnectionFactory) context.lookup("jms/RemoteConnectionFactory");          Connection connection = connectionFactory.createConnection("root", "123456");         connection.start();        Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);          Destination destination = (Destination) context.lookup("jms/queue/test");        MessageProducer producer = session.createProducer(destination);         TextMessage message = session.createTextMessage();          for(int i=0;i<10000;i++){        message.setText("testjms!!++++++++++++++"+i);        producer.send(message);        }         session.close();        connection.close();*/                ConnectionFactory connectionFactory = (ConnectionFactory) context.lookup("jms/RemoteConnectionFactory");          Connection connection = connectionFactory.createConnection("root", "123456");         connection.start();        Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);          Destination destination = (Destination) context.lookup("jms/topic/test");        MessageProducer producer = session.createProducer(destination);        TextMessage message = session.createTextMessage();          for(int i=0;i<10000;i++){        message.setText("testjms!!-------------------"+i);        producer.send(message);        }        session.close();        connection.close();    } catch (NamingException e) {        e.printStackTrace();    } catch (JMSException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}

ok了  可以试试了。不好使找我哈。结果就不贴了。。要是不成功接着试吧。

 

 

 

 

原创粉丝点击