精华内容
下载资源
问答
  • was 更新应用程序Welcome to this tutorial for adding update app to your flutter application 欢迎使用本教程,向您的flutter应用程序添加更新应用程序 You can connect with me on Instagram: 您可以在...

    was 更新应用程序

    Welcome to this tutorial for adding update app to your flutter application

    欢迎使用本教程,向您的flutter应用程序添加更新应用程序

    You can connect with me on Instagram:

    您可以在Instagram上与我联系:

    Enough! Lets start with it.

    足够! 让我们开始吧。

    让我们从看到最终目标开始- (Let’s start by seeing our end goal-)

    For IOS-

    对于IOS-

    Image for post
    Image for post

    For Android-

    对于Android-

    Image for post
    Image for post
    Image for post

    Similar for IOS.

    与IOS类似。

    分解 (Breaking down)

    • We have two types of update dialogs: Optional update and Required update. Based on your preference you can keep one or both of them.

      我们有两种类型的更新对话框: 可选 更新必需 更新 。 您可以根据自己的喜好保留其中一个或两个。

    For both Optional and Required update dialog:

    对于“ 可选”和“必需”更新对话框:

    • If user clicks on Update now, we will redirect the user to the PlayStore or AppStore page of our app.

      如果用户点击 更新,现在 ,我们将用户重定向到我们的应用程序的Play商店中或AppStore的页面。

    For Optional update dialog:

    对于“ 可选更新”对话框:

    • If user clicks on Later, close the dialog and show it next time user opens the app. (Again, you can change it based on preference, maybe change the option to remind me tomorrow)

      如果用户单击“稍后” ,请关闭对话框,并在下次用户打开应用程序时显示该对话框。 (同样,您可以根据喜好进行更改,也可以更改选项以提醒我明天)

    • For Android, If user selects Never ask again then disable Update now. Then if user clicks on Later, do not show the update dialog next time user opens app.

      对于Android,如果用户选择“ 不再询问”, 禁用立即更新 。 然后,如果用户单击“稍后” ,则下次用户打开应用程序时不显示更新对话框。

    • For IOS, If user clicks on Don’t ask me again then close the dialog and do not show the update dialog next time user opens app.

      对于IOS,如果用户单击“ 不要再问我”, 关闭对话框, 下次用户打开应用程序时不显示更新对话框

    Key points:

    关键点:

    • User can dismiss the optional update dialog by clicking outside the dialog box. In this case do not show again state will not be stored locally.

      用户可以 通过在对话框外部单击 来关闭可选的更新对话框。 在这种情况下,不再显示状态将不会存储在本地。

    • User cannot dismiss the required update dialog by clicking outside the clicking outside the dialog box.

      用户无法通过单击对话框外部的单击来关闭所需的更新对话框。

    Let me show you something and you guess the difference.

    让我给你看一些东西, 你会猜出区别

    Image for post

    所以这里- (So here is it-)

    • In the first one, we were logged in successfully and navigated to the main screen. In the second one, we were not logged in and stayed at the login screen.

      在第一个中,我们已成功登录并导航到主屏幕。 在第二个中 我们尚未登录,而是停留在登录屏幕上。

    • What’s interesting in this is that we were able to see the same dialog on both screens. This is not as easy it sounds like and it was a nightmare to get this done.

      有趣的是,我们能够在两个屏幕上看到相同的对话框。 这听起来不那么容易,完成这项工作真是一场噩梦。

    But what I wanted exactly?

    但是我到底想要什么?

    When user opens the app, we check-

    当用户打开应用程序时,我们会检查-

    1. Latest app version- retrieved from the server

      最新的应用程序版本-从服务器检索

    2. Current app version

      当前应用版本

    3. Minimum app version- retrieved from the server

      最低应用版本-从服务器检索

    If the current app version is less than minimum app version-

    如果当前应用版本低于最低应用版本,

    We show the required update dialog and force the user to update. Users who have disabled to see update will still see it.

    我们显示所需的更新对话框,并强制用户进行更新。 禁用查看更新的用户仍会看到它。

    In case the minimum app version is satisfied, but the current version is less than latest app version.

    如果满足最低应用程序版本,但当前版本小于最新应用程序版本。

    If dialog not disabled, we show the optional update dialog and do not force the user to update. We also give user the option to not see the dialog again.

    如果未禁用对话框,我们将显示可选的更新对话框,并且不强制用户进行更新。 我们还为用户提供了一个选项,使其不再显示该对话框。

    这是最重要的部分,也是我决定撰写此博客的原因- (Here is the most important part and the reason I decided to write this blog-)

    The app version checking and showing the dialog should be done at a single place. We should be able to show the user the update dialog, no matter which screen the user is on.

    检查并显示对话框的应用程序版本应在一个地方完成。 无论用户在哪个屏幕上,我们都应该能够向用户显示更新对话框。

    In simple words, here is why it is difficult-

    简单来说,这就是为什么很难-

    1. To show a dialog, we need the context of the active screen.

      要显示对话框,我们需要活动屏幕的上下文。
    2. As we navigate the current active context keeps on changing.

      在导航时,当前活动上下文不断变化。
    3. Therefore we will need to add it at many places and increase complexity.

      因此,我们将需要在许多地方添加它并增加复杂性。

    But we need to keep it simple.

    但是我们需要保持简单。

    让我们解决这个问题 (Lets solve this)

    I have made it simple for you so you just have to copy and paste most of the code.

    我为您简化了操作,因此您只需复制并粘贴大部分代码。

    import 'dart:io';
    
    
    import 'package:flutter/cupertino.dart';
    import 'package:flutter/material.dart';
    import 'package:package_info/package_info.dart';
    import 'package:parse_server_sdk/parse_server_sdk.dart';
    import 'package:pub_semver/pub_semver.dart';
    import 'package:shared_preferences/shared_preferences.dart';
    import 'package:talkfootball/constants.dart';
    import 'package:talkfootball/dialogs/do_not_ask_again_dialog.dart';
    import 'package:talkfootball/models/app_version.dart';
    
    
    class UpdateApp extends StatefulWidget {
      final Widget child;
    
    
      UpdateApp({this.child});
    
    
      @override
      _UpdateAppState createState() => _UpdateAppState();
    }
    
    
    class _UpdateAppState extends State<UpdateApp> {
      @override
      void initState() {
        super.initState();
    
    
        checkLatestVersion(context);
      }
    
    
      checkLatestVersion(context) async {
        await Future.delayed(Duration(seconds: 5));
        
        //Add query here to get the minimum and latest app version
        
        //Change
        //Here is a sample query to ParseServer(open-source NodeJs server with MongoDB database)
        var queryBuilder = QueryBuilder<AppVersion>(AppVersion())
          ..orderByDescending("publishDate")
          ..setLimit(1);
    
    
        var response = await queryBuilder.query();
    
    
        if (response.success) {
          //Change
          //Parse the result here to get the info
          AppVersion appVersion = response.results[0] as AppVersion;
          Version minAppVersion = Version.parse(appVersion.minAppVersion);
          Version latestAppVersion = Version.parse(appVersion.version);
          
          PackageInfo packageInfo = await PackageInfo.fromPlatform();
          Version currentVersion = Version.parse(packageInfo.version);
    
    
          if (minAppVersion > currentVersion) {
            _showCompulsoryUpdateDialog(
              context,
              "Please update the app to continue\n${appVersion.about ?? ""}",
            );
          } else if (latestAppVersion > currentVersion) {
            SharedPreferences sharedPreferences =
                await SharedPreferences.getInstance();
    
    
            bool showUpdates = false;
            showUpdates = sharedPreferences.getBool(kUpdateDialogKeyName);
            if (showUpdates != null && showUpdates == false) {
              return;
            }
    
    
            _showOptionalUpdateDialog(
              context,
              "A newer version of the app is available\n${appVersion.about ?? ""}",
            );
            print('Update available');
          } else {
            print('App is up to date');
          }
        }
      }
    
    
      _showOptionalUpdateDialog(context, String message) async {
        await showDialog<String>(
          context: context,
          barrierDismissible: true,
          builder: (BuildContext context) {
            String title = "App Update Available";
            String btnLabel = "Update Now";
            String btnLabelCancel = "Later";
            String btnLabelDontAskAgain = "Don't ask me again";
            return DoNotAskAgainDialog(
              kUpdateDialogKeyName,
              title,
              message,
              btnLabel,
              btnLabelCancel,
              _onUpdateNowClicked,
              doNotAskAgainText:
                  Platform.isIOS ? btnLabelDontAskAgain : 'Never ask again',
            );
          },
        );
      }
    
    
      _onUpdateNowClicked() {
        print('On update app clicked');
      }
    
    
      _showCompulsoryUpdateDialog(context, String message) async {
        await showDialog<String>(
          context: context,
          barrierDismissible: false,
          builder: (BuildContext context) {
            String title = "App Update Available";
            String btnLabel = "Update Now";
            return Platform.isIOS
                ? new CupertinoAlertDialog(
                    title: Text(title),
                    content: Text(message),
                    actions: <Widget>[
                      CupertinoDialogAction(
                        child: Text(
                          btnLabel,
                        ),
                        isDefaultAction: true,
                        onPressed: _onUpdateNowClicked,
                      ),
                    ],
                  )
                : new AlertDialog(
                    title: Text(
                      title,
                      style: TextStyle(fontSize: 22),
                    ),
                    content: Text(message),
                    actions: <Widget>[
                      FlatButton(
                        child: Text(btnLabel),
                        onPressed: _onUpdateNowClicked,
                      ),
                    ],
                  );
          },
        );
      }
    
    
      @override
      Widget build(BuildContext context) {
        return widget.child;
      }
    }
    import 'dart:io';
    
    
    import 'package:flutter/cupertino.dart';
    import 'package:flutter/material.dart';
    import 'package:shared_preferences/shared_preferences.dart';
    import 'package:talkfootball/constants.dart';
    
    
    class DoNotAskAgainDialog extends StatefulWidget {
      final String title, subTitle, positiveButtonText, negativeButtonText;
      final Function onPositiveButtonClicked;
      final String doNotAskAgainText;
      final String dialogKeyName;
    
    
      DoNotAskAgainDialog(
        this.dialogKeyName,
        this.title,
        this.subTitle,
        this.positiveButtonText,
        this.negativeButtonText,
        this.onPositiveButtonClicked, {
        this.doNotAskAgainText = 'Never ask again',
      });
    
    
      @override
      _DoNotAskAgainDialogState createState() => _DoNotAskAgainDialogState();
    }
    
    
    class _DoNotAskAgainDialogState extends State<DoNotAskAgainDialog> {
      bool doNotAskAgain = false;
    
    
      _updateDoNotShowAgain() async {
        SharedPreferences sharedPreferences = await SharedPreferences.getInstance();
        await sharedPreferences.setBool(kUpdateDialogKeyName, false);
      }
    
    
      @override
      Widget build(BuildContext context) {
        if (Platform.isIOS) {
          return CupertinoAlertDialog(
            title: Text(widget.title),
            content: Text(widget.subTitle),
            actions: <Widget>[
              CupertinoDialogAction(
                child: Text(
                  widget.positiveButtonText,
                ),
                onPressed: widget.onPositiveButtonClicked,
              ),
              CupertinoDialogAction(
                child: Text(
                  widget.doNotAskAgainText,
                ),
                onPressed: () {
                  Navigator.pop(context);
                  _updateDoNotShowAgain();
                },
              ),
              CupertinoDialogAction(
                child: Text(
                  widget.negativeButtonText,
                ),
                onPressed: () => Navigator.pop(context),
              ),
            ],
          );
        }
        return AlertDialog(
          title: Text(
            widget.title,
            style: TextStyle(fontSize: 24),
          ),
          content: FittedBox(
            child: Column(
              crossAxisAlignment: CrossAxisAlignment.start,
              children: <Widget>[
                Text(widget.subTitle),
                Row(
                  mainAxisAlignment: MainAxisAlignment.start,
                  children: <Widget>[
                    SizedBox(
                      width: 24,
                      height: 24,
                      child: Checkbox(
                        value: doNotAskAgain,
                        onChanged: (val) {
                          setState(() {
                            doNotAskAgain = val;
                          });
                        },
                      ),
                    ),
                    SizedBox(width: 8),
                    GestureDetector(
                      onTap: () {
                        setState(() {
                          doNotAskAgain = doNotAskAgain == false;
                        });
                      },
                      child: Text(
                        widget.doNotAskAgainText,
                        style: TextStyle(color: kDarkGray),
                      ),
                    ),
                  ],
                )
              ],
            ),
          ),
          actions: <Widget>[
            FlatButton(
              child: Text(widget.positiveButtonText),
              onPressed: doNotAskAgain ? null : widget.onPositiveButtonClicked,
            ),
            FlatButton(
              child: Text(
                widget.negativeButtonText,
                style: TextStyle(color: Colors.red),
              ),
              onPressed: () async {
                Navigator.pop(context);
                if (doNotAskAgain) {
                  _updateDoNotShowAgain();
                }
              },
            ),
          ],
        );
      }
    }

    Here is how the data is structured-

    数据的结构如下-

    Image for post

    What you have to do?

    你要做什么

    1. Add some libraries to pubspec.yaml

      将一些库添加到pubspec.yaml

    Use: Locally store do not show info.

    使用:在本地存储不显示信息。

    Use: To parse version string from server and compare them easily.

    使用:从服务器解析版本字符串并轻松比较它们。

    Use: To get current app version

    用途:获取当前应用程序版本

    UPDATE: Use can also use another package for in-app upgrade in Android.

    更新:使用还可以使用另一个软件包在Android中进行应用内升级。

    2. Copy and paste both the above code files to your project.

    2.将以上两个代码文件复制并粘贴到您的项目中。

    3. Make changes to the first code file

    3.更改第一个代码文件

    You need to make two changes, based the server you are using.

    您需要根据所使用的服务器进行两项更改。

    1. Change the query to get the latest and minimum app version.

      更改查询以获取最新和最低应用程序版本。
    2. Get the response and parse it to Version type for easy comparison.

      获取响应并将其解析为“ 版本”类型以便于比较。

    After making the above changes, add this to MaterialApp.

    完成上述更改后,将其添加到MaterialApp。

    child: MaterialApp(
    builder: (context, widget) => Navigator(
    onGenerateRoute: (settings) => MaterialPageRoute(
    builder: (context) => UpdateApp(
    child: widget,
    ),
    ),
    ),

    Read more about the builder property here-

    在这里阅读更多有关builder属性的信息-

    让我们现在检查输出- (Let’s check the output now-)

    Image for post

    让我们更改最低应用版本 (Lets change the minimum app version)

    Image for post

    现在的输出- (The output now-)

    Image for post

    As you can see, now the user is forced to update the app and can no use the app.

    如您所见,现在用户被迫更新应用程序,并且无法使用该应用程序。

    To open Play store or App store page on update click. Use url_launcher.

    要在更新时打开Play商店或App商店页面,请单击。 使用url_launcher。

    Its done :)

    完成 :)

    Thank you for staying

    谢谢你留下来

    更多颤振微博 (More flutter spinner blogs)

    I will be posting more about flutter, so stay tuned :)

    我将发布更多有关颤振的信息,敬请期待:)

    翻译自: https://medium.com/swlh/update-app-flutter-402c528235e4

    was 更新应用程序

    展开全文
  • 》》》推荐阅读《《《1、性能测试学习笔记-场景设计2、性能测试的重要意义3、性能分析流程及方法4、应用系统性能调优之性能分析WAS服务器四种应用更新模式最近有客户在咨询WAS服务器上应用程序的升级有哪些方式,...

    3a514f0d13ea96e93ef75f8843676075.png

    》》》推荐阅读《《《

    1、性能测试学习笔记-场景设计

    2、性能测试的重要意义

    3、性能分析流程及方法

    4、应用系统性能调优之性能分析

    WAS服务器四种应用更新模式 

    最近有客户在咨询WAS服务器上应用程序的升级有哪些方式,怎么操作能无中断更新,因此专门对这方面的东西进行了总结和梳理,也分享给大家。

    WAS服务器上的应用可以支持细粒度的应用更新,所以你可以对应用的一部分,或者某一个模块进行更新和升级,和重新启动相应的业务模块,而且实现了业务无中断更新。

    分类说明如下:

    • 整个ear文件的更新

    • 应用包中一个模块(.jar,ejb.jar,.rar)替换、增加,或者去掉

    • 应用包中一个单独文件替换、增加或者去掉

    • 多个应用程序文件或者模块的的更新

    下面分享一下具体的操作方式。

    整个ear文件的更新

    1. 点击 Applications Application Types  WebSphere enterprise applications.

    选择英语程序更新,然后点击 Update.

    2.  Preparing for theapplication update 页面(Figure 24-1), 选择 Replace the

    entire application option (这是默认选项).

    b1bb2ff8b8492f201f551280d0215c4b.png

    3. 选择 Local file system 或者 Remotefile system option. 然后点击 Browse 选择要更新应用代码目录ear文件,然后选择Next

    4. 然后部署的过程中根据需求进行修改一些东西,最后到Summary 页面点击 Finish.

    5. 重新确认更新的内容:

    d512ca0806965405266d689912bd1717.png

    然后点击save来保存设置。

    6. 如果是集群分布式环境,则还需要进行全局同步配置。

    7.部署需要几秒的时间,需要等待,同时可以看system.out日志来确定部署是否报错。

    应用包中一个模块(.jar,ejb.jar,.rar)替换、增加,或者去掉

    1. 点击 Applications Application Types  WebSphere enterprise applications.

    选择英语程序更新,然后点击 Update.

    2.  Preparing for theapplication update 页面(Figure 24-1), 选择Replace or add a single module .

    f1499c7d0ab5e1587b12bc24dca4b590.png

    3.指定这个模块包文件的路径,比如ejb.jar,这个包不在ear包里,保存一个路径下。这个文件将会增加到应用里面。

    4. 选择 Local file system 或者 Remotefile system option. 然后点击 Browse 选择要更新应用代码目录ear文件,然后选择Next

    5. 然后部署的过程中根据需求进行修改一些东西,最后到Summary 页面点击Finish.

    6. 更新配置到主配置,然后点击save

    7. 如果是集群分布式环境,则还需要进行全局同步配置。

     应用包中一个单独文件替换、增加或者去掉

    替换或增加一个文件,比如一个class,一个Jsp,gifproperties

    1. 点击 Applications Application Types  WebSphere enterprise applications.

    选择英语程序更新,然后点击 Update.

    2.  Preparing for theapplication update 页面(Figure 24-1), 选择Replace or add a single file .

    3b998a258fed77825c421c1a2dffeb91.png

    3.指定这个模块包文件的路径,比如logo.gif,这个文件不在ear包里,保存一个路径下。

    4. 选择 Local file system 或者 Remote filesystem option. 然后点击 Browse 选择要更新应用代码目录ear文件,然后选择Next

    5. 然后部署的过程中根据需求进行修改一些东西,最后到Summary 页面点击 OK.

    6. 更新配置到主配置,然后点击save

    7. 如果是集群分布式环境,则还需要进行全局同步配置。

    多个应用程序或者模块的更新

    多个文件的更新可以将要更新的文件压缩成一个zip或者gzip包。更加压缩包的文件,它会更新文件或者是增加文件,和删除文件。压缩文件必须是一个。

    • 要更新一个文件,压缩包中的文件必须要和原来部署的包的路径结构相同。

    • 如果是要增加一个文件的,这个文件在压缩包中的路径必须和原来的是不同的路径结构。

    • 如果是要删除原来已经安装的包里面的文件,必须要在META-INF / ibm-partialapp-delete.props文件中指定文件名。这个文件必须是ASCII格式,一行一行的指定文件名。要删除的文件不是相对路径。

    比如要删除原来的docs/readme.txt文件,那么就要在ibm-partialapp-delete.propsibm-partialapp-delete.props

    再比如要删除某一个hello.war包下的images/logo.jpg文件,则要在HelloWeb.war/META-INF/ibm-partialapp-delete.props 中增加一行images/logo.jpg

    另外也可以用通配符,比如*.jsp就删除所有的Jsp.

    • ibm-partialapp-delete.props这个文件可以写多行

    • 举例:

    下面是一个要更新的zip包。

    4ffcbe57d69537daa9d6698ab42f0a45.png

    ibm-partialapp-delete.props文件的内容如下:

    docs/readme.txt

    images/logo.gif

    使用第4中选项(Replace, add, or delete multiple files)来更新,就如果产生如下结果:

    1. 增加log4j.jarear的根目录

    2. 更新替换HelloEJB.jar

    3. EAR文件删除文件/ readme.txt文件(如果存在的话),而不是从任何模块。

    4. 增加images/newlogo.jpg文件到HelloWeb.war

    5. 更新HelloServlet.class

    6. 删除images/logo.gif

    执行步骤:

    1. 点击 Applications Application Types  WebSphere enterprise applications.

    选择英语程序更新,然后点击 Update.

    2.  Preparing for theapplication update 页面选择Replace, add, or delete multiple files选项.

    3.指定这个模块包文件的路径,比如logo.gif,这个文件不在ear包里,保存一个路径下。

    4. 选择 Local file system 或者 Remotefile system option. 然后点击 Browse 选择要更新应用代码目录ear文件,然后选择Next

    5. 然后部署的过程中根据需求进行修改一些东西,最后到Summary 页面点击 OK.

    6. 更新配置到主配置,然后点击save

    7. 如果是集群分布式环境,则还需要进行全局同步配置,点击Synchronize changes with Nodes,再点击Save

    总结

    以上是分类说明WAS应用更新的四种模式,如果你的情况是选择最后一种,压缩包更新的,如果是没有ibm-partialapp-delete.props文件的话,应该是不会删除文件的,那么如果更新失败,很有可能是在解压缩的和分析的过程中,临时停止进程导致的。

    》》》推荐阅读《《《

    1、性能测试学习笔记-场景设计

    2、Web站点性能调优完全攻略

    3、应用系统性能调优之性能分析

    4、Windows监控——性能指标详解

    6、性能测试的重要意义

    7、软件性能测试的本质_致命版

    8、性能分析流程及方法

    9、性能测试流程

    10、性能测试从需求分析开始

    11、性能测试指标

    12、双活数据中心揭秘之—DB2 PureScale

    13、循序渐进学习oracle

    14、软件项目管理中的十个误区

    15、功能测试方法总结及常见面试问题

    16、MQ来账通道及队列配置

    17、Linux命令大全整理

    18、JMeter工具简单介绍

    19、性能瓶颈分析方法

    20、性能测试-LoadRunner操作流程之一

    22、性能测试-LoadRunner操作流程之二

    23、性能测试-LoadRunner操作流程之三

    24、性能测试-脚本编写之一

    25、性能测试-脚本编写之二

    26、性能测试-脚本编写之三

    27、性能测试-性能调优之一

    28、性能测试-性能调优之二

    2ea93190c692ea61eeedbdae4e1af8ea.png

    展开全文
  • was部分更新

    2016-07-20 17:00:00
    故当配置文件(例web.xml)发生改变时,只更新应用程序资源文件/installedApps目录下的web.xml文件是不启作用的 web.xml文件的修改 必须到 /IBM/WebSphere/AppServer/profiles/AppSrv01/con...
    在WAS中,应用的配置是从config/cells....目录下读取;而资源从/installedApps目录下读取
    
    故当配置文件(例web.xml)发生改变时,只更新应用程序资源文件/installedApps目录下的web.xml文件是不启作用的
    
    web.xml文件的修改 必须到
    
    /IBM/WebSphere/AppServer/profiles/AppSrv01/config/cells/localhostCell01/applications/下面修改相应web.xml文件才能生效
    
    或者直接重新部署应用

     

    转载于:https://www.cnblogs.com/gavenQin/p/5689012.html

    展开全文
  • AIX系统下运行ant发布更新WPS,WAS应用,以及Cluster的情况下 如需转载,请标明出处,尊重作者权利,http://www.chinacsharp.net http://blog.csdn.net/keyboardsun author:keyboardsun@163.com 现在我们的应用系统...
    AIX系统下运行ant发布更新WPS,WAS应用,以及Cluster的情况下
     
    如需转载,请标明出处,尊重作者权利,http://www.chinacsharp.net  http://blog.csdn.net/keyboardsun author:keyboardsun@163.com
     
    现在我们的应用系统在修改代码过后用ant打包,打包完了要求自动更新到服务器,一个是普通的单个服务器,另外一个是集群。情景模式如下。
     
    一台IBM P550 IP:10.9.132.250 host:P550_250 节点是NODE1 server为server1
    一个集群:IP:10.9.132.248 host:P550_248 Cluster:WPSCluster 包括两个节点QB125Node01,QB126Node01,两个节点各有两个server,分别为WPS001,WPS002
     
    下面我们来设计:
    首先我们得在ant的xml里面写上调用ksh脚本的代码吧。
    然后在.sh脚本代码里面运行wsadmin,然后调用jacl文件完成发布。
     
    好的,现在我们来设计xml,设计之前我来告诉大家几个秘密:
     
    第一:对于cluster,安装的时候有参数的,可以安装发布到cluster,但是停止的时候得每个server一个一个的停,启动的时候也是,但是呢,在卸载的时候,只需卸载一个server的就可以了,不用每个server都卸载
    第二:安装cluster的应用的时候,安装完成直接启动会报错,因为应用其实还没有完全发布到每个server,这里需要等待一段时间过后再启动。
     
     
    这里我们的文件如下
    Build.xml  , 用于调用deploy.xml代码
    deploy.xml, 用于执行deploy.sh代码
    deploy.sh用于执行jacl代码
    uwfe248.jacl  用于安装更新P550_248机器应用
    uwfe250.jacl   用于安装更新P550_250机器应用
    uwfe_startapp.jacl  用于在cluster安装完成以后启动应用
    startApp248.jacl用于启动cluster发布的应用
     
    下面我们来设计xml。
     
    我们build.xml的吧
    <?xml version="1.0" encoding="UTF-8"?>
    <project name="UWFE4_WPS_ALL" default="all"  basedir=".">
      <target name="all" >
       ……..这里省略编译java,打包ear的代码…..
          <ant antfile="${HOME}/antbuild/deploy.xml" inheritAll="false"  target="deploy"/>
      </target>
    </project>
     
    这里的deploy.xml就是调用sh脚本的啦。
    这里脚本在后面有sleep 60秒,然后再启动应用的
    <?xml version="1.0" encoding="UTF-8"?>
    <project name="UWFE4_WPS_ALL" default="deploy" basedir="."> 
           <target name="startApp" >
        <exec executable="/bin/ksh">
        <arg line="deployapp.sh"/>
      </exec>
      </target> 
          <target name="deploy"  depends="startApp">
            <echo message="begin"/>
                 <sleep seconds="60"/>
                 <echo message="end"/>
               <exec executable="/bin/ksh">
                             <arg line="deploy_startapp.sh"/>
                      </exec>
      </target>
    </project>
     
    Deploy.sh的代码为
     
    /usr/IBM/WebSphere/ProcServer/bin/wsadmin.sh -conntype SOAP -host QB_WMS_P550_125 -port 8879 -f UWFE248.jacl
    /usr/IBM/WebSphere/ProcServer/bin/wsadmin.sh -conntype SOAP -host QB_WMS_P550_127 -port 8880 -f UWFE250.jacl
     
    uwfe248.jacl代码为
    puts "-------------------------------------------------------------------"
    puts "—开始执行jacl代码啦 --"
    puts "-------------------------------------------------------------------"
     
    #这是我们要发布的应用的存放路径
    set EARDIR /home/uwfe/UWFE_SOURCE/antbuild/target/ear/UWFE.ear
    #这是我们要发布的应用的名称
    set APPNAME UWFE
    #这是我们要发布的应用的cluster名称
    set CLUSTERNAME WPSCluster 
    set NODE [$AdminControl getNode]
    #简单的理解,取得当前的上下文
    puts "-----------------------------------------------------------------"
    puts "--                      stoping App                            --"
    puts "-----------------------------------------------------------------"
    set APPMANAGER [$AdminControl queryNames type=ApplicationManager,node=QB125Node01,process=WPS001,*]
    $AdminControl invoke $APPMANAGER stopApplication UWFE
    set APPMANAGER [$AdminControl queryNames type=ApplicationManager,node=QB125Node01,process=WPS002,*]
    $AdminControl invoke $APPMANAGER stopApplication UWFE
    set APPMANAGER [$AdminControl queryNames type=ApplicationManager,node=QB126Node01,process=WPS001,*]
    $AdminControl invoke $APPMANAGER stopApplication UWFE
    set APPMANAGER [$AdminControl queryNames type=ApplicationManager,node=QB126Node01,process=WPS002,*]
    $AdminControl invoke $APPMANAGER stopApplication UWFE
    puts "-----------------------------------------------------------------"
    puts "--                      stoped  App                            --"
    puts "-----------------------------------------------------------------"
     
    puts "-----------------------------------------------------------------"
    puts "--                      uninstalling  App                      --"
    puts "-----------------------------------------------------------------"
     
    set APPMANAGER [$AdminControl queryNames type=ApplicationManager,node=QB125Node01,process=WPS001,*]
    $AdminApp uninstall UWFE
     
    puts "-----------------------------------------------------------------"
    puts "--                      uninstalled  App                       --"
    puts "-----------------------------------------------------------------"
     
     
    puts "-----------------------------------------------------------------"
    puts "--                      saveing config                         --"
    puts "-----------------------------------------------------------------"
    $AdminConfig save
     
    puts "-----------------------------------------------------------------"
    puts "--                      saved config                           --"
    puts "-----------------------------------------------------------------"
    set APPMANAGER [$AdminControl queryNames type=ApplicationManager,node=QB125Node01,process=WPS001,*]
     
     
    puts "-----------------------------------------------------------------"
    puts "--                       Installing App                        --"
    puts "-----------------------------------------------------------------"
     
    $AdminApp install $EARDIR {-cluster WPSCluster -appname UWFE}
     
    puts "-----------------------------------------------------------------"
    puts "--                       Installed  App                        --"
    puts "-----------------------------------------------------------------"
     
    puts "-----------------------------------------------------------------"
    puts "--                      saveing config                         --"
    puts "-----------------------------------------------------------------"
    $AdminConfig save
     
    puts "-----------------------------------------------------------------"
    puts "--                      saved config                           --"
    puts "-----------------------------------------------------------------"
     
    puts "-----------------------------------------------------------------"
    puts "--            安装程序成功,下面等待项目启动,可能需要1分钟    --"
    puts "-----------------------------------------------------------------"
     
    uwfe250.jacl代码为
     
    puts "-------------------------------------------------------------------"
    puts "—开始执行jacl代码啦 --"
    puts "-------------------------------------------------------------------"
     
    #这是我们要发布的应用的存放路径
    set EARDIR /home/uwfe/UWFE_SOURCE/antbuild/target/ear/UWFE.ear
    #这是我们要发布的应用的名称
    set APPNAME UWFE
    set NODE [$AdminControl getNode]
    #简单的理解,取得当前的上下文
    puts "-----------------------------------------------------------------"
    puts "--                      stoping App                            --"
    puts "-----------------------------------------------------------------"
    set APPMANAGER [$AdminControl queryNames type=ApplicationManager,node=$NODE,process=server1,*]
     
    $AdminControl invoke $APPMANAGER stopApplication UWFE
    puts "-----------------------------------------------------------------"
    puts "--                      stoped  App                            --"
    puts "-----------------------------------------------------------------"
     
    puts "-----------------------------------------------------------------"
    puts "--                      uninstalling  App                      --"
    puts "-----------------------------------------------------------------"
     
    $AdminApp uninstall UWFE
     
    puts "-----------------------------------------------------------------"
    puts "--                      uninstalled  App                       --"
    puts "-----------------------------------------------------------------"
     
     
    puts "-----------------------------------------------------------------"
    puts "--                      saveing config                         --"
    puts "-----------------------------------------------------------------"
    $AdminConfig save
     
    puts "-----------------------------------------------------------------"
    puts "--                      saved config                           --"
    puts "-----------------------------------------------------------------"
     
     
    puts "-----------------------------------------------------------------"
    puts "--                       Installing App                        --"
    puts "-----------------------------------------------------------------"
     
    $AdminApp install $EARDIR {-appname UWFE}
     
    puts "-----------------------------------------------------------------"
    puts "--                       Installed  App                        --"
    puts "-----------------------------------------------------------------"
     
    puts "-----------------------------------------------------------------"
    puts "--                      saveing config                         --"
    puts "-----------------------------------------------------------------"
    $AdminConfig save
     
    puts "-----------------------------------------------------------------"
    puts "--                      saved config                           --"
    puts "-----------------------------------------------------------------"
     
    puts "-----------------------------------------------------------------"
    puts "--              starting appliacation                          --"
    puts "-----------------------------------------------------------------"
     
    $AdminControl invoke $APPMANAGER startApplication UWFE
     
    puts "-----------------------------------------------------------------"
    puts "--              started  appliacation                          --"
    puts "-----------------------------------------------------------------"
    puts "-----------------------------------------------------------------"
    puts "--              10.9.132.250 程序成功启动                      --"
    puts "-----------------------------------------------------------------"
     
    startApp248.jacl代码
    puts "-----------------------------------------------------------------"
    puts "--              starting appliacation                          --"
    puts "-----------------------------------------------------------------"
     
    set APPMANAGER [$AdminControl queryNames type=ApplicationManager,node=QB125Node01,process=WPS001,*]
    $AdminControl invoke $APPMANAGER startApplication UWFE
    set APPMANAGER [$AdminControl queryNames type=ApplicationManager,node=QB125Node01,process=WPS002,*]
    $AdminControl invoke $APPMANAGER startApplication UWFE
    set APPMANAGER [$AdminControl queryNames type=ApplicationManager,node=QB126Node01,process=WPS001,*]
    $AdminControl invoke $APPMANAGER startApplication UWFE
    set APPMANAGER [$AdminControl queryNames type=ApplicationManager,node=QB126Node01,process=WPS002,*]
    $AdminControl invoke $APPMANAGER startApplication UWFE
     
    puts "-----------------------------------------------------------------"
    puts "--              started  appliacation                          --"
    puts "-----------------------------------------------------------------"
    puts "-----------------------------------------------------------------"
    puts "--              程序成功启动                                   --"
    puts "-----------------------------------------------------------------"
     
    这里在命令行执行ant 就可以啦,程序编译好了会自动更新服务器上面的应用的,是不是很爽呢。
     
    如需转载,请标明出处,尊重作者权利,http://www.chinacsharp.net  http://blog.csdn.net/keyboardsun author:keyboardsun@163.com
     
    展开全文
  • 可以通过shell终端管理websphere的应用程序的更新,起停等,有助于完成was服务器的自动化操作
  • WAS7更新war中部分文件

    2014-01-14 11:58:00
    之前更新应用一直是全部重新打包发布,有时仅仅更新部分文件,全部重新打包上传更新,即复杂又耗时。后发现was支持单个文件更新操作,具体操作步骤如下: 1、勾选要更新的应用后,选择“更新”操作; 2、...
  • 有时候我们需要在web.xml下注册的类或者初始化参数 在tomcat下更新是没有问题的,但是在WebSphereApplication Server下却没有效果,这是因为WebSphere Application Server 的应用程序跟部署配置是分离的, ...
  • 解决 was 更新web.xml 无效原因

    千次阅读 2016-12-16 18:56:36
    /opt/IBM/WebSphere/AppServer/profiles/j节点名/config/cells/AppSrv02cell/applications/应用/deployments/应用/WEB-INF web.xml、web_merged.xml 二:应用目录: 四个文件内容必须...
  • 事情是这样的,由于本集群上有多个应用,所以在更新应用时不...同时,在集群环境中,如果直接更新应用,会自动触发WAS集群中的App Server重启。所以我们更新应用的习惯是,先停止应用,再卸载,然后再部署新的...
  • 在确定了这种修复方案是切实可行之后分析,可能是配置的web.xml未生效,搜索网上对应问题及检查部署过程发现,部署完后应用目录WEB-INF下会新增很多文件,其中有个web_merged.xml文件(如下图)。  该文件包含了...
  • ·非集群环境要更新 WAS_HOME/config/cells/[unmi]/applications/[Prod_war.ear]/deployments/[Prod_war]/[Prod.war]/WEB-INF/ 中的 web.xml 文件 ·集群环境则,只是做了上一步,重启应用后确实有效果,但若要在 ...
  • 在日常的使用中,一个javaee程序部署以后,以后续的使用中会有模块等的更新,但我经常见到有人直接更新...修改后的文件因为不受was管理,在备份时仍然是旧的文件包,这样子在做服务器迁移时应用时出现许多意想不...
  • 从 Tomcat 再到使用 Webshpere Application Server (WAS) 不光金钱上付出太多...这里记述一个使用 WAS应用打补丁时遇到的问题--要更新哪一个 web.xml。  为便于描述,我们假设已在 WAS 下部署了一个名叫 Prod.w
  • ·非集群环境要更新 WAS_HOME/config/cells/[unmi]/applications/[Prod_war.ear]/deployments/[Prod_war]/[Prod.war]/WEB-INF/ 中的 web.xml 文件 ·集群环境则,只是做了上一步,重启应用后确实有效果,但若要在 ...
  • I am creating an MDM Server and have successfully completed all the steps and was able to install the profile on the device.In the .mobileconfig file which is installed on the device, we pass the SSL ...
  • 我们会将现有系统中所有的用户数据全量同步一次到ES,后面用户在系统中进行信息的更新会增量同步至ES,增量同步代码是用的单个新增/修改文档的方法,具体代码可参见《Rest Client方式集成Spring Boot应用》。...
  • 从 Tomcat 再到使用 Webshpere Application Server (WAS) 不光金钱上付出太...这里记述一个使用 WAS应用打补丁时遇到的问题--要更新哪一个 web.xml。 为便于描述,我们假设已在 WAS 下部署了一个名叫 Prod....
  • git 应用程序本身更新This article was peer reviewed by Haydar KÜLEKCİ and Wern Ancheta. Thanks to all of SitePoint’s peer reviewers for making SitePoint content the best it can be! 本文由HaydarKÜ...
  • 存档日期:2019年5月14日 | 上次更新时间:2017年7月18日 | 首次发布:2015年2月2日 IBM在2014年10月上旬将Watson服务引入了IBM Bluemix平台。本教程介绍了当前可用的服务和SDK,并描述了如何在Bluemix上使用...
  • <p>I see in the K8S dashboard that the config map is <strong>assigned to the application</strong> and when I change the value I see that the env was changed... <p><strong>update</strong></p> <p>when...
  • 在日常的使用中,一个javaee程序部署以后,以后续的使用中会有模块等的更新,但我经常见到有人直接更新服务器上的...修改后的文件因为不受was管理,在备份时仍然是旧的文件包,这样子在做服务器迁移时应用时出现许多...
  • 允许网络档案管理员更新配置并安排要提取的网络档案馆藏。 允许网络档案管理员监视获取工作流程的结果。 根据计划启动Web存档获取工作流。 维护Web存档集合的状态。 WAS Registrar App是的后继产品。 要求 Ruby...
  • 从 Tomcat 再到使用 Webshpere Application Server (WAS) 不光金钱上付出太...这里记述一个使用 WAS应用打补丁时遇到的问题--要更新哪一个 web.xml。 为便于描述,我们假设已在 WAS 下部署了一个名叫 Prod....
  • 类装入和更新检测(Class loading and update detection settings)菜单路径:Applications < Application Types < WebSphere enterprise applications < application_name < Class loading and update ...
  • by Syeda Aimen Batool ... Redux简介以及Redux应用程序中的状态更新方式 (An intro to Redux and how state is updated in a Redux application) I started learning Redux a few days back and it was an overw...

空空如也

空空如也

1 2 3 4 5 ... 9
收藏数 174
精华内容 69
关键字:

was更新应用