public MessageGroup getMessageGroup(Object groupId) {
    String key = getKey(groupId);
    final AtomicReference<Date> createDate = new AtomicReference<Date>();
    final AtomicReference<Date> updateDate = new AtomicReference<Date>();
    final AtomicReference<Boolean> completeFlag = new AtomicReference<Boolean>();
    final AtomicReference<Integer> lastReleasedSequenceRef = new AtomicReference<Integer>();

    List<Message<?>> messages =
        jdbcTemplate.query(
            getQuery(Query.LIST_MESSAGES_BY_GROUP_KEY), new Object[] {key, region}, mapper);

    if (messages.size() == 0) {
      return new SimpleMessageGroup(groupId);
    }

    jdbcTemplate.query(
        getQuery(Query.GET_GROUP_INFO),
        new Object[] {key, region},
        new RowCallbackHandler() {
          public void processRow(ResultSet rs) throws SQLException {
            updateDate.set(rs.getTimestamp("UPDATED_DATE"));

            createDate.set(rs.getTimestamp("CREATED_DATE"));

            completeFlag.set(rs.getInt("COMPLETE") > 0);

            lastReleasedSequenceRef.set(rs.getInt("LAST_RELEASED_SEQUENCE"));
          }
        });

    if (createDate.get() == null && updateDate.get() == null) {
      if (logger.isWarnEnabled()) {
        for (Message<?> message : messages) {
          logger.warn("Missing group row for message id: " + message.getHeaders().getId());
        }
      }
      return new SimpleMessageGroup(groupId);
    }

    long timestamp = createDate.get().getTime();
    boolean complete = completeFlag.get().booleanValue();

    SimpleMessageGroup messageGroup =
        new SimpleMessageGroup(messages, groupId, timestamp, complete);
    messageGroup.setLastModified(updateDate.get().getTime());

    int lastReleasedSequenceNumber = lastReleasedSequenceRef.get();
    messageGroup.setLastReleasedMessageSequenceNumber(lastReleasedSequenceNumber);

    return messageGroup;
  }