我们正在Haskell (HMB)中编写消息代理.因此,在从socket(Network.Socket)接收消息后,必须解析消息(Data.Binary).到目前为止,我们一直在测试环回(localhost) - 用于生成和解析消息.这很安静.如果我们通过从另一台机器生成消息进行基准测试,那么我们就会遇到问题:突然,解析器没有足够的字节来解析.
每个消息的前4个字节定义消息的长度,从而描述要解析的消息.如上所述,我们使用Data.Binary进行解析 - 所以这是懒惰的.出于测试目的,我们使用谷物库将前4个字节的解析切换为严格.这同样的问题.我们现在甚至试图用谷物完全解析请求,问题也仍然存在.
在代码中,您将看到我们进行线程化.但是,我们也尝试了没有通道(单线程设置),但这也没有解决问题.
下面是代码(Thread1)的一部分,其中接收的字节被写入要进一步使用/解析的通道.(如前所述,如果省略通道并直接解析输入,则没有任何变化):
runConnection :: (Socket, SockAddr) -> RequestChan -> Bool -> IO()
runConnection conn chan False = return ()
runConnection conn chan True = do
r <- recvFromSock conn
case (r) of
Left e -> do
handleSocketError conn e
runConnection conn chan False
Right input -> do
threadDelay 5000 -- THIS FIXES THE PROBLEM!?
writeToReqChan conn chan input
runConnection conn chan True
Run Code Online (Sandbox Code Playgroud)
这是输入被解析的部分(Thread2):
runApiHandler …Run Code Online (Sandbox Code Playgroud) 我尝试在SonataAdminBundle表单中设置当前经过身份验证的用户:
protected function configureFormFields(FormMapper $formMapper)
{
$formMapper
->add('title')
->add('content')
->add('slug')
//->add('user')
;
}
Run Code Online (Sandbox Code Playgroud)
由于我不希望用户选择/选择自己的用户,因此我想在用户发送表单(没有任何用户对象)的过程中设置用户名。(注意:我想以几种形式使用它,所以我需要一个通用的解决方案。)
我现在做的是在阅读以下内容后设置EventListener:http : //symfony.com/doc/current/cookbook/service_container/event_listener.html
class PostListener
{
protected $container;
public function __construct(ContainerInterface $container)
{
$this->container = $container;
}
public function prePersist(LifeCycleEventArgs $args)
{
$entity = $args->getEntity();
//Get user
$securityContext = $this->container->get('security.context');
$user = $securityContext->getToken()->getUser();
//Set authenticated user as autor
$entity->setUser($user);
}
}
Run Code Online (Sandbox Code Playgroud)
包括服务:
post.listener:
class: Backender\BlogBundle\Listener\PostListener
calls:
- [ setContainer, [ @service_container ] ]
tags:
- { name: doctrine.event_listener, event: prePersist }
Run Code Online (Sandbox Code Playgroud)
现在不确定这是否正确,因为我不想在要设置用户的地方指定表单。(这个人想在每个表格上设置用户吗?)
经过更多研究,似乎我必须使用这样的事件订阅服务器:http ://symfony.com/doc/2.0/cookbook/form/dynamic_form_generation.html在此示例中,他们使用FormEvents …