-
Notifications
You must be signed in to change notification settings - Fork 56
Per-client CXF bus & shut down on disconnect #43
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Merged
Changes from all commits
Commits
File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
56 changes: 56 additions & 0 deletions
56
client/src/main/java/io/cloudsoft/winrm4j/client/WinRmClientContext.java
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,56 @@ | ||
| /* | ||
| * 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. | ||
| */ | ||
| package io.cloudsoft.winrm4j.client; | ||
|
|
||
| import org.apache.cxf.Bus; | ||
| import org.apache.cxf.BusFactory; | ||
| import org.apache.cxf.transport.http.asyncclient.AsyncHTTPConduit; | ||
| import org.apache.cxf.transport.http.asyncclient.AsyncHTTPConduitFactory; | ||
| import org.apache.cxf.transport.http.asyncclient.AsyncHTTPConduitFactory.UseAsyncPolicy; | ||
|
|
||
| public class WinRmClientContext { | ||
| public static WinRmClientContext newInstance() { | ||
| Bus bus = configureBus(BusFactory.newInstance().createBus()); | ||
| return new WinRmClientContext(bus); | ||
| } | ||
|
|
||
| static Bus configureBus(Bus bus) { | ||
| // Needed to be async to force the use of Apache HTTP Components client. | ||
| // Details at http://cxf.apache.org/docs/asynchronous-client-http-transport.html. | ||
| // Apache HTTP Components needed to support NTLM authentication. | ||
| bus.getProperties().put(AsyncHTTPConduit.USE_ASYNC, Boolean.TRUE); | ||
| bus.getProperties().put(AsyncHTTPConduitFactory.USE_POLICY, UseAsyncPolicy.ALWAYS); | ||
| return bus; | ||
| } | ||
|
|
||
| private final Bus bus; | ||
|
|
||
| private WinRmClientContext(Bus bus) { | ||
| this.bus = bus; | ||
| } | ||
|
|
||
| public void shutdown() { | ||
| bus.shutdown(true); | ||
| } | ||
|
|
||
| Bus getBus() { | ||
| return bus; | ||
| } | ||
|
|
||
| } |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -398,6 +398,13 @@ public void testToolReuse() throws Exception { | |
|
|
||
| @Test(groups="Live") | ||
| public void testToolConcurrentReuse() throws Exception { | ||
| // There are built-in retries at two levels in the code: | ||
| // * executePs will retry 10 times | ||
| // * each low-level WinRm command will retry 16 times | ||
| // * WinRm.delete is called in a finally, again retrying for 16 times | ||
| // As a result each executePs call could retry requests for a total of | ||
| // 10 x (16 + 16) = 320 times PER ITERATION | ||
| // That would result in 3200 failing requests for the tasks below! | ||
|
Contributor
Author
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I totally agree. I think I have some changes which reduce it. |
||
| final int NUM_RUNS = 10; | ||
| final int TIMEOUT_MINS = 30; | ||
| final AtomicInteger counter = new AtomicInteger(); | ||
|
|
||
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The synchronization here is a little scary looking - for example if there are several concurrent calls to
command(...)on its first use, then we'll do multiple calls toWinRmClientContext.newInstance(). However,createServiceis synchronized so we'll only create oneWinRm winrmobject.However, your changes LGTM. We can think about and perhaps improve the synchronization in a separate PR at some point.
p.s. I hate people incorrectly using double-checked locking in Java (which is what the code was doing before, and is still doing for initialising the
winrmfield)!There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Agree, adding
syncrhonizedongetService.