我正在开展一个涉及实时聊天(消息传递,包括群聊)的项目.
之前我曾经使用过websockets,所以我开始使用spring-websockets开始研究它,我做了一些关于实现它的最佳方法的阅读.然后我遇到了STOMP(作为websockets的子协议),因为在春天有直接支持STOMP,所以我很容易实现我应该做的事情.
但我的疑问是,就我的理解STOMP和XMPP是类似的协议(消息传递协议),但我找不到任何问题/博客,其中差异被解释,为什么有人会更喜欢一个?
如果有人解释这两个协议有何不同,那将会非常有用吗?
谢谢.
我正在使用Spring websockets(STOMP作为子协议)和Sockjs开发消息传递应用程序.
我应该提供支持来发送消息中的文件.
根据这张票,sockjs不支持二进制数据,但STOMP确实如此.
我知道我们可以将图像转换为base64并通过stomp发送它,但我认为这不是最好的做法,因为有很多转换和开销.此外,我必须保存消息,所以要再次在服务器上保存这个base64编码文件我将不得不解码它们.
我有几个问题:
1)是否有通过sockjs + stomp发送图像/文件或转换为Base64的解决方法是唯一的方法?
2)这可能是一个非常愚蠢的问题,但根据这个问题,可以通过STOMP发送二进制数据(没有sockjs).没有sockjs支持后备有多难?
谢谢.
编辑:如果使用base64是唯一的选择,我宁愿发出POST请求来保存具有附件的消息,而不是使用base64编码.任何更好的想法?
Java中的以下代码返回-1.我认为它应该返回3.
int[] array = {1,2,3,4,5,6};
System.out.println(Arrays.asList(array).indexOf(4));
Run Code Online (Sandbox Code Playgroud)
你能帮我理解这个功能是如何工作的吗?
谢谢
我们有一个正在使用的应用程序spring-security-oauth2:1.0
.我试图将其更改为更新版本spring-security-oauth2:2.0.7.RELEASE
.一些类被删除,一些包结构被更改,我设法整理所有这些东西,我能够没有任何问题启动服务器.但我在这里遇到一个奇怪的问题.
随着OAuth2 - 1.0 version
,当我们在用户登录使用做了GET
要求/oauth/token
,例如:
它以前工作得很好.
当我尝试同样的事情时,首先GET
由于TokenEndPoint.java中的逻辑,我无法提出请求
private Set<HttpMethod> allowedRequestMethods = new HashSet<HttpMethod>(Arrays.asList(HttpMethod.POST));
@RequestMapping(value = "/oauth/token", method=RequestMethod.GET)
public ResponseEntity<OAuth2AccessToken> getAccessToken(Principal principal, @RequestParam
Map<String, String> parameters) throws HttpRequestMethodNotSupportedException {
if (!allowedRequestMethods.contains(HttpMethod.GET)) {
throw new HttpRequestMethodNotSupportedException("GET");
}
return postAccessToken(principal, parameters);
}
Run Code Online (Sandbox Code Playgroud)
我试图POST
提出与上述URL相同的请求,但我收到InsufficientAuthenticationException
了错误消息
没有客户端身份验证.尝试添加适当的身份验证筛选器
这是因为下面的POST
请求控制器TokenEndpoint.java
.当我调试时,我看到它principal
是null.
@RequestMapping(value = "/oauth/token", method=RequestMethod.POST)
public …
Run Code Online (Sandbox Code Playgroud) 我正在为我的应用程序使用spring boot,我正在使用默认的spring boot logging.
在我application.properties
,我添加了文件路径logging.file
,
logging.file= ${logger_path}
Run Code Online (Sandbox Code Playgroud)
和我的pom.xml
包含
<logger_path>/tmp/app.log</logger_path>
Run Code Online (Sandbox Code Playgroud)
当我启动应用程序时,它会将日志消息打印到文件中/tmp/app.log
,但问题是它还会在控制台上打印日志消息.我真的不明白为什么它在控制台上打印(虽然它是将它们打印到指定的文件)当我指定了一个log file
.
是否有任何配置可以防止spring boot将日志消息打印到控制台?
我想我对春豆的理解有点过时了.
我正在研究我的项目,我正在考虑这种情况.
说我上课了 Foo
class Foo(){
public void doSomething(Object a , Object b){ // input parameters does not matter actually.
//do something
}
}
Run Code Online (Sandbox Code Playgroud)
如果我在另一个类中使用此类,如:
class Scheduler{
....
@Autowired
private Foo foo;
someMethod(){
foo.doSomeThind(a,b);
}
....
}
Run Code Online (Sandbox Code Playgroud)
在上面的情况下Foo
,我可以使doSomeThing
静态和直接使用而不是自动装配Foo.doSomeThing(a,b)
我只是想知道创建一个bean是否有任何优势,或者是否有使用这样的静态方法的任何缺点?
如果它们是相同的,我什么时候应该使用spring bean?何时应该使用静态方法?
我在AsyncTask中进行网络调用,但我面临的问题是启动doInBackground方法所花费的时间.
这是我的代码的一部分:
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Log.d("Temp:",System.currentTimeMillis()+"");
new Move().execute();
/*some other logic
}
}
Run Code Online (Sandbox Code Playgroud)
我的AsyncTask是:
private class Move extends AsyncTask<Void, Void, Void> {
@Override
protected Void doInBackground(Void... temp) {
Log.d("start:",System.currentTimeMillis()+"");
gson.fromJson(Web.Request.get(some_URL),Void.class);
Log.d("end:",System.currentTimeMillis()+"");
return null;
}
}
Run Code Online (Sandbox Code Playgroud)
这些是我得到的日志:
32658-998/com.example.game D/temp:? 1408923006159
32658-998/com.example.game D/start:? 1408923035163
32658-998/com.example.game D/end:? 1408923035199
Run Code Online (Sandbox Code Playgroud)
实际上,在doInBackground方法中到达第一行几乎需要29秒,因为完成网络调用只花了36毫秒.我尝试了很多次,所用的时间几乎是一样的.
是否可以立即启动AsyncTask?或者有没有其他方法来解决这个问题.(除了运行一个简单的线程?)谢谢:)
在我的应用程序中,我需要一组值,并且需要检查Redis 中的一组值中存在多少个值。
为了简单起见,我想做的是:
> Sadd myset field1
(integer) 1
> Sadd myset field2
(integer) 1
> Sadd myset field4
(integer) 1
> Sismember myset field1 field4 // which is not possible as of now.
Run Code Online (Sandbox Code Playgroud)
由于我无法为 提供多个参数SISMEMBER
,因此我可能必须多次调用 redis,这非常耗时。
我正在考虑类似的替代方案pipelining
,但后来我认为这将是实现它的一个很好的(hacky)方式:
> Hset myhash field1 "true"
(integer) 0
> Hset myhash field2 "true"
(integer) 0
> Hset myhash field4 "true"
(integer) 1
> Hmget myhash field1 field2 field3
1) "true"
2) "true"
3) (nil)
> Hmget myhash …
Run Code Online (Sandbox Code Playgroud) 我想在Java 8 中做到这一点
我有一个Boolean
列表和另一个Object
列表,这两个列表的大小总是相同的。我想从object
列表中删除所有元素,这些元素在列表false
中的相应索引处boolean
。
我将尝试用一个例子来解释:
objectList = {obj1,obj2,obj3,obj4,obj5};
booleanList = {TRUE,FALSE,TRUE,TRUE,FALSE};
Run Code Online (Sandbox Code Playgroud)
所以从这些列表中,我想更改objectList
为
{obj1,obj3,obj4}// obj2 and obj5 are removed because corresponding indices are `FALSE` in `booleanList`.
Run Code Online (Sandbox Code Playgroud)
如果我已经这样做了Java 7
,我会做以下事情:
List<Object> newlist = new ArrayList<>();
for(int i=0;i<booleanList.size();i++){
if(booleanList.get(i)){
newList.add(objectList.get(i));
}
}
return newList;
Run Code Online (Sandbox Code Playgroud)
有没有办法Java 8
用更少的代码来做到这一点?
我有一个文件,database.properties
其中有
password = something
Run Code Online (Sandbox Code Playgroud)
因此,每当我必须测试某些东西时,我必须将此行更改为我的本地密码.团队中的每个人都有自己的本地密码.
我想我将不得不做以下其中一项:
每次我提交我都不应该添加database.properties
索引(我不想要ignore
这个文件),但是当文件太多时很容易错过这个文件.
在提交之前撤消更改,但大多数时候我忘记这样做.
创建个人资料可能是实现这一目标的一种方式,但即使会有类似的问题database.properties
.
我已经检查了可以git忽略一个特定的行吗?以及如何告诉git忽略单独的行,即特定行代码的gitignore.
从暂时忽略文件,我看到我们可以做到
git update-index --assume-unchanged <file>
Run Code Online (Sandbox Code Playgroud)
但我每次都要这样做.
所有上述参考文献在3 - 4年之前被提出/写入.所以我只想知道如果有更好的方法可以忽略这一行.
编辑
按照@ VonC的回答,我试图添加一个过滤器 .git/info/.gitattribute
{directory_path}/database.properties filter=password // I have given the correct directory path.
Run Code Online (Sandbox Code Playgroud)
我已添加smudge
和clean
脚本为:
git config --global filter.password.smudge ~/smudge.sh
git config --global filter.password.clean ~/clean.sh
Run Code Online (Sandbox Code Playgroud)
(当我运行~/smudge.sh
并且~/clean.sh
它password= something
正确替换了行.所以脚本是正确的.)
但是当我添加/提交时database.properties
,似乎对database.properties
文件没有任何影响.(我猜我~/clean.sh
应该在将其添加到索引时运行)
我究竟做错了什么?
我试图通过SockJS在STOMP的Spring websockets中发送错误消息.
我基本上试图实现这里正在做的事情.
这是我的异常处理程序
@MessageExceptionHandler
@SendToUser(value = "/queue/error",broadcast = false)
public ApplicationError handleException(Exception message) throws ApplicationError {
return new ApplicationError("test");
}
Run Code Online (Sandbox Code Playgroud)
而且我订阅了
stompClient.subscribe('/user/queue/error', stompErrorCallback, {token: accessToken});
Run Code Online (Sandbox Code Playgroud)
在我的情况下,用户未经过身份验证,但是从此处开始
虽然用户目的地通常意味着经过身份验证的用户,但并不严格要求.与经过身份验证的用户无关的WebSocket会话可以订阅用户目标.在这种情况下,@ SendToUser注释的行为与broadcast = false完全相同,即仅针对发送正在处理的消息的会话.
当我抛出这个错误时,所有这一切都正常,myHandler
这是我在websocket config中定义的Websocket Handler.
我有一个ClientInboundChannelInterceptor
扩展ChannelInterceptorAdapter
,它拦截所有的消息preSend
.
如果这个拦截器有任何异常,我想把它扔回发送此消息的用户会话,
public class ClientInboundChannelInterceptor extends ChannelInterceptorAdapter {
@Autowired
@Lazy(value = true)
@Qualifier("brokerMessagingTemplate")
private SimpMessagingTemplate simpMessagingTemplate;
@Override
public Message<?> preSend(Message message, MessageChannel channel) throws IllegalArgumentException{
if(some thing goes wrong)
throw new RuntimeException();
}
@MessageExceptionHandler
@SendToUser(value …
Run Code Online (Sandbox Code Playgroud) 我们有一个正在使用的应用程序spring-security-oauth2:1.0
.我试图将其更改为更新版本spring-security-oauth2:2.0.7.RELEASE
.如果我没有指定scope
或如果我指定我单一范围,应用程序工作正常.我在请求多个范围时遇到问题,这些范围read,write
曾经在以前的版本中工作过.
我请求的客户端拥有所有read,write and trust
权限.
当我使用时spring-security-oauth2:1.0
,为了得到一个令牌我曾经做过像这样的来电
如果您看到scope参数scope=read,write
,通过请求这种方式,我曾经获得一个带范围的令牌read and write
.
如果我尝试使用Oauth2版本做同样的事情2.0.7.RELEASE
(POST
尽管有请求),我会得到Invalid Scope
例外,因为它tokenRequest
是read,write
作为单个范围.我请求的客户端具有read,write and trust
权限,但read,write
不是其中之一.
如果我尝试使用scope=write
或scope=read
,它工作正常,因为read
或是write
客户范围的一部分.
如果我想申请多个范围OAuth2 2.0.7.RELEASE
,我该怎么做?
java ×6
spring ×4
stomp ×3
access-token ×1
android ×1
arrays ×1
git ×1
java-8 ×1
javascript ×1
redis ×1
sockjs ×1
spring-bean ×1
spring-boot ×1
xmpp ×1