`
suhuanzheng7784877
  • 浏览: 701425 次
  • 性别: Icon_minigender_1
  • 来自: 北京
博客专栏
Ff8d036b-05a9-33b5-828a-2633bb68b7e6
读金庸故事,品程序人生
浏览量:47681
社区版块
存档分类
最新评论

JavaEE5学习笔记06-EJB之消息驱动Bean(MDB)总结----2

阅读更多

除了activationConfig之外,如果使用其他JavaEE容器,比如WeblogicGlassfish等等,还得加上如下几个注解配置项。

mappedName:指定消息驱动Bean监听的消息目的,此属性配置对于WeblogicGlassfish生效。

messageListener:如果该消息驱动类没有在代码中显示的实现接口MessageListener的话就需要在此属性配置中加上实现的接口类。

在这个消息驱动Bean中接收到的消息是一个ObjectMessage类型的消息,前面JMS总结章节说过ObjectMessage是一个实现了Serializable接口的实体对象,这里实际上指的就是UserDTO对象。

在这个消息驱动Bean中还调用了一个SessionBean,它的代码如下(接口类不再赘述):

 /**

 * 容器管理事务的用户添加的SessionBean

 *

 * @author liuyan

 *

 */

@Stateless

@TransactionManagement(TransactionManagementType.CONTAINER)

@TransactionAttribute(TransactionAttributeType.REQUIRED)

public class UserServiceEAOImpl implements UserService {

 

      /**

       * 资源注入

       */

      @Resource(mappedName = "java:/jbossdemo")

      private DataSource dataSource;

 

      @Resource

      private SessionContext sessionContext;

 

      /**

       * 添加方法实现

       */

      @Override

      public boolean insertUser(UserDTO userDTO) {

 

             if (userDTO == null || userDTO.getId() == 0

                           || userDTO.getName() == null) {

                    return false;

             }

 

             Connection connection = null;

 

             Statement statement = null;

 

             try {

 

                    connection = dataSource.getConnection();

 

                    statement = connection.createStatement();

 

                    StringBuffer insertSQL = new StringBuffer(

                                  "insert into person values(");

 

                    insertSQL.append(userDTO.getId()).append(",'").append(

                                  userDTO.getName()).append("')");

 

                    System.out.println("SQL::" + insertSQL.toString());

 

                    statement.executeUpdate(insertSQL.toString());

 

                    statement.close();

                    connection.close();

                    return true;

             } catch (Exception e) {

                    System.out.println("事务回滚~~");

                    sessionContext.setRollbackOnly();

                    e.printStackTrace();

                    return false;

             }

 

      }

}

这是一个很简单的根据实体对象执行插入数据库的业务逻辑。万事俱备,只欠消息生产者,我们的消息生产者和之前JMS的消息生产者内容差不多。

package ejb.messageDrivenBean;

  

/**

 * 消息发送者

 *

 * @author liuyan

 *

 */

public class JbossMessageSender {

 

    /**

     * 发送消息

     *

     * @throws Exception

     */

    public void sendMessage() {

 

       try {

           String Connection_Factory = "ConnectionFactory";

 

           Context context = getInitialContext();

 

           ConnectionFactory connectionFactory = (ConnectionFactory) context

                  .lookup(Connection_Factory);

 

           Destination dest = (Destination) context.lookup("InsertUserQueue");

 

           Connection connection = connectionFactory.createConnection();

 

           Session session = connection.createSession(false,

                  Session.AUTO_ACKNOWLEDGE);

 

           MessageProducer sender = session.createProducer(dest);

 

           sender.setDeliveryMode(DeliveryMode.PERSISTENT);

           sender.setTimeToLive(2000);

 

           // 获得ObjectMessage对象

           ObjectMessage objectMessage = session.createObjectMessage();

 

           // 构建参数

           UserDTO userDTO = new UserDTO();

           userDTO.setId(19);

           userDTO.setName("乱世狂刀");

 

           objectMessage.setObject(userDTO);

 

           sender.send(objectMessage);

 

           session.close();

           connection.close();

       } catch (Exception e) {

           e.printStackTrace();

       }

 

    }

 

    private Context getInitialContext() {

       String init_factory = "org.jnp.interfaces.NamingContextFactory";

       String serverURL = "jnp://127.0.0.1:1099";

       Context context = null;

 

       Properties properties = new Properties();

       properties.put(Context.INITIAL_CONTEXT_FACTORY, init_factory);

       properties.put(Context.PROVIDER_URL, serverURL);

       try {

           context = new InitialContext(properties);

       } catch (NamingException e) {

           // TODO Auto-generated catch block

           e.printStackTrace();

       }

       return context;

 

    }

 

    /**

     * @param args

     * @throws Exception

     */

    public static void main(String[] args) throws Exception {

 

       JbossMessageSender jbossMessageSender = new JbossMessageSender();

       jbossMessageSender.sendMessage();

    }

 

}

开启JBoss服务器后,在另一个JVM中运行消息生产者程序后,发现数据库已经插入了一条记录

 

由此观之,这是一个通过JMS发送消息来引发的一个插入数据的事件的过程。过程如下描述:

启动JBoss——》消息消费者(消息驱动Bean)随着JBoss启动而被容器创建在容器对象池中——》消息将消费者监听消息目的——》JMS生产一个消息——》将实体对象一同发送到消息目的——》消息驱动Bean监听到了消息目的有消息了——》调用onMessage方法获取消息——》根据获取的消息进行强制转型(一般是业务实体)——》调用被注入的SessionBean组件方法执行业务逻辑——》完毕,消息驱动Bean归还给对象池。

实际上了解了JMS的使用原理后,配合消息驱动Bean开发应该不是很难。总之,消息驱动Bean是一个异步消费者。所以要实现特定接口MessageListener和特定方法onMessage()。还有就是消息驱动的注解配置属性可能相对于SessionBean来说有点多。还有就是消息驱动Bean的使用时机,一般是不要求客户端立刻获得执行结果的情况和在一般执行相对较长时间的业务情况。所以上面的实例代码其实不是真正的实际应用场景,而只是一个Demo罢了。多谢~~~~~夜深!!!

  • 大小: 50.3 KB
分享到:
评论

相关推荐

    JavaEE5学习笔记06-EJB之消息驱动Bean总结

    ### Java EE 5 学习笔记06:EJB之消息驱动Bean总结 #### EJB 消息驱动 Bean (Message Driven Bean, MDB) 在Java EE 5中,消息驱动Bean(MDB)是一种特殊的EJB组件,它主要用于处理异步消息。MDB能够接收并处理由...

    JavaEE5学习笔记07-Web层与EJB集成总结

    ### JavaEE5学习笔记07-Web层与EJB集成总结 #### 一、JavaEE5框架中的Web层与EJB集成概述 在JavaEE5(即Java Platform, Enterprise Edition 5)中,Web层与EJB(Enterprise JavaBeans)的集成是构建企业级应用的...

    JavaEE5学习笔记01-JTA和数据库事务

    ### JavaEE5学习笔记01-JTA和数据库事务:深入解析与应用 #### 一、JavaEE5概览与核心组件 JavaEE5是Java Enterprise Edition的第五个版本,标志着企业级Java应用的一个重要里程碑。它引入了一系列重要的新特性,...

    JavaEE5学习笔记02-JNDI与RMI

    总结来说,JNDI和RMI在JavaEE5中提供了强大的服务发现和分布式对象通信能力,使得开发者能够构建可扩展、模块化的企业级应用。通过JNDI,应用可以轻松地查找和利用服务器上的资源,而RMI则为远程对象的调用提供了...

    JavaEE5学习笔记04-JavaMail使用总结---3

    这篇学习笔记主要聚焦于JavaMail在JavaEE5中的使用,通过深入理解其核心概念和实践操作,我们可以更好地在实际项目中应用这一工具。 JavaMail API提供了一套标准的接口,允许Java应用程序发送和接收电子邮件。它...

    JavaEE源代码 struts2-core-2.0.11

    JavaEE源代码 struts2-core-2.0.11JavaEE源代码 struts2-core-2.0.11JavaEE源代码 struts2-core-2.0.11JavaEE源代码 struts2-core-2.0.11JavaEE源代码 struts2-core-2.0.11JavaEE源代码 struts2-core-2.0.11JavaEE源...

    javaee-api-8.0-javadoc.jar

    javaee-api-8.0-javadoc.jar,这是javaee1.8api的jar包,解压后可用javadoc2chm制作成chm帮助文档。

    JavaEE源代码 struts2-spring-plugin-2.0.11

    JavaEE源代码 struts2-spring-plugin-2.0.11JavaEE源代码 struts2-spring-plugin-2.0.11JavaEE源代码 struts2-spring-plugin-2.0.11JavaEE源代码 struts2-spring-plugin-2.0.11JavaEE源代码 struts2-spring-plugin-...

    javaee-api-6.0-5

    java javaee-api-6.0-5

    JavaEE源代码 jaxen-1.1-beta-7

    JavaEE源代码 jaxen-1.1-beta-7JavaEE源代码 jaxen-1.1-beta-7JavaEE源代码 jaxen-1.1-beta-7JavaEE源代码 jaxen-1.1-beta-7JavaEE源代码 jaxen-1.1-beta-7JavaEE源代码 jaxen-1.1-beta-7JavaEE源代码 jaxen-1.1-...

    javaee5-doc-api

    EJB 3.0是Java EE 5中的核心组件之一,它极大地简化了EJB的使用,减少了对XML配置的依赖。实体Bean(Entity Beans)采用了注解驱动,无需XML配置,大大降低了学习和使用的难度。会话Bean(Session Beans)也变得更加...

    JavaEE源代码 commons-logging-1.0.4

    JavaEE源代码 commons-logging-1.0.4JavaEE源代码 commons-logging-1.0.4JavaEE源代码 commons-logging-1.0.4JavaEE源代码 commons-logging-1.0.4JavaEE源代码 commons-logging-1.0.4JavaEE源代码 commons-logging-...

    JavaEE源代码 commons-collections-2.1.1

    JavaEE源代码 commons-collections-2.1.1JavaEE源代码 commons-collections-2.1.1JavaEE源代码 commons-collections-2.1.1JavaEE源代码 commons-collections-2.1.1JavaEE源代码 commons-collections-2.1.1JavaEE源...

    javaEE健康管理系统SSH-oracle(源码+数据库sql+lun文+视频齐全).zip

    javaEE健康管理系统SSH-oracle(源码+数据库sql+lun文+视频齐全)javaEE健康管理系统SSH-oracle(源码+数据库sql+lun文+视频齐全)javaEE健康管理系统SSH-oracle(源码+数据库sql+lun文+视频齐全)javaEE健康管理系统SSH-...

    JavaEE5实用教程--基于Weblogic和Eclipse的代码

    JavaEE5是一个强大的企业级应用开发平台,它提供了丰富的组件和服务来构建分布式、多层的Web应用程序。本教程“JavaEE5实用教程--基于Weblogic和Eclipse的代码”是李绪成先生编著,旨在帮助开发者深入理解和实践...

Global site tag (gtag.js) - Google Analytics