Hyperic 4.5 发布

工程 | Jennifer Hickey | 2010年11月10日 | ...

经过数月的开发,我很自豪地宣布Hyperic 4.5发布。在此版本中,我们将Hyperic从JBoss上运行的EJB应用程序迁移到Tomcat上运行的Spring Web应用程序。详细的迁移步骤在我的将Hyperic从EJB迁移到Spring的案例研究中进行了介绍,该案例研究最初在最近的SpringOne 2GX上发表。在这篇文章中,我想重点介绍一些我最喜欢的转换内容。

改进的可测试性

切换到Spring使我们能够将现有的无状态会话EJB转换为具有自动装配依赖项的POJO。这消除了许多使单元测试变得困难的静态JNDI查找代码。Spring还显著简化了集成测试。在转换之前,我们有少数集成测试,每个测试都需要几分钟来引导EJB容器的近似值。这个过程繁琐且容易出错。此外,测试通常会使数据库处于不一致状态,因此需要添加数据库设置或拆卸代码,这增加了测试执行时间的额外开销,并偶尔导致测试结果不一致。

转换后,我们能够利用Spring的集成测试支持来测试我们转换后的EJB的新服务层以及其底层的DAO。只需添加几个注解,我们就能在不到30秒的时间内启动整个应用程序上下文,并在一个专用的事务中运行每个测试方法,该事务在测试结束时自动回滚。这种支持被证明非常有价值,使我们能够快速地将我们的开源和企业代码库的测试覆盖率分别提高18%和12%。


@Transactional
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = "classpath*:META-INF/spring/*-context.xml")
public class AppdefManagerTest  {

  @Autowired
  private AppdefManager appdefManager;

  @Before
  public void setUp() throws Exception {
      createPlatformType("TestPlatform", "test");
  }

  @Test
  public void testGetControllablePlatformTypes() throws Exception {
      Map<String, AppdefEntityID> platformTypes = appdefManager
          .getControllablePlatformTypes(subject);
      assertEquals(1, platformTypes.size());
      assertEquals("TestPlatform", platformTypes.keySet().iterator().next());
  }
}

降低代码复杂度

简单地引入Spring进行依赖注入,通过消除冗长的依赖查找,大大简化了许多领域的代码。然而,在许多其他地方,Spring的引入显著提高了代码的清晰度,减少了基础设施的杂乱,使我们能够专注于真正的业务逻辑。我在Hyperic中最喜欢的两个例子是使用JmsTemplate发布JMS消息和使用JdbcTemplate进行数据访问。

消息发布之前


public void publishMessage(String name, Serializable sObj) {
       TopicConnection conn = null;
       TopicSession session = null;
       if (_ic == null)
               _ic = new InitialContext();
            if (_factory == null)
               _factory = _ic.lookup(CONN_FACTORY_JNDI);
            TopicConnectionFactory tFactory = (TopicConnectionFactory) _factory;
            Topic topic = getTopic(name);
            if (topic != null) {
               // Now create a connection to send a message
               if (_tConn != null)
                   conn = _tConn;
               else
                   conn = tFactory.createTopicConnection();
               if (conn == null)
                   _log.error("TopicConnection cannot be created");
               if (_tSession != null)
                   session = _tSession;
               else
                   session = conn.createTopicSession(false,
                                                     Session.AUTO_ACKNOWLEDGE);
               // Create a publisher and publish the message
               TopicPublisher publisher = session.createPublisher(topic);
               ObjectMessage msg = session.createObjectMessage();
               msg.setObject(sObj);
               publisher.publish(msg);
       ...
}

消息发布之后


public void publishMessage(String name, Serializable sObj) {
       eventsJmsTemplate.convertAndSend(name, sObj);
}

数据访问之前


public int getServicesCount(AuthzSubject subject) {
       Statement stmt = null;
       ResultSet rs = null;
       Integer subjectId = subject.getId();
        try {
           Connection conn = getDBConn();
           String sql = "SELECT COUNT(SVC.ID) FROM TBL_SERVICE";
           stmt = conn.createStatement();
           rs = stmt.executeQuery(sql);
           if (rs.next()) {
               return rs.getInt(1);
           }
       } catch (SQLException e) {
           log.error("Caught SQL Exception finding Services by type: " + e, e);
                    throw new SystemException(e);
       } finally {
           DBUtil.closeJDBCObjects(LOG_CTX, null, stmt, rs);
       }
       return 0;
}

数据访问之后


public int getServicesCount(AuthzSubject subject) {
       return jdbcTemplate.queryForInt("SELECT COUNT(SVC.ID) FROM TBL_SERVICE");
   }

这真是一个减肥计划!仅仅通过转换为Spring而没有改变任何功能,我们将开源和企业代码库都减少了大约7%。

提高开发人员生产力

如上所述,Spring对集成测试的支持使我们能够在不到30秒内启动整个应用程序上下文,进行端到端集成测试。这在测试新功能或调试问题时节省了大量时间。当我们需要启动整个Web应用程序时,转向Tomcat通过显著缩短启动时间提高了我们的生产力。一个开发人员编码和调试应用程序,现在每次启动应用程序大约节省5分钟的等待时间。考虑到开发人员每天可能重新启动应用程序12次,这每天腾出了整整一个小时来开发新功能!此外,更简洁的代码和改进的单元可测试性使得查找和修复问题更快更容易,灵活的架构使得添加新功能和增强功能更简单。

这些只是本次发布中切换到Spring和Tomcat带来的一些好处。实在太多了,无法在一篇博客文章中列出!

本次发布还包含了对VMware vFabric平台服务的三个服务的监控和管理,包括vFabric GemFire 6.5分布式缓存系统RabbitMQ企业消息系统,以及本周也发布的新版vFabric tc Server 2.1 Java运行时服务器。vFabric tc Server的支持在Hyperic的早期版本中已经存在;然而,在4.5版本中,插件现在与Hyperic发行版捆绑在一起,不再是单独下载。请关注未来的博客文章,获取更多关于监控GemFire和RabbitMQ的信息。

在迁移过程中,我们还借此机会将代码仓库从Subversion迁移到了Git。要从Git代码仓库下载源代码,请访问http://git.springsource.org/hq。我们还将构建系统从Ant切换到了Maven。现在,开发自定义插件或功能所需的所有Hyperic模块都可以从我们的Maven仓库http://maven.hyperic.org/release下载。

结论

我鼓励您下载Hyperic 4.5和/或查看代码。一如既往,我们非常感谢通过论坛提供的社区反馈。我们期待在我们转换为Spring所提供的这个易于扩展的架构基础上继续发展。请继续关注更多激动人心的增强功能!

获取 Spring 新闻通讯

通过 Spring 新闻通讯保持联系

订阅

领先一步

VMware 提供培训和认证,助您加速进步。

了解更多

获得支持

Tanzu Spring 提供 OpenJDK™、Spring 和 Apache Tomcat® 的支持和二进制文件,只需一份简单的订阅。

了解更多

即将举行的活动

查看 Spring 社区所有即将举行的活动。

查看所有