Я написал конвейер для извлечения журналов активности комплекта G, сославшись на java-quickstart комплекта , где код читает файл client_secret.json, как показано ниже,
InputStream in = new FileInputStream("D://mypath/client_secret.json");
GoogleClientSecrets clientSecrets = GoogleClientSecrets.load(JSON_FACTORY, new InputStreamReader(in));
Конвейер работает должным образом в локальном режиме (runner = DirectRunner), но тот же код завершается ошибкой с исключением из java.io.FileNotFoundException при выполнении в облаке (runner = DataflowRunner)
Я понимаю, что локальный путь недействителен при выполнении в облаке. Любое предложение здесь?
Изменено:
Я изменил код, как показано ниже, и могу прочитать файл client_secrets.json
InputStream in =
Activities.class.getResourceAsStream("client_secret.json");
Актуальная проблема заключается в создании объекта учетных данных
private static java.io.File DATA_STORE_DIR = new java.io.File(System.getProperty("user.home"),
".credentials/admin-reports_v1-java-quickstart");
private static final List<String> SCOPES = Arrays.asList(ReportsScopes.ADMIN_REPORTS_AUDIT_READONLY);
static {
try {
HTTP_TRANSPORT = GoogleNetHttpTransport.newTrustedTransport();
DATA_STORE_FACTORY = new FileDataStoreFactory(DATA_STORE_DIR);
} catch (Throwable t) {
t.printStackTrace();
System.exit(1);
}
}
public static Credential authorize() throws IOException {
// Load client secrets.
InputStream in =
Activities.class.getResourceAsStream("client_secret.json");
GoogleClientSecrets clientSecrets = GoogleClientSecrets.load(JSON_FACTORY, new InputStreamReader(in));
// Build flow and trigger user authorization request.
GoogleAuthorizationCodeFlow flow = new GoogleAuthorizationCodeFlow.Builder(HTTP_TRANSPORT, JSON_FACTORY,
clientSecrets, SCOPES).setDataStoreFactory(DATA_STORE_FACTORY).setAccessType("offline").build();
Credential credential = new AuthorizationCodeInstalledApp(flow, new LocalServerReceiver()).authorize("user");
System.out.println("Credentials saved to " + DATA_STORE_DIR.getAbsolutePath());
return credential;
}
Замечания:
Локальное исполнение:
- При первоначальном выполнении программа пытается открыть браузер для авторизации запроса и сохраняет аутентифицированный объект в файле - «StoredCredential».
- При последующих выполнениях сохраненный файл используется для выполнения вызовов API.
Запуск в облаке (DataFlowRunner):
- Когда я проверяю логи, поток данных пытается открыть браузер для аутентификации запроса и останавливается там.
Что мне нужно?
Как изменить GoogleAuthorizationCodeFlow.Builder
так, чтобы объект учетных данных мог быть создан при работе в качестве конвейера потока данных?