小编Joh*_*tle的帖子

Grails 2.4.4:如何在复杂的服务方法中可靠地回滚

请考虑以下服务(默认情况下为事务性).玩家必须始终拥有一个帐户.没有至少一个相应帐户的玩家是错误状态.

class playerService {
   def createPlayer() {
      Player p new Player(name: "Stephen King")
      if (!p.save()) {
         return [code: -1, errors:p.errors]
      }
      Account a = new Account(type: "cash")
      if (!a.save()) {
         // rollback p !
         return [code: -2, errors:a.errors]
      }
      // commit only now!
      return [code: 0, player:p] 
   }
 }
Run Code Online (Sandbox Code Playgroud)

我已经看过经验丰富的Grails开发人员的这种模式,当我告诉他们如果播放器的帐户创建因任何原因失败时,它不会回滚播放器,并且会使DB处于无效状态,他们会像我一样看着我我很生气,因为grails处理回滚玩家因为服务交易正确吗?

那么,作为一个SQL人,我寻找一种在grails中调用回滚的方法.没有一个.根据各种帖子,只有两种方法可以强制grails在服务中回滚:

  1. 抛出未经检查的异常.你知道这是对的吗?
  2. 不要使用服务方法或事务注释,请使用此构造:

.

DomainObject.withTransaction {status ->
     //stuff
     if (someError) {
        status.setRollbackOnly()
     }
}
Run Code Online (Sandbox Code Playgroud)

1.抛出未经检查的异常


1.1因此,我们必须抛出运行时异常以进行回滚.这对我来说是好的(我喜欢例外),但是这不会与我们拥有的grails开发人员凝聚在一起,他们将异常视为对Java的回归而且是不酷的.这也意味着我们必须改变应用程序当前使用其服务层的整个方式.

1.2如果抛出异常,则会丢失p.errors - 您将丢失验证详细信息.

1.3我们的新grails devs不知道unchecked和checked异常之间的区别,也不知道如何区分.这真的很危险.

1.4.使用.save(failOnError:true)我很喜欢使用它,但它并不适合所有地方.有时您需要在进一步检查之前检查原因,而不是抛出异常.它可以生成的异常是否始终检查,始终未选中,或者是否?即无论是什么原因导致failOnError AWLAYS回滚?没有人问我知道答案,这是令人不安的,他们使用盲目的信念来避免损坏/不一致的数据库.

1.5如果控制器调用服务A,调用服务B,然后调用服务C,会发生什么情况.服务A必须捕获任何异常并将格式良好的返回值返回给控制器.如果Service C抛出一个由服务A捕获的异常,那么将回滚服务Bs事务吗?这对于知道能够构建工作应用程序至关重要.

更新1:完成一些测试后,任何运行时异常,即使抛出并捕获到一些不相关的子调用,也会导致父进程中的所有内容都回滚.但是,在父会话中知道这种回滚已经发生并不容易 - 你需要确保如果你发现任何异常,你要么重新抛出,要么将一些通知传回给调用者以表明它已经失败了一种方式,其他一切将被回滚.

2. withTransaction …

grails exception rollback

10
推荐指数
1
解决办法
2360
查看次数

Azure 应用服务部署失败并显示错误:“凭据”不能为空

我有一个门户帐户和一个开发帐户。两者碰巧使用相同的登录名/密码。

在portal.azure.com 中,我有一个正在运行的Web 服务。在Web服务“部署-部署中心”下,我选择azure repos、azure pipelines作为构建提供者,设置master分支等。

它在我的 devlops 中创建了一个有效的管道,即它执行 NuGet 恢复、构建解决方案、测试程序集、发布符号路径、发布工件。

伟大的。

但它没有部署新版本。

单击 devops 中管道中的“发布”,它尝试使用“Azure Web 应用程序部署”并给出 msbuild 未使用正确格式或类似格式的错误。所以我将其更改为“Azure App Service Deploy”。

现在我收到一个新错误:错误:“凭据”不能为空。

没有凭据字段。

它正在使用发布配置文件。

我有什么想法可以解决这个问题吗?

这是有问题的任务:

在此输入图像描述

没有选项可以配置丢失的凭据?

如果我转到门户,查看“部署中心”,我会看到以下内容:

在此输入图像描述

如果我单击“部署凭据”,我会看到以下内容:

在此输入图像描述

一切看起来都不错。

知道“空”凭据从何而来吗?

azure azure-web-app-service azure-devops

8
推荐指数
1
解决办法
6201
查看次数

Azure DevOps,利益相关者和基本用户有什么区别,如何选择?

将用户添加到 Azure DevOps 时,必须选择该用户是基本用户还是利益相关者。

使用devops的用户只有三类:

  1. 开发商
  2. 管理员
  3. 开发运营

您如何将利益相关者和基础映射到这些?

人们可以假设利益相关者 = 管理员,基本 = 开发人员,但文档似乎指出利益相关者拥有较少的权限。

文档说

利益相关者是可以免费但有限地访问 Azure DevOps 特性和功能的用户。通过利益相关者访问权限,您可以添加和修改工作项、管理构建和发布管道以及查看仪表板。

这并没有什么帮助。利益相关者是开发商吗?如果不是,他们是谁?利益相关者 = 不使用 git 或不知道管道是什么的非技术经理吗?在这种情况下,为什么他们可以访问技术含量高且只有高级开发人员才能接触的管道?

谁能解释一下这两种用户类型,以及我们如何知道选择哪一种以及何时选择?

azure-devops

8
推荐指数
1
解决办法
2万
查看次数

防止JavaScript在大循环上锁定浏览器

我有一个循环,需要在浏览器中运行2亿次.这是一个模拟器,几个人需要定期使用.运行大约需要15分钟,但在此期间,浏览器会经常弹出"此脚本耗时太长"等警告,并在功能期间完全挂起Firefox.这也意味着页面不会更新我的状态指示器(这只是一个数字).

我用google搜索"javascript yield"并阅读前4页的点击量.有些人讨论了一个新的"yield"关键字,但是只有一个描述和示例,我觉得这是不可理解的,例如"包含yield关键字的函数是一个生成器.当你调用它时,它的形式参数绑定到实际的参数,但是它的身体实际上没有被评估".是否yield屈服于UI?

我找到的为数不多的解决方案之一就是这个旧帖子,它使用不赞成的被调用者参数和一个计时器来调用自己:http: //www.julienlecomte.net/blog/2007/10/28/

但是,上面的例子不包含任何循环变量或状态,当我添加它们时它会分崩离析,我的净结果总是为零.

它也没有进行分块,但是我发现了一些其他的例子,它们在每次迭代时使用"index%100 == 0".然而,这似乎是一种缓慢的做法.例如:

如何阻止激烈的Javascript循环冻结浏览器

但它没有任何方式来更新进度,也没有屈服于UI(因此仍然挂起浏览器).这是一个在执行期间挂起浏览器的测试版本:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<script>
var spins = 1000000
var chunkSize = 1000;
var chunk;
function Stats() {this.a=0};
var stats = new Stats();               
var big;

var index = 0;

var process = function() {
  for (; index < spins; index++) {
    stats.a++;
    big = (big/3.6)+ big * 1.3 * big / 2.1;
    console.write(big);
    // Perform xml processing
    if …
Run Code Online (Sandbox Code Playgroud)

javascript user-interface

7
推荐指数
1
解决办法
5896
查看次数

grails 2.5:当使用多个数据源时,"另一个未命名的CacheManager已存在于同一个VM中"

使用Grails 2.5的开箱即用安装和一个干净的默认配置,添加第二个数据源总是在尝试启动应用程序时提供此异常.这曾经与grails 2.3.x没有问题

DataSource.groovy:

environments {
  development {
    dataSource {
        dbCreate = "update"
        url = "jdbc:mysql://127.0.0.1:3306/myapp"
        username = "myuser"
        password = "mypass"
    }

    dataSource_report {
       url = "jdbc:mysql://127.0.0.1:3306/myapp_reporting"
       username = "someuser"
       password = "somepass"
    }
}
Run Code Online (Sandbox Code Playgroud)

两个数据库都存在,如果只定义了一个数据源,则可以连接到这两个数据库.

BuildConfig.groovy,所有的东西都是默认的(我假设),包括:

plugins {
    build ":tomcat:7.0.55"

    compile ":scaffolding:2.1.2"
    compile ':cache:1.1.8'
    compile ":asset-pipeline:2.1.1"
    compile ":spring-security-core:2.0-RC4"
    compile ":quartz:1.0.2"

    runtime ":hibernate4:4.3.8.1" // or ":hibernate:3.6.10.18"
    runtime ":database-migration:1.4.0"
    runtime ":cors:1.1.6"
}
Run Code Online (Sandbox Code Playgroud)

有很多帖子都有这个错误,但它们似乎是因为作者试图使用非标准版本或缓存.

还尝试将此添加到Config.groovy,根据这篇文章:https://github.com/grails/grails-core/releases/tag/v2.5.0

beans {
    cacheManager {
        shared = true
    }
}
Run Code Online (Sandbox Code Playgroud)

不幸的是,这没有帮助. …

grails datasource ehcache

7
推荐指数
1
解决办法
2085
查看次数

詹金斯现在需要SVN的"领域".你怎么找到它,应该输入什么?

我们有詹金斯设置和完美工作.然后我们升级了SVN模块,现在它因"修订检查失败"而失败了.因此,一个构建将正确检查所有更改,然后失败并出现此错误,然后下一个构建工作.

我们使用指向一个repo的子目录的外部.没有实际的"外部"回购.

根据此错误报告:https://issues.jenkins-ci.org/browse/JENKINS-21785 解决方案是创建一个额外的"附加凭据",复制已经有效的全局凭据.问题是这需要一个领域.我们不知道这个领域是什么.我们使用assembla.com.

建议的方法是运行:

svn --no-auth-cache --config-dir invalid info proto://host:port/path/to/repo
Run Code Online (Sandbox Code Playgroud)

在我们的例子中是:

svn --no-auth-cache --config-dir invalid info https://subversion.assembla.com/svn/ourrepo/
Run Code Online (Sandbox Code Playgroud)

这将返回以下信息:

Path: ourproject
URL: https://subversion.assembla.com/svn/ourrepo
Relative URL: ^/
Repository Root: https://subversion.assembla.com/svn/ourrepo
Repository UUID: 26850efa-2baa-4381-9140-fb0xxxxxxxxx
Revision: 1755
Node Kind: directory
Last Changed Author: me
Last Changed Rev: 1755
Last Changed Date: 2015-12-10 15:23:10 +0100 (Thu, 10 Dec 2015)
Run Code Online (Sandbox Code Playgroud)

没有领域信息.

现在有趣的是,如果您尝试进行结账并输入错误的密码,您收到的消息是:

Authentication realm: <https://subversion.assembla.com:443> Assembla Restricted
Run Code Online (Sandbox Code Playgroud)

现在我们假设字符串"Assembla Restricted"不能作为领域,因为它包含空格.麻烦的是,我们不知道我们在寻找什么.它是一个字符串?这是一个URL吗?我们尝试了:

<https://subversion.assembla.com:443> Assembla Restricted
Run Code Online (Sandbox Code Playgroud)

Assembla Restricted
Run Code Online (Sandbox Code Playgroud)

" https://subversion.assembla.com:443 "

作为领域,但这些都没有用

svn jenkins

7
推荐指数
2
解决办法
8208
查看次数

Xcode 11“iphone 很忙:让 iphone 为开发做好准备”

我已经等了两天了,xcode“设备和模拟器”窗口仍然挂着消息“myiphone 正忙:让 myiphone 准备好开发”。

  1. 我之前已经多次将这款手机连接到 Xcode 并上传应用程序
  2. 我最近没有更新ios和macos

我尝试过常见的嫌疑:

  1. 等待。到目前为止已经5个小时了。
  2. 断开手机,重启xcode
  3. 重新启动手机。
  4. 重新启动Mac
  5. 在通用设备管理下进行检查,没有什么新内容。

版本:

  • Xcode 11.2
  • 2017 mb pro 512 四核。16 GB
  • mac 10.14.4(由于需要 32 位驱动程序,我永远无法升级到此以上)。
  • ios 13.3.1
  • iPhone 存储空间:已使用 51GB 或 64GB。

我还经常遇到这样的问题:当我连接 iPhone 时,设备管理器显示其已锁定,但实际上并未锁定。在这种情况下,我断开设备,重新启动 xcode,在 xcode 运行时重新连接设备,这解决了这个常见问题。

ios

7
推荐指数
2
解决办法
6392
查看次数

git pull,忽略深度,如何不拉取整个历史记录?

我们有一个巨大的多 GB git 存储库,主要是二进制对象。

克隆需要几天时间。

实际的主分支(没有历史记录)只有大约 20MB,所以我想,深度为 1 的 git 克隆是解决问题的方法。

然而,现在我需要将某人的更新拉到主服务器(我们没有分支),当我拉时,没有深度选项/参数,所以它下载了全部 2GB。

有没有办法只拉master而不拉历史?

我是 git noob(我只使用乌龟 git),但我是 SVN、CVS 等方面的专家。

注1:我们曾经使用SVN,它没有这样的问题,但我们相当非技术的IT总监认为将git强加给整个公司会很好,即使是那些主要使用二进制媒体、flash、js等的公司。

注2:我看到这篇文章:Pull update with git after cloned with --depth 1但我不明白它。

git

6
推荐指数
0
解决办法
456
查看次数

控制器(用于休息api)的Grails集成测试不起作用

Grails 2.4.4.我们有很多JSON/REST API端点,如下所示,但代码更多(注意:我们不能使用RestfulController,因为我们有SpringSecurity而且它们不兼容)

例如

class SessionController 
def sessionService
static namespace = 'v1'
static allowedMethods = [loginPlayer: "POST"]

def loginPlayer()  {
    def payload = request.JSON

    try {
        // Check params are there.
        if (payload.user == null) {
            render(status: 422, contentType: 'application/json') {
                 [
                  'result'     : -1
                  'description': "missing params"
                 ]
            return
        }

        def result = sessionService.loginPlayer(
                    payload.user,
                    payload.password
            )

        if (result.returnCode == 0) {
                render(status: 200, contentType: 'application/json') {
                    [
                      'result' : 0
                      'authToken' : result.authToken
       etc.
Run Code Online (Sandbox Code Playgroud)

我们目前正在使用SOAPUI手动测试它们.我们迫切希望自动化集成测试能够针对数据库测试整个API的端到端.

我们试过这个:

class SessionControllerIntegrationSpec …
Run Code Online (Sandbox Code Playgroud)

rest grails integration-testing

6
推荐指数
0
解决办法
2106
查看次数

jmeter 无法运行!无法找到 Java 可执行文件或版本。请检查您的 Java 安装”

我从官方 java 下载页面https://java.com/en/download/win10.jsp安装了 java

它在我的 64 位系统上安装了似乎是 32 位的,我只能猜测是可以的,因为它没有提供任何其他选项。

我编辑了我的系统环境变量,并添加了 JAVA_HOME 并将 %JAVA_HOME%\bin 添加到我的“用户变量”路径定义中。

在 cmd 窗口中输入“set”会产生:

JAVA_HOME=C:\Program Files (x86)\Java\jre1.8.0_151
:
Path=C:\ProgramData\Oracle\Java\javapath;C:\Program Files (x86)\Intel\iCLS Client\;C:\Program Files\Intel\iCLS Client\;C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem;.....C:\Program Files (x86)\Java\jre1.8.0_151\bin;
Run Code Online (Sandbox Code Playgroud)

在命令提示符下,“java -version”

产生:

java version "1.8.0_151"
Java(TM) SE Runtime Environment (build 1.8.0_151-b12)
Java HotSpot(TM) Client VM (build 25.151-b12, mixed mode)
Run Code Online (Sandbox Code Playgroud)

但是当我尝试启动 jmeter.bat 时,我得到:

jmeter 无法运行!无法找到 Java 可执行文件或版本。请检查您的 Java 安装”

有任何想法吗?

java jmeter

6
推荐指数
2
解决办法
3万
查看次数