Leonhard,
Glad you got it working and thanks for sharing that code. I saved it
because I'll probably need it some day. I have never used a custom thread
pool before. My app only has a couple of background threads and so I'm just
using @Scheduled annotation of Spring. You must be doing some "heavy
lifting" in your app.

Best regards,
Clay Ferguson
wcl...@gmail.com


On Fri, Aug 7, 2015 at 7:25 AM, lw <leonh...@wachutka.eu> wrote:

> Hi Clay,
>
> thanks for your advice. Indeed I digged quiet deep into the source and got
> it finally running. The trick was to include tika-core. The default
> executor of Oak is quiet hacky, it swallows exceptions thrown by its
> threads without logging. So I didn’t get the class not found exception,
> caused by missing tika dependencies, at least in my tomcat deployment.
>
> Just for the records I post my working config. I also added a custom
> OakExecutorProvider to handle the memory leaks by orphan exectors at oak
> shutdown.
>
> I hope it may help someone facing similar problems.
>
> Best Leonhard Wachutka
>
> In pom.xml:
>
> <dependency>
>             <groupId>org.apache.tika</groupId>
>             <artifactId>tika-core</artifactId>
>             <version>1.9</version>
> </dependency>
> SolrServerProviderFactroy:
>
>
> public class SolrServerProviderFactroy {
>
>     @Bean
>     public RemoteSolrServerProvider remoteSolrServerProvider()
>     {
>         RemoteSolrServerConfiguration remoteSolrConfig = new
> RemoteSolrServerConfiguration(null, null, 1, 1, null, "
> http://192.168.2.250:8983/solr/oak";);
>         return new RemoteSolrServerProvider(remoteSolrConfig);
>
>     }
>     @Bean
>     public OakSolrConfigurationProvider oakSolrConfigProvider()
>     {
>         OakSolrConfiguration oakSolrconfiguration = new
> DefaultSolrConfiguration() {
>             @Override
>             public OakSolrConfiguration.CommitPolicy getCommitPolicy() {
>                 return OakSolrConfiguration.CommitPolicy.HARD;
>             }
>             @Override
>             public boolean useForPropertyRestrictions() {
>                 return false;
>             }
>             @Override
>             public boolean useForPrimaryTypes() {
>                 return false;
>             }
>             @Override
>             public boolean useForPathRestrictions() {
>                 return false;
>             }
>             @Override
>                 public String getFieldNameFor(Type<?> propertyType) {
>                 return null;
>                }
>
>         };
>
>
>         return new DefaultSolrConfigurationProvider(oakSolrconfiguration);
>     }
> }
>
>
>
> protected Repository createRepository() throws Exception {
>
>
>         // return JackRabbit repository.
>         log.info("Start of Apache Jackrabbit OAK Repository.\n{host:" +
> host +"\ndbName:"+ dbName+"}");
>         DB db = new MongoClient(host, 27017).getDB(dbName);
>         documentNodeStore = new DocumentMK.Builder().
>                 setMongoDB(db).getNodeStore();
>
>
>         oak = new Oak(documentNodeStore)
>         .with(new SolrIndexInitializer(true))
>                 .with(AggregateIndexProvider.wrap(new
> SolrQueryIndexProvider(solrServerProvider, oakSolrConfigurationProvider)))
>                 .with(new SolrIndexEditorProvider(solrServerProvider,
> oakSolrConfigurationProvider))
>                 .with( new NodeStateSolrServersObserver())
>                 .withAsyncIndexing()
>                 .with(executorProvider.defaultExecutorService())
>                 .with(executorProvider.defaultScheduledExecutor());
>
>         Repository repo = new Jcr(oak).createRepository();
>         return repo;
>     }
>
> public class OakExecutorProvider {
>     final static Logger logger =
> LoggerFactory.getLogger(OakExecutorProvider.class);
>     private ScheduledThreadPoolExecutor scheduledThreadPoolExecutor;
>     private ThreadPoolExecutor threadPoolExecutor;
>     public ScheduledExecutorService defaultScheduledExecutor() {
>         scheduledThreadPoolExecutor = new ScheduledThreadPoolExecutor(32,
> new ThreadFactory() {
>             private final AtomicInteger counter = new AtomicInteger();
>
>             @Override
>             public Thread newThread(@Nonnull Runnable r) {
>                 Thread thread = new Thread(r, createName());
>                 thread.setDaemon(true);
>                 return thread;
>             }
>
>             private String createName() {
>                 return "oak-scheduled-executor-" +
> counter.getAndIncrement();
>             }
>         });
>         scheduledThreadPoolExecutor.setKeepAliveTime(1, TimeUnit.MINUTES);
>         scheduledThreadPoolExecutor.allowCoreThreadTimeOut(true);
>         return scheduledThreadPoolExecutor;
>     }
>
>     /**
>      * Default {@code ExecutorService} used for scheduling concurrent
> tasks.
>      * This default spawns as many threads as required with a priority of
>      * {@code Thread.MIN_PRIORITY}. Idle threads are pruned after one
> minute.
>      * @return  fresh ExecutorService
>      */
>     public ExecutorService defaultExecutorService() {
>         threadPoolExecutor = new ThreadPoolExecutor(0, Integer.MAX_VALUE,
> 60L, TimeUnit.SECONDS,
>                 new SynchronousQueue<Runnable>(), new ThreadFactory() {
>             private final AtomicInteger counter = new AtomicInteger();
>
>             @Override
>             public Thread newThread(@Nonnull Runnable r) {
>                 Thread thread = new Thread(r, createName());
>                 thread.setDaemon(true);
>                 thread.setPriority(Thread.MIN_PRIORITY);
>                 return thread;
>             }
>
>             private String createName() {
>                 return "oak-executor-" + counter.getAndIncrement();
>             }
>         });
>         threadPoolExecutor.setKeepAliveTime(1, TimeUnit.MINUTES);
>         threadPoolExecutor.allowCoreThreadTimeOut(true);
>         return threadPoolExecutor;
>     }
>     public void shutdown()
>     {
>         logger.debug("Initializing shutdown of Oak worker Threads");
>         try {
>             threadPoolExecutor.shutdown();
>             scheduledThreadPoolExecutor.shutdown();
>             threadPoolExecutor.awaitTermination(30, TimeUnit.SECONDS);
>             scheduledThreadPoolExecutor.awaitTermination(30,
> TimeUnit.SECONDS);
>         } catch (InterruptedException ex) {
>             logger.error("Executor shutdown error");
>             throw new RuntimeException(ex);
>         }
>         logger.debug("Finished shutdown of Oak worker Threads");
>
>     }
>
> }
> -----Ursprüngliche Nachricht-----
> Von: Clay Ferguson [mailto:wcl...@gmail.com]
> Gesendet: Mittwoch, 5. August 2015 16:37
> An: users@jackrabbit.apache.org
> Betreff: Re: Solr Configuration
>
> Leonhard,
> Check out the example FullTextSolrSearchTest.java, and in general search
> the entire codebase for "SolrIndex". I found it impossible to learn
> Jackrabbit by reading docs. The only good way is just download the entire
> source (1.2.3 being latest), and then search for test case examples to see
> how it's done. There are so many different versions of stuff documented
> online you can really only get "hints" until you go directly into the
> source.
> Best regards,
> Clay Ferguson
> ​meta64.com​
>
>
> On Wed, Aug 5, 2015 at 7:55 AM, lw <leonh...@wachutka.eu> wrote:
>
> > Hi all,
> >
> >
> >
> > I am trying to get a remote solr instance working with oak. Because of
> > lack of good documentation, I tried find out the proper configuration
> > myself, however, if I commit new nodes they are not send to the Solr
> > server for indexing. Also no queries seem to be forwarded to the Solar
> > instance. I use the attached code to initialize the repository and use
> > jackrabbit ocm to persist nodes.
> >
> > Debugging shows that SolrIndexEditorProvider gets invoced after a
> > session.save(), but it seems to look for
> > "SolrQueryIndex.TYPE.equals(type)". I don't get what this type is used
> > for and how set up it in the right way.
> >
> > For the first try I just want all properties of my node indexed by Solr.
> > Has someone additional resources, code or hints what I have to do?
> >
> > Thanks in advance for your help
> >
> >
> > Best Leonhard Wachutka
> >
> >
> >
> >
> >
> > protected Repository createRepository() throws Exception {
> >
> >         RemoteSolrServerConfiguration remoteSolrConfig = new
> > RemoteSolrServerConfiguration(null, null, 1, 1, null, "
> > http://192.168.2.250:8983/solr/oak";);
> >         SolrServerProvider solrServerProvider = new
> > RemoteSolrServerProvider(remoteSolrConfig);
> >
> >         OakSolrConfiguration oakSolrconfiguration = new
> > DefaultSolrConfiguration() {
> >             @Override
> >             public CommitPolicy getCommitPolicy() {
> >                 return CommitPolicy.HARD;
> >             }
> >             @Override
> >             public boolean useForPropertyRestrictions() {
> >                 return true;
> >             }
> >             @Override
> >             public boolean useForPrimaryTypes() {
> >                 return true;
> >             }
> >             @Override
> >             public boolean useForPathRestrictions() {
> >                 return true;
> >             }
> >         };
> >
> >         OakSolrConfigurationProvider oakSolrConfigurationProvider =
> > new DefaultSolrConfigurationProvider(oakSolrconfiguration);
> >
> >         // return JackRabbit repository.
> >         log.info("Start of Apache Jackrabbit OAK Repository.\n{host:"
> > + host +"\ndbName:"+ dbName+"}");
> >
> >         DB db = new MongoClient(host, 27017).getDB(dbName);
> >         documentNodeStore = new DocumentMK.Builder().
> >                 setMongoDB(db).getNodeStore();
> >
> >         oak = new Oak(documentNodeStore)
> >         .with(new SolrIndexInitializer(true))
> >                 .with(AggregateIndexProvider.wrap(new
> > SolrQueryIndexProvider(solrServerProvider,
> oakSolrConfigurationProvider)))
> >                 .with(new SolrIndexEditorProvider(solrServerProvider,
> > oakSolrConfigurationProvider));
> >
> >         Repository repo = new Jcr(oak).createRepository();
> >         return repo;
> >     }
> >
>

Reply via email to