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 社区中所有即将举行的活动。

查看全部