SolrサーバーのIPアドレスは.NETレベルでキャッシュされています。solr.search接続文字列値が静的IPアドレスではなくドメイン名である場合、この動作により接続の問題が発生する可能性があります。ドメインのDNSマッピングが新しいIPアドレスに変更された場合、インスタンスが再起動されるまで、その変更がSitecoreインスタンスによって取得されません。
これは、SearchStaxのディザスタ リカバリを使用する場合によく発生するシナリオです。この記事では、DNSが新しいIPアドレスを指すように更新されたときに、Solrへの接続を再確立する方法を案内します。
DNSが新しいIPアドレスを指すように更新されたときに、Solrへの接続を再確立するには、次のいずれかのオプションを検討してください。
using System;
using System.Globalization;
using HttpWebAdapters;
using CommonServiceLocator;
using Microsoft.Extensions.DependencyInjection;
using Sitecore;
using Sitecore.ContentSearch.SolrProvider.Abstractions;
namespace YourNamespace
{
public class ResettableConnectionHttpWebRequestFactory : IHttpWebRequestFactory
{
private IHttpWebRequestFactory _httpWebRequestFactory;
private readonly int _connectionLeaseTimeout;
private static readonly TimeSpan DefaultConnectionLeaseTimeout = TimeSpan.FromMinutes(4);
public ResettableConnectionHttpWebRequestFactory(string connectionLeaseTimeout)
{
_connectionLeaseTimeout = (int)DateUtil.ParseTimeSpan(connectionLeaseTimeout, DefaultConnectionLeaseTimeout, CultureInfo.CurrentCulture)
.TotalMilliseconds;
}
public IHttpWebRequest Create(Uri url)
{
var request = GetHttpWebRequestFactory().Create(url);
request.ServicePoint.ConnectionLeaseTimeout = _connectionLeaseTimeout;
return request;
}
private IHttpWebRequestFactory GetHttpWebRequestFactory()
{
if (_httpWebRequestFactory != null)
return _httpWebRequestFactory;
return _httpWebRequestFactory = CreateHttpWebRequestFactory();
}
private IHttpWebRequestFactory CreateHttpWebRequestFactory()
{
IHttpWebRequestFactory resultFactory;
var solrAddress = ServiceLocator.Current.GetService<BaseSolrSpecificSettings>().SolrAddress();
if (solrAddress != null && solrAddress.UseBaseAuthentication)
{
resultFactory =
new BasicAuthHttpWebRequestFactory(solrAddress.Username, solrAddress.Password);
}
else
{
resultFactory = new HttpWebRequestFactory();
}
return resultFactory;
}
}
}
備考:Sitecoreで使用される次のアセンブリへの参照を追加します。<?xml version="1.0" encoding="utf-8"?>
<configuration xmlns:patch="http://www.sitecore.net/xmlconfig/" xmlns:role="http://www.sitecore.net/xmlconfig/role/" xmlns:search="http://www.sitecore.net/xmlconfig/search/">
<sitecore search:require="solr">
<contentSearch>
<indexConfigurations>
<solrHttpWebRequestFactory type="YourNamespace.ResettableConnectionHttpWebRequestFactory, YourDll">
<param desc="connectionLeaseTimeout">00:03:00</param>
</solrHttpWebRequestFactory>
</indexConfigurations>
</contentSearch>
</sitecore>
</configuration>