#
# Licensed to the Apache Software Foundation (ASF) under one or more
# contributor license agreements.  See the NOTICE file distributed with
# this work for additional information regarding copyright ownership.
# The ASF licenses this file to You under the Apache License, Version 2.0
# (the "License"); you may not use this file except in compliance with
# the License.  You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

# services
BatchArtifactFactory = org.apache.batchee.container.services.factory.CDIBatchArtifactFactory
BatchThreadPoolService = org.apache.batchee.container.services.executor.BoundedThreadPoolService

# It is important to ensure we don't break the "heavy" storage persistance managers using the JDBC one
# as main sample. To do so just uncomment this line. If we consider it as dangerous we could activate it
# in *another* execution of TCKs (surefire) by default.
#
# PersistenceManagerService = org.apache.batchee.container.services.persistence.JDBCPersistenceManagerService
# persistence.database.jndi = jdbc/batchee

# to test jpa implementation - using defaults = resource local on a persistence unit named batchee
# PersistenceManagerService = org.apache.batchee.container.services.persistence.JPAPersistenceManagerService
