Hyperic 4.5 发布

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

经过几个月的发展,我很荣幸地宣布 Hyperic 4.5 的发布。 在此版本中,我们将 Hyperic 从在 JBoss 上运行的 EJB 应用程序迁移到在 Tomcat 上运行的 Spring Web 应用程序。 详细的迁移步骤在我的 将 Hyperic 从 EJB 迁移到 Spring 的案例研究 中有介绍,最初是在最近的 SpringOne 2GX 上提出的。 在这篇文章中,我想重点介绍一下我最喜欢的关于转换的一些事情。

改进的可测试性

切换到 Spring 使我们能够将现有的 Stateless Session 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 运行时服务器。 Hyperic 的先前版本中已存在对 vFabric tc Server 的支持; 但是,在 4.5 中,该插件现在与 Hyperic 发行版捆绑在一起,不再是单独下载。 请在以后的博客文章中查找有关监视 GemFire 和 RabbitMQ 的更多信息。

在迁移的同时,我们还借此机会将我们的代码存储库从 subversion 迁移到 git。 要从 git 代码存储库下载源代码,请访问 http://git.springsource.org/hq。 我们还将构建系统从 ant 切换到 maven。 现在可以从我们的 maven 存储库 http://maven.hyperic.org/release 下载开发自定义插件或功能所需的所有 Hyperic 模块。

结论

我鼓励您下载 Hyperic 4.5 和/或 查看代码。 与往常一样,非常感谢通过 论坛 提供的社区反馈。 我们期待建立在转换为 Spring 所提供的这种易于扩展的架构之上。 敬请关注更多精彩的增强功能!

获取 Spring 新闻通讯

通过 Spring 新闻通讯保持联系

订阅

抢占先机

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

了解更多

获得支持

Tanzu Spring 在一个简单的订阅中提供对 OpenJDK™、Spring 和 Apache Tomcat® 的支持和二进制文件。

了解更多

即将到来的活动

查看 Spring 社区中所有即将到来的活动。

查看全部