ユーザーリクエストを受信し、カーボンデータブリッジの節約を使用してCEPにイベントとして発行するAxis2サービスを実装しようとしていました(「org.wso2.carbon.databridge.agent.thrift.DataPublisher」経由)
wso2cep-3.1.0/samples/producers/activity-monitor で提供されているコード サンプルに従いました。
次のコード スニペットを参照してください
public class GatewayServiceSkeleton{
private static Logger logger = Logger.getLogger(GatewayServiceSkeleton.class);
public RequestResponse request(Request request)throws AgentException,
MalformedStreamDefinitionException,StreamDefinitionException,
DifferentStreamDefinitionAlreadyDefinedException,
MalformedURLException,AuthenticationException,DataBridgeException,
NoStreamDefinitionExistException,TransportException, SocketException,
org.wso2.carbon.databridge.commons.exception.AuthenticationException
{
final String GATEWAY_SERVICE_STREAM = "gateway.cep";
final String VERSION = "1.0.0";
final String PROTOCOL = "tcp://";
final String CEPHOST = "cep.gubnoi.com";
final String CEPPORT = "7611";
final String CEPUSERNAME = "admin";
final String CEPPASSWORD = "admin";
Object[] metadata = { request.getDeviceID(), request.getViewID()};
Object[] correlationdata = { request.getSessionID()};
Object[] payloaddata = {request.getBucket()};
KeyStoreUtil.setTrustStoreParams();
KeyStoreUtil.setKeyStoreParams();
DataPublisher dataPublisher = new DataPublisher(PROTOCOL + CEPHOST + ":" + CEPPORT, CEPUSERNAME, CEPPASSWORD);
//create event
Event event = new Event (GATEWAY_SERVICE_STREAM + ":" + VERSION, System.currentTimeMillis(), metadata, correlationdata, payloaddata);
//Publish event for a valid stream
dataPublisher.publish(event);
//stop
dataPublisher.stop();
RequestResponse response = new RequestResponse();
response.setSessionID(request.getSessionID());
response.setDeviceID(request.getDeviceID());
response.setViewID(request.getViewID());
response.setBucket(request.getBucket());
return response;
}
次のようにキーストアパラメーターを設定するユーティリティクラスもあります
public class KeyStoreUtil {
static File filePath = new File("../../../repository/resources/security");
public static void setTrustStoreParams() {
String trustStore = filePath.getAbsolutePath();
System.setProperty("javax.net.ssl.trustStore", trustStore + "/client-truststore.jks");
System.setProperty("javax.net.ssl.trustStorePassword", "wso2carbon");
}
public static void setKeyStoreParams() {
String keyStore = filePath.getAbsolutePath();
System.setProperty("Security.KeyStore.Location", keyStore + "/wso2carbon.jks");
System.setProperty("Security.KeyStore.Password", "wso2carbon");
}
}
サービスを wso2as-5.2.1 にアップロードし、SOAPUI を使用してサービスを呼び出しました
リクエストが「TCP のクライアントを借りることができません」というエラー メッセージを返しました。
デバッグしたところ、問題はクラス「KeyStoreUtil」にある可能性があることがわかりました。
「filePath」がどういうわけか「null」を返したところ、
static File filePath = new File("../../../repository/resources/security");
この行で障害が発生しました
DataPublisher dataPublisher = new DataPublisher(PROTOCOL + CEPHOST + ":" + CEPPORT, CEPUSERNAME, CEPPASSWORD);
「CARBON_HOME」の値を使用してキーストアの場所を特定すると、より良いアイデアになると思います
だから私の質問は:
Java コードで「CARBON_HOME」の値を取得するにはどうすればよいですか?
と言った。もう少し考えてみると、サービスは何度も呼び出されます。一方、「setTrustStoreParams」と「setKeyStoreParams」は、サーバー/サービスの開始時に一度だけ実行する必要があります。
では、サービス コードから「setTrustStoreParams」と「setKeyStoreParams」を削除する、または構成可能な項目として実装するさらに良い方法はありますか?
お知らせ下さい
ありがとう