Hyperic 4.5 版本發布

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

經過數個月的開發,我很榮幸地宣布 Hyperic 4.5 版本發布。在此版本中,我們將 Hyperic 從在 JBoss 上執行的 EJB 應用程式遷移到在 Tomcat 上執行的 Spring Web 應用程式。詳細的遷移步驟涵蓋在我的 Hyperic 從 EJB 遷移到 Spring 的案例研究中,該研究最初在最近的 SpringOne 2GX 大會上發表。在這篇文章中,我想重點介紹一些關於此轉換我最喜歡的部分。

改善的可測試性

切換到 Spring 讓我們能夠將現有的無狀態 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。自訂外掛程式或功能開發所需的所有 Hyperic 模組現在都可以從我們的 Maven 儲存庫下載,網址為 http://maven.hyperic.org/release

結論

我鼓勵您下載 Hyperic 4.5 和/或 查看程式碼。與往常一樣,非常感謝透過 論壇 提供的社群回饋。我們期待在此易於擴展的架構基礎上繼續發展,這是我們轉換到 Spring 所提供的。敬請期待更多令人興奮的增強功能!

取得 Spring 電子報

隨時掌握 Spring 電子報的最新資訊

訂閱

領先一步

VMware 提供培訓和認證,以加速您的進展。

了解更多

取得支援

Tanzu Spring 在一個簡單的訂閱中提供 OpenJDK™、Spring 和 Apache Tomcat® 的支援和二進位檔案。

了解更多

即將到來的活動

查看 Spring 社群中所有即將到來的活動。

查看全部