jpskill.com
🛠️ 開発・MCP コミュニティ

java-architect

Java 21やSpring Boot 3などを活用し、最新のJava技術とマイクロサービスで企業向けアプリケーションを設計するSkill。

📜 元の英語説明(参考)

Expert Java architect specializing in Java 21, Spring Boot 3, and Jakarta EE ecosystem. This agent excels at designing enterprise-grade applications with modern Java features, microservices architecture, and comprehensive enterprise integration patterns.

🇯🇵 日本人クリエイター向け解説

一言でいうと

Java 21やSpring Boot 3などを活用し、最新のJava技術とマイクロサービスで企業向けアプリケーションを設計するSkill。

※ jpskill.com 編集部が日本のビジネス現場向けに補足した解説です。Skill本体の挙動とは独立した参考情報です。

⚡ おすすめ: コマンド1行でインストール(60秒)

下記のコマンドをコピーしてターミナル(Mac/Linux)または PowerShell(Windows)に貼り付けてください。 ダウンロード → 解凍 → 配置まで全自動。

🍎 Mac / 🐧 Linux
mkdir -p ~/.claude/skills && cd ~/.claude/skills && curl -L -o java-architect.zip https://jpskill.com/download/6678.zip && unzip -o java-architect.zip && rm java-architect.zip
🪟 Windows (PowerShell)
$d = "$env:USERPROFILE\.claude\skills"; ni -Force -ItemType Directory $d | Out-Null; iwr https://jpskill.com/download/6678.zip -OutFile "$d\java-architect.zip"; Expand-Archive "$d\java-architect.zip" -DestinationPath $d -Force; ri "$d\java-architect.zip"

完了後、Claude Code を再起動 → 普通に「動画プロンプト作って」のように話しかけるだけで自動発動します。

💾 手動でダウンロードしたい(コマンドが難しい人向け)
  1. 1. 下の青いボタンを押して java-architect.zip をダウンロード
  2. 2. ZIPファイルをダブルクリックで解凍 → java-architect フォルダができる
  3. 3. そのフォルダを C:\Users\あなたの名前\.claude\skills\(Win)または ~/.claude/skills/(Mac)へ移動
  4. 4. Claude Code を再起動

⚠️ ダウンロード・利用は自己責任でお願いします。当サイトは内容・動作・安全性について責任を負いません。

🎯 このSkillでできること

下記の説明文を読むと、このSkillがあなたに何をしてくれるかが分かります。Claudeにこの分野の依頼をすると、自動で発動します。

📦 インストール方法 (3ステップ)

  1. 1. 上の「ダウンロード」ボタンを押して .skill ファイルを取得
  2. 2. ファイル名の拡張子を .skill から .zip に変えて展開(macは自動展開可)
  3. 3. 展開してできたフォルダを、ホームフォルダの .claude/skills/ に置く
    • · macOS / Linux: ~/.claude/skills/
    • · Windows: %USERPROFILE%\.claude\skills\

Claude Code を再起動すれば完了。「このSkillを使って…」と話しかけなくても、関連する依頼で自動的に呼び出されます。

詳しい使い方ガイドを見る →
最終更新
2026-05-17
取得日時
2026-05-17
同梱ファイル
1

📖 Skill本文(日本語訳)

※ 原文(英語/中国語)を Gemini で日本語化したものです。Claude 自身は原文を読みます。誤訳がある場合は原文をご確認ください。

Javaアーキテクトスペシャリスト

目的

Java 21、Spring Boot 3、およびJakarta EEエコシステムに特化した、専門的なJavaアーキテクチャの専門知識を提供します。最新のJava機能(仮想スレッド、パターンマッチング)、マイクロサービスアーキテクチャ、およびスケーラブルで保守性の高いシステムのための包括的なエンタープライズ統合パターンを用いて、エンタープライズグレードのアプリケーションを設計します。

使用する場面

  • Spring Boot 3(マイクロサービス、REST API)でエンタープライズアプリケーションを構築する場合
  • Java 21の機能(仮想スレッド、パターンマッチング、レコード、sealed classes)を実装する場合
  • Spring Cloud(サービスディスカバリ、サーキットブレーカー)でマイクロサービスアーキテクチャを設計する場合
  • Jakarta EEアプリケーション(CDI、JPA、JAX-RS)を開発する場合
  • Spring WebFluxでリアクティブアプリケーションを作成する場合
  • イベント駆動型システム(Kafka、RabbitMQ)を構築する場合
  • JVMパフォーマンスを最適化する場合(GCチューニング、プロファイリング)

主要な機能

エンタープライズアーキテクチャ

  • マイクロサービスおよびモノリスアーキテクチャの設計
  • ドメイン駆動設計パターン(集約、境界づけられたコンテキスト)の実装
  • Spring Cloudエコシステム(Eureka、Config、Gateway)の構成
  • OpenAPI/Swaggerを用いたAPIファーストアーキテクチャの構築

最新のJava開発

  • 高並行性のためのJava 21仮想スレッドの実装
  • 型安全性のためのパターンマッチングとsealed classesの使用
  • 不変モデルのためのレコードとデータクラスの構築
  • ストリームを用いた関数型プログラミングパターンの適用

Springエコシステム

  • Spring Bootアプリケーションの構成とデプロイ
  • データベースアクセスと最適化のためのSpring Data JPA
  • 認証と認可のためのSpring Security
  • リアクティブでノンブロッキングなアプリケーションのためのSpring WebFlux

パフォーマンス最適化

  • JVMチューニングとガベージコレクションの構成
  • メモリプロファイリングとリーク検出
  • コネクションプーリングとデータベース最適化
  • GraalVMによるアプリケーション起動の最適化


2. 意思決定フレームワーク

Spring Framework選択意思決定ツリー

Application Requirements
│
├─ Need reactive, non-blocking I/O?
│  └─ Spring WebFlux ✓
│     - Netty/Reactor runtime
│     - Backpressure support
│     - High concurrency (100K+ connections)
│
├─ Traditional servlet-based web app?
│  └─ Spring MVC ✓
│     - Tomcat/Jetty runtime
│     - Familiar blocking model
│     - Easier debugging
│
├─ Microservices with service discovery?
│  └─ Spring Cloud ✓
│     - Eureka/Consul for discovery
│     - Config server
│     - API gateway (Spring Cloud Gateway)
│
├─ Batch processing?
│  └─ Spring Batch ✓
│     - Chunk-oriented processing
│     - Job scheduling
│     - Transaction management
│
└─ Need minimal footprint?
   └─ Spring Boot with GraalVM Native Image ✓
      - AOT compilation
      - Fast startup (<100ms)
      - Low memory (<50MB)

JPA vs JDBC 意思決定マトリックス

Factor Use JPA/Hibernate Use JDBC (Spring JdbcTemplate)
Complexity Complex domain models with relationships Simple queries, reporting
Performance OLTP with caching (2nd-level cache) OLAP, bulk operations
Type safety Criteria API, type-safe queries Plain SQL with RowMapper
Maintenance Schema evolution with migrations Direct SQL control
Learning curve Steeper (lazy loading, cascades) Simpler, explicit
N+1 queries Risk (needs @EntityGraph, fetch joins) Explicit control

決定例: 関係性を持つEコマース注文システム → JPA (Order → OrderItems → Products)
決定例: 集計を含む分析ダッシュボード → JDBC (複雑なSQL、パフォーマンスが重要)

仮想スレッド (Project Loom) 意思決定パス

Concurrency Requirements
│
├─ High thread count (>1000 threads)?
│  └─ Virtual Threads ✓
│     - Millions of threads possible
│     - No thread pool tuning
│     - Blocking code becomes cheap
│
├─ I/O-bound operations (DB, HTTP)?
│  └─ Virtual Threads ✓
│     - JDBC calls don't block platform threads
│     - HTTP client calls scale better
│
├─ CPU-bound operations?
│  └─ Platform Threads (ForkJoinPool) ✓
│     - Virtual threads don't help
│     - Use parallel streams
│
└─ Need compatibility with existing code?
   └─ Virtual Threads ✓
      - Drop-in replacement for Thread
      - No code changes required

レッドフラグ → Oracleへのエスカレーション

Observation Why Escalate Example
JPAのN+1クエリが1000以上のDB呼び出しを引き起こしている 複雑な遅延ロードの問題 「単一ページの読み込みで500のSELECTクエリがトリガーされる」
Spring Beanに循環依存がある アーキテクチャ設計上の問題 「起動時にBeanCurrentlyInCreationExceptionが発生する」
GCチューニングにもかかわらずメモリリークが発生している 複雑なオブジェクト保持 「Full GCにもかかわらずヒープが最大まで増加し、ヒープダンプに原因不明の保持が示される」
複数のマイクロサービスにまたがる分散トランザクション SAGAパターンまたは補償トランザクション 「Order、Payment、Inventoryサービス間でACIDが必要」
リアクティブストリームのバックプレッシャーが過負荷になっている 複雑なリアクティブパイプライン 「Fluxが過剰に生成され、ダウンストリームが追いつかない」


ワークフロー 2: Kafkaを使用したイベント駆動型マイクロサービス

シナリオ: 注文サービスにイベントソーシングを実装する

ステップ 1: Spring Kafkaを構成する

// Configuration/KafkaConfig.java
@Configuration
@EnableKafka
public class KafkaConfig {

    @Value("${spring.kafka.bootstrap-servers}")
    private String bootstrapServers;

    @Bean
    public ProducerFactory<String, DomainEvent> producerFactory() {
        Map<String, Object> config = Map.of(
            ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, bootstrapServers,
            ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG, StringSerializer.class,
            ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG, JsonSerializer.class,
            ProducerConfig.ACKS_CONFIG, "all",
            ProducerConfig.RETRIES_CONFIG, 3,
            ProducerConfig.ENABLE_IDEMPOTENCE_CONFIG, true
        );

        return new DefaultKafkaProducerFactory<>(c
📜 原文 SKILL.md(Claudeが読む英語/中国語)を展開

Java Architect Specialist

Purpose

Provides expert Java architecture expertise specializing in Java 21, Spring Boot 3, and Jakarta EE ecosystem. Designs enterprise-grade applications with modern Java features (virtual threads, pattern matching), microservices architecture, and comprehensive enterprise integration patterns for scalable, maintainable systems.

When to Use

  • Building enterprise applications with Spring Boot 3 (microservices, REST APIs)
  • Implementing Java 21 features (virtual threads, pattern matching, records, sealed classes)
  • Designing microservices architecture with Spring Cloud (service discovery, circuit breakers)
  • Developing Jakarta EE applications (CDI, JPA, JAX-RS)
  • Creating reactive applications with Spring WebFlux
  • Building event-driven systems (Kafka, RabbitMQ)
  • Optimizing JVM performance (GC tuning, profiling)

Core Capabilities

Enterprise Architecture

  • Designing microservices and monolith architectures
  • Implementing domain-driven design patterns (aggregates, bounded contexts)
  • Configuring Spring Cloud ecosystem (Eureka, Config, Gateway)
  • Building API-first architectures with OpenAPI/Swagger

Modern Java Development

  • Implementing Java 21 virtual threads for high concurrency
  • Using pattern matching and sealed classes for type safety
  • Building records and data classes for immutable models
  • Applying functional programming patterns with streams

Spring Ecosystem

  • Spring Boot application configuration and deployment
  • Spring Data JPA for database access and optimization
  • Spring Security for authentication and authorization
  • Spring WebFlux for reactive, non-blocking applications

Performance Optimization

  • JVM tuning and garbage collection configuration
  • Memory profiling and leak detection
  • Connection pooling and database optimization
  • Application startup optimization with GraalVM


2. Decision Framework

Spring Framework Selection Decision Tree

Application Requirements
│
├─ Need reactive, non-blocking I/O?
│  └─ Spring WebFlux ✓
│     - Netty/Reactor runtime
│     - Backpressure support
│     - High concurrency (100K+ connections)
│
├─ Traditional servlet-based web app?
│  └─ Spring MVC ✓
│     - Tomcat/Jetty runtime
│     - Familiar blocking model
│     - Easier debugging
│
├─ Microservices with service discovery?
│  └─ Spring Cloud ✓
│     - Eureka/Consul for discovery
│     - Config server
│     - API gateway (Spring Cloud Gateway)
│
├─ Batch processing?
│  └─ Spring Batch ✓
│     - Chunk-oriented processing
│     - Job scheduling
│     - Transaction management
│
└─ Need minimal footprint?
   └─ Spring Boot with GraalVM Native Image ✓
      - AOT compilation
      - Fast startup (<100ms)
      - Low memory (<50MB)

JPA vs JDBC Decision Matrix

Factor Use JPA/Hibernate Use JDBC (Spring JdbcTemplate)
Complexity Complex domain models with relationships Simple queries, reporting
Performance OLTP with caching (2nd-level cache) OLAP, bulk operations
Type safety Criteria API, type-safe queries Plain SQL with RowMapper
Maintenance Schema evolution with migrations Direct SQL control
Learning curve Steeper (lazy loading, cascades) Simpler, explicit
N+1 queries Risk (needs @EntityGraph, fetch joins) Explicit control

Example decision: E-commerce order system with relationships → JPA (Order → OrderItems → Products)
Example decision: Analytics dashboard with aggregations → JDBC (complex SQL, performance-critical)

Virtual Threads (Project Loom) Decision Path

Concurrency Requirements
│
├─ High thread count (>1000 threads)?
│  └─ Virtual Threads ✓
│     - Millions of threads possible
│     - No thread pool tuning
│     - Blocking code becomes cheap
│
├─ I/O-bound operations (DB, HTTP)?
│  └─ Virtual Threads ✓
│     - JDBC calls don't block platform threads
│     - HTTP client calls scale better
│
├─ CPU-bound operations?
│  └─ Platform Threads (ForkJoinPool) ✓
│     - Virtual threads don't help
│     - Use parallel streams
│
└─ Need compatibility with existing code?
   └─ Virtual Threads ✓
      - Drop-in replacement for Thread
      - No code changes required

Red Flags → Escalate to Oracle

Observation Why Escalate Example
JPA N+1 queries causing 1000+ DB calls Complex lazy loading issue "Single page load triggers 500 SELECT queries"
Circular dependency in Spring beans Architectural design problem "BeanCurrentlyInCreationException during startup"
Memory leak despite GC tuning Complex object retention "Heap grows to max despite Full GC, heap dump shows mysterious retention"
Distributed transaction spanning multiple microservices SAGA pattern or compensating transactions "Need ACID across Order, Payment, Inventory services"
Reactive stream backpressure overload Complex reactive pipeline "Flux overproducing, downstream can't keep up"


Workflow 2: Event-Driven Microservice with Kafka

Scenario: Implement event sourcing for order service

Step 1: Configure Spring Kafka

// Configuration/KafkaConfig.java
@Configuration
@EnableKafka
public class KafkaConfig {

    @Value("${spring.kafka.bootstrap-servers}")
    private String bootstrapServers;

    @Bean
    public ProducerFactory<String, DomainEvent> producerFactory() {
        Map<String, Object> config = Map.of(
            ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, bootstrapServers,
            ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG, StringSerializer.class,
            ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG, JsonSerializer.class,
            ProducerConfig.ACKS_CONFIG, "all",
            ProducerConfig.RETRIES_CONFIG, 3,
            ProducerConfig.ENABLE_IDEMPOTENCE_CONFIG, true
        );

        return new DefaultKafkaProducerFactory<>(config);
    }

    @Bean
    public KafkaTemplate<String, DomainEvent> kafkaTemplate() {
        return new KafkaTemplate<>(producerFactory());
    }

    @Bean
    public ConsumerFactory<String, DomainEvent> consumerFactory() {
        Map<String, Object> config = Map.of(
            ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG, bootstrapServers,
            ConsumerConfig.KEY_DESERIALIZER_CLASS_CONFIG, StringDeserializer.class,
            ConsumerConfig.VALUE_DESERIALIZER_CLASS_CONFIG, JsonDeserializer.class,
            ConsumerConfig.GROUP_ID_CONFIG, "order-service",
            ConsumerConfig.AUTO_OFFSET_RESET_CONFIG, "earliest",
            ConsumerConfig.ENABLE_AUTO_COMMIT_CONFIG, false,
            JsonDeserializer.TRUSTED_PACKAGES, "com.example.order.domain.events"
        );

        return new DefaultKafkaConsumerFactory<>(config);
    }
}

Step 2: Define domain events

// Domain/Events/DomainEvent.java
public sealed interface DomainEvent permits 
    OrderCreated, OrderItemAdded, OrderProcessingStarted, OrderCompleted, OrderCancelled {

    UUID aggregateId();
    LocalDateTime occurredAt();
    long version();
}

public record OrderCreated(
    UUID aggregateId,
    UUID customerId,
    LocalDateTime occurredAt,
    long version
) implements DomainEvent {}

public record OrderItemAdded(
    UUID aggregateId,
    UUID productId,
    int quantity,
    BigDecimal unitPrice,
    LocalDateTime occurredAt,
    long version
) implements DomainEvent {}

public record OrderCompleted(
    UUID aggregateId,
    BigDecimal totalAmount,
    LocalDateTime occurredAt,
    long version
) implements DomainEvent {}

Step 3: Event publisher

// Infrastructure/EventPublisher.java
@Component
public class DomainEventPublisher {

    private final KafkaTemplate<String, DomainEvent> kafkaTemplate;
    private static final String TOPIC = "order-events";

    public DomainEventPublisher(KafkaTemplate<String, DomainEvent> kafkaTemplate) {
        this.kafkaTemplate = kafkaTemplate;
    }

    @Async
    public CompletableFuture<Void> publish(DomainEvent event) {
        return kafkaTemplate.send(TOPIC, event.aggregateId().toString(), event)
            .thenAccept(result -> {
                var metadata = result.getRecordMetadata();
                log.info("Published event: {} to partition {} offset {}",
                    event.getClass().getSimpleName(),
                    metadata.partition(),
                    metadata.offset());
            })
            .exceptionally(ex -> {
                log.error("Failed to publish event: {}", event, ex);
                return null;
            });
    }
}

Step 4: Event consumer

// Infrastructure/OrderEventConsumer.java
@Component
public class OrderEventConsumer {

    private final OrderProjectionService projectionService;

    @KafkaListener(
        topics = "order-events",
        groupId = "order-read-model",
        containerFactory = "kafkaListenerContainerFactory"
    )
    public void handleEvent(
        @Payload DomainEvent event,
        @Header(KafkaHeaders.RECEIVED_PARTITION) int partition,
        @Header(KafkaHeaders.OFFSET) long offset
    ) {
        log.info("Received event: {} from partition {} offset {}", 
            event.getClass().getSimpleName(), partition, offset);

        switch (event) {
            case OrderCreated e -> projectionService.handleOrderCreated(e);
            case OrderItemAdded e -> projectionService.handleOrderItemAdded(e);
            case OrderCompleted e -> projectionService.handleOrderCompleted(e);
            case OrderCancelled e -> projectionService.handleOrderCancelled(e);
            default -> log.warn("Unknown event type: {}", event);
        }
    }
}

Expected outcome:

  • Event-driven architecture with Kafka
  • Type-safe event handling (sealed interfaces, pattern matching)
  • Async event publishing with CompletableFuture
  • Idempotent event processing


4. Patterns & Templates

Pattern 1: Repository Pattern with Specifications

Use case: Type-safe dynamic queries

// Specification for dynamic filtering
public class OrderSpecifications {

    public static Specification<Order> hasCustomerId(CustomerId customerId) {
        return (root, query, cb) -> 
            cb.equal(root.get("customerId"), customerId);
    }

    public static Specification<Order> hasStatus(OrderStatus status) {
        return (root, query, cb) -> 
            cb.equal(root.get("status"), status);
    }

    public static Specification<Order> createdBetween(LocalDateTime start, LocalDateTime end) {
        return (root, query, cb) -> 
            cb.between(root.get("createdAt"), start, end);
    }

    public static Specification<Order> totalGreaterThan(BigDecimal amount) {
        return (root, query, cb) -> 
            cb.greaterThan(root.get("totalAmount"), amount);
    }
}

// Usage: Combine specifications
Specification<Order> spec = Specification
    .where(hasCustomerId(customerId))
    .and(hasStatus(new OrderStatus.Pending()))
    .and(createdBetween(startDate, endDate));

List<Order> orders = orderRepository.findAll(spec);


Pattern 3: CQRS with Separate Read/Write Models

Use case: Optimize reads independently from writes

// Write model (domain entity)
@Entity
public class Order {
    // Rich behavior, complex relationships
    public void addItem(Product product, int quantity) { ... }
    public void complete() { ... }
}

// Read model (denormalized projection)
@Entity
@Table(name = "order_summary")
@Immutable
public class OrderSummary {

    @Id
    private UUID orderId;
    private UUID customerId;
    private String customerName;
    private int itemCount;
    private BigDecimal totalAmount;
    private String status;
    private LocalDateTime createdAt;

    // Getters only (no setters, immutable)
}

// Read repository (optimized queries)
public interface OrderSummaryRepository extends JpaRepository<OrderSummary, UUID> {

    @Query("""
        SELECT os FROM OrderSummary os
        WHERE os.customerId = :customerId
        ORDER BY os.createdAt DESC
        """)
    List<OrderSummary> findByCustomerId(@Param("customerId") UUID customerId);
}


❌ Anti-Pattern: LazyInitializationException

What it looks like:

@Service
@Transactional
public class OrderService {

    public Order findById(OrderId id) {
        return orderRepository.findById(id).orElseThrow();
    }
}

@RestController
public class OrderController {

    @GetMapping("/orders/{id}")
    public OrderDto getOrder(@PathVariable UUID id) {
        Order order = orderService.findById(new OrderId(id));

        // Transaction already closed!
        var items = order.getItems(); // LazyInitializationException!

        return new OrderDto(order, items);
    }
}

Why it fails:

  • Lazy loading outside transaction: Hibernate proxy can't load data
  • N+1 queries: Even if transaction open, lazy loads trigger multiple queries

Correct approach:

// Option 1: Eager fetch with @EntityGraph
@Repository
public interface OrderRepository extends JpaRepository<Order, OrderId> {

    @EntityGraph(attributePaths = {"items", "items.product"})
    Optional<Order> findById(OrderId id);
}

// Option 2: DTO projection (no lazy loading)
@Query("""
    SELECT new com.example.dto.OrderDto(
        o.id, o.customerId, o.totalAmount,
        COUNT(i.id), o.status, o.createdAt
    )
    FROM Order o
    LEFT JOIN o.items i
    WHERE o.id = :id
    GROUP BY o.id, o.customerId, o.totalAmount, o.status, o.createdAt
    """)
Optional<OrderDto> findOrderDtoById(@Param("id") OrderId id);

// Option 3: Open Session in View (not recommended for APIs)
spring.jpa.open-in-view: false  // Disable to catch lazy loading issues early


6. Integration Patterns

backend-developer:

  • Handoff: Backend-developer defines business logic → java-architect implements with Spring Boot patterns
  • Collaboration: REST API design, database schema, authentication/authorization
  • Tools: Spring Boot, Spring Security, Spring Data JPA, Jackson
  • Example: Backend defines order workflow → java-architect implements with DDD aggregates and domain events

database-optimizer:

  • Handoff: Java-architect identifies slow JPA queries → database-optimizer creates indexes
  • Collaboration: Query optimization, connection pooling, transaction tuning
  • Tools: Hibernate statistics, JPA Criteria API, native queries
  • Example: N+1 query problem → database-optimizer adds composite index on foreign keys

devops-engineer:

  • Handoff: Java-architect builds Spring Boot app → devops-engineer containerizes with Docker
  • Collaboration: Health checks, metrics (Actuator), graceful shutdown
  • Tools: Spring Boot Actuator, Micrometer, Docker multi-stage builds
  • Example: Java-architect exposes /actuator/health → devops-engineer configures Kubernetes liveness probe

kubernetes-specialist:

  • Handoff: Java-architect builds microservice → kubernetes-specialist deploys to K8s
  • Collaboration: Readiness probes, resource limits, rolling updates
  • Tools: Spring Cloud Kubernetes, ConfigMaps, Secrets
  • Example: Java-architect uses @ConfigurationProperties → kubernetes-specialist provides ConfigMap

graphql-architect:

  • Handoff: Java-architect provides domain model → graphql-architect exposes as GraphQL API
  • Collaboration: Schema design, N+1 prevention with DataLoader
  • Tools: Spring GraphQL, GraphQL Java, DataLoader
  • Example: Order aggregate → GraphQL type with resolvers and subscriptions